change group system id as extra data
[apps/home/phone-contacts.git] / lib / list / ct-group-view.c
1 /*
2  * Copyright 2012 Samsung Electronics Co., Ltd
3  *
4  * Licensed under the Flora License, Version 1.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://floralicense.org/license/
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17
18 #include <app.h>
19 #include <vconf.h>
20 #include <vconf-keys.h>
21 #include <fcntl.h>
22 #include <app_service.h>
23 #include <Ecore_X.h>
24 #include <ui-gadget-module.h>
25 #include <account.h>
26 #include "phone.h"
27 #include "ct-list.h"
28 #include "ct-group.h"
29 #include "ct-list-utils.h"
30 #include "ct-list-contact-view.h"
31
32 #define KEY_GROUP_DATA "cgroup_d"
33
34 enum {
35         GROUP_MODE_NORMAL,
36         GROUP_MODE_EDIT,
37 };
38
39 typedef struct {
40         Evas_Object *win;
41         Evas_Object *navi;
42         Evas_Object *layout;
43         Evas_Object *popup;
44         Evas_Object *gengrid;
45         Ecore_Timer *update_timer;
46         Ecore_Timer *waiting_timer;
47         Evas_Object *ctrl_button;
48         Evas_Object *delete_button;
49         Elm_Object_Item *navi_item;
50         Elm_Theme *th;
51         bool is_background;
52         int count;
53         int ug_request;
54         int ug_cnt_max;
55         int group_mode;
56         void *ug;
57         void *child_ug;
58         void *crop_ug;
59         void *src_ug;
60         char *ug_data;
61         bool need_update;
62 } ct_group_data;
63
64 enum GROUP_ITC_TYPE{
65         GROUP_ITC_1IMAGE,
66         GROUP_ITC_2IMAGE,
67         GROUP_ITC_3IMAGE,
68         GROUP_ITC_6IMAGE,
69         GROUP_ITC_GROUP_TITLE,
70         GROUP_ITC_MAX,
71 };
72
73 static Elm_Gengrid_Item_Class group_itcs[] = {
74         {.item_style="groupitem.1image"},
75         {.item_style="groupitem.2image"},
76         {.item_style="groupitem.3image"},
77         {.item_style="groupitem.6image"},
78         {.item_style="group_index"},
79 };
80
81
82 static Eina_Bool group_changed(void *user_data);
83
84 static void group_gl_del(void *data, Evas_Object *obj)
85 {
86         int i;
87         ct_group_list *info = data;
88         p_retm_if(NULL == info, "data is NULL");
89
90         for (i=0;i<6;i++)
91                 free(info->img_list[i]);
92         free(info->img);
93         free(info->name);
94         free(info);
95 }
96
97 static char* group_gl_label_get(void *data, Evas_Object *obj, const char *part)
98 {
99         char buf[PH_TEXT_MAX_LEN];
100         ct_group_list *info = data;
101         ct_group_data *cgroup_d;
102
103         p_retvm_if(NULL == data, NULL, "The parameter(data) is NULL");
104
105         cgroup_d = evas_object_data_get(obj, KEY_GROUP_DATA);
106         p_retvm_if(NULL == cgroup_d, NULL, "evas_object_data_get() return NULL");
107
108         if ((0 == strcmp(part, "text.name") && cgroup_d->group_mode == GROUP_MODE_NORMAL) ||
109                         (0 == strcmp(part, "text.edit.name") && cgroup_d->group_mode == GROUP_MODE_EDIT)) {
110                 if (info->name)
111                         return strdup(info->name);
112                 else
113                         return strdup("Noname");
114         }
115         else if ((0 == strcmp(part, "text.count") && cgroup_d->group_mode == GROUP_MODE_NORMAL) ||
116                         (0 == strcmp(part, "text.edit.count") && cgroup_d->group_mode == GROUP_MODE_EDIT)) {
117                 snprintf(buf, sizeof(buf), "%d", info->count);
118                 return strdup(buf);
119         }
120         return NULL;
121 }
122
123 static char* group_gl_index_label_get(void *data, Evas_Object *obj, const char *part)
124 {
125         PH_FN_CALL;
126         char* title = data;
127
128         if (title && *title)
129                 return strdup((const char *)data);
130
131         return NULL;
132 }
133
134 static void group_popup_hide_cb(void *data, Evas_Object *obj, void *event_info)
135 {
136         Evas_Object *icon;
137         Evas_Object *btn;
138         ct_group_data *cgroup_d = data;
139         btn = evas_object_data_get(obj, "expand_btn");
140         if (btn)
141         {
142                 icon = elm_object_part_content_get(btn, "icon");
143                 elm_icon_file_set(icon, CTUI_IMG_ICON_EXPAND_OPENED, NULL);
144                 elm_object_part_content_set(btn, "icon", icon);
145         }
146         evas_object_del(cgroup_d->popup);
147         cgroup_d->popup = NULL;
148 }
149
150 static void group_destroy_child_ug(void *data)
151 {
152         ct_group_data *cgroup_d = data;
153         cgroup_d->child_ug = NULL;
154 }
155
156 API void phone_group_message_result_cb(void *data, int *list, int cnt)
157 {
158         service_h service;
159         ui_gadget_h ug;
160         struct ug_cbs cbs = {0};
161         struct ug_priv_data *priv_data;
162         ct_group_data *cgroup_d = data;
163         char buf[PH_TEXT_MAX_LEN] = {'\0'};
164         char temp[PH_TEXT_MAX_LEN+1] = {'\0'};
165         int ret,i;
166         contacts_record_h number_record = NULL;
167         char *number;
168
169         p_retm_if(NULL == cgroup_d, "parameter(cgroup_d) is NULL");
170         p_retm_if(0 == cnt || NULL == list, "parameter(list) is NULL");
171
172         priv_data = calloc(1, sizeof(struct ug_priv_data));
173         p_retm_if(NULL == priv_data, "calloc is failed");
174
175         priv_data->destroy_cb = group_destroy_child_ug;
176         priv_data->cb_param = cgroup_d;
177
178         service_create(&service);
179
180         for(i = 0; i < cnt; i++){
181                 ret = contacts_db_get_record(_contacts_number._uri,list[i],&number_record);
182                 if(CONTACTS_ERROR_NONE != ret) {
183                         ERR("contacts_db_get_record() Failed(%d)", ret);
184                         continue;
185                 }
186
187                 contacts_record_get_str_p(number_record,_contacts_number.number,&number);
188                 if (number && *number) {
189                         if (*buf)
190                                 snprintf(temp, sizeof(temp), "%s", buf);
191                         if (*temp)
192                                 snprintf(buf, sizeof(buf), "%s,%s", temp, number);
193                         else
194                                 snprintf(buf, sizeof(buf), "%s", number);
195                 }
196                 contacts_record_destroy(number_record, true);
197         }
198         if(*buf){
199                 PH_DBG("number %s", buf);
200                 service_add_extra_data(service, "TO", buf);
201         }
202         cbs.priv = priv_data;
203         cbs.layout_cb = ug_common_layout_cb;
204         cbs.result_cb = NULL;
205         cbs.destroy_cb = ug_common_destroy_cb;
206
207         ug = ug_create(cgroup_d->ug, MSG_COMPOSER_UG, UG_MODE_FULLVIEW, service, &cbs);
208         service_destroy(service);
209
210         if (ug == NULL) {
211                 free(priv_data);
212                 ERR("%s ug_create is failed", MSG_COMPOSER_UG);
213         }
214         evas_object_smart_callback_del(cgroup_d->navi, "transition,finished", ctui_list_edit_navi_pop);
215         cgroup_d->child_ug = ug;
216 }
217
218
219 API void phone_group_email_result_cb(void *data, int *list, int cnt)
220 {
221         service_h service;
222         Ecore_X_Window win_id;
223         ct_group_data *cgroup_d = data;
224         int ret,i;
225         char *email;
226         contacts_record_h email_record = NULL;
227         char buf[PH_TEXT_MAX_LEN+1] = {'\0'};
228         char temp[PH_TEXT_MAX_LEN+1] = {'\0'};
229
230         p_retm_if(NULL == cgroup_d, "parameter(cgroup_d) is NULL");
231         p_retm_if(0 == cnt || NULL == list, "parameter(list) is NULL");
232
233         win_id = elm_win_xwindow_get(cgroup_d->win);
234         service_create(&service);
235         service_set_app_id(service, EMAIL_COMPOSER_PKG);
236         service_set_window(service, win_id);
237
238         for(i = 0; i < cnt; i++){
239                 ret = contacts_db_get_record(_contacts_email._uri,list[i],&email_record);
240                 if (CONTACTS_ERROR_NONE != ret) {
241                         ERR("contacts_db_get_record() Failed(%d)", ret);
242                         continue;
243                 }
244                 contacts_record_get_str_p(email_record,_contacts_email.email,&email);
245                 if (email && *email) {
246                         if (*buf)
247                                 snprintf(temp, sizeof(temp), "%s", buf);
248
249                         if (*temp)
250                                 snprintf(buf, sizeof(buf), "%s;%s", temp, email);
251                         else
252                                 snprintf(buf, sizeof(buf), "%s", email);
253                 }
254                 contacts_record_destroy(email_record, true);
255         }
256         if(*buf){
257                 PH_DBG("email %s", buf);
258                 service_add_extra_data(service, SERVICE_DATA_TO, buf);
259         }
260
261         service_send_launch_request(service, NULL, NULL);
262         service_destroy(service);
263 }
264
265 static void group_notify_update(ct_group_data *cgroup_d)
266 {
267         if (GROUP_MODE_NORMAL == cgroup_d->group_mode)
268                 phone_hide_notify(cgroup_d->layout);
269         else {
270                 if (0 < cgroup_d->count) {
271                         char buf[PH_TEXT_MAX_LEN+1];
272                         snprintf(buf, sizeof(buf), "%s (%d)", S_(PH_SYS_POP_SELECTED), cgroup_d->count);
273                         phone_show_notify(cgroup_d->layout, buf);
274                 }
275                 else
276                         phone_show_notify(cgroup_d->layout, T_(CT_GET_TEXT_BASE_OP, CTTEXT_SELECT_GROUP));
277         }
278 }
279
280 static void group_edit_result_cb(int grp_id,void *data, bool changed)
281 {
282         ct_group_data *cgroup_d = data;
283         group_notify_update(data);
284
285         if (changed) {
286                 cgroup_d->group_mode = GROUP_MODE_NORMAL;
287                 phone_hide_notify(cgroup_d->layout);
288                 phone_group_set_navi(cgroup_d->layout);
289         }
290 }
291
292 static void group_edit_btn_cb(void *data, Evas_Object *obj, void *event_info)
293 {
294         ct_group_data *cgroup_d;
295         ct_group_list *info = data;
296
297         cgroup_d = evas_object_data_get(elm_object_item_widget_get(info->item), "cgroup_d");
298         p_retm_if(NULL == cgroup_d, "evas_object_data_get() return NULL");
299
300         phone_hide_notify(cgroup_d->layout);
301         ctui_create_group_input_view(cgroup_d->win, cgroup_d->navi, data, group_edit_result_cb, cgroup_d);
302 }
303
304 static void group_navi_item_update(ct_group_data *cgroup_d)
305 {
306         if (0 < cgroup_d->count)
307                 elm_object_disabled_set(cgroup_d->delete_button, EINA_FALSE);
308         else
309                 elm_object_disabled_set(cgroup_d->delete_button, EINA_TRUE);
310 }
311
312 static void group_check_changed_cb(void *data, Evas_Object *obj, void *event_info)
313 {
314         ct_group_list *info = data;
315         ct_group_data *cgroup_d;
316         p_retm_if(NULL == data, "data is NULL");
317
318         cgroup_d = evas_object_data_get(elm_object_item_widget_get(info->item), "cgroup_d");
319         p_retm_if(NULL == cgroup_d, "evas_object_data_get() return NULL");
320
321         if (EINA_TRUE == info->selected && false == info->is_read_only)
322                 cgroup_d->count++;
323         else
324                 cgroup_d->count--;
325         group_navi_item_update(cgroup_d);
326         group_notify_update(cgroup_d);
327 }
328
329 static Evas_Object* group_gl_content_get(void *data, Evas_Object *obj, const char *part)
330 {
331         Evas_Object *icon;
332         Evas_Object *button;
333         Evas_Object *check;
334         ct_group_data *cgroup_d;
335         ct_group_list *info = data;
336
337         cgroup_d = evas_object_data_get(obj, "cgroup_d");
338         p_retvm_if(NULL == cgroup_d, NULL, "evas_object_data_get() return NULL");
339
340         if (0 == strcmp(part, "swallow.icon")) {
341                 if (CT_UG_REQUEST_SELECT_GROUP == cgroup_d->ug_request ||
342                                 CT_UG_REQUEST_SELECT_GROUP_ADD_TO_HOME == cgroup_d->ug_request)
343                         return NULL;
344                 if (GROUP_MODE_NORMAL == cgroup_d->group_mode)
345                         return NULL;
346                 else if (info->id_grp) {
347                         button = elm_button_add(obj);
348                         p_retvm_if(NULL == button, NULL, "elm_button_add() return NULL");
349                         evas_object_propagate_events_set(button, EINA_FALSE);
350                         elm_object_style_set(button, "rename");
351                         evas_object_smart_callback_add(button, "clicked", group_edit_btn_cb, info);
352                         return button;
353                 }
354         }
355         else if (0 == strncmp(part, "swallow.content", 15)) {
356                 int index = -1;
357                 sscanf(part, "swallow.content%d", &index);
358                 p_retvm_if(index<1 || 6<index, NULL, "index(%d) is out of range", index);
359
360                 if (info->img && *info->img) {
361                         icon = elm_icon_add(obj);
362                         p_retvm_if(NULL == icon, NULL, "elm_icon_add() return NULL");
363                         elm_icon_file_set(icon, info->img, NULL);
364                         evas_object_size_hint_aspect_set(icon, EVAS_ASPECT_CONTROL_NONE, 1, 1);
365                         evas_object_size_hint_align_set(icon, 0.5, EVAS_HINT_FILL);
366                         return icon;
367                 }
368                 else if (info->img_list[index-1] && *info->img_list[index-1]) {
369                         icon = elm_icon_add(obj);
370                         p_retvm_if(NULL == icon, NULL, "elm_icon_add() return NULL");
371                         elm_icon_file_set(icon, info->img_list[index-1], NULL);
372                         evas_object_size_hint_aspect_set(icon, EVAS_ASPECT_CONTROL_NONE, 1, 1);
373                         evas_object_size_hint_align_set(icon, 0.5, EVAS_HINT_FILL);
374                         return icon;
375                 }
376         }
377         else if(0 == strcmp(part, "swallow.edit.icon") && GROUP_MODE_EDIT == cgroup_d->group_mode){
378                 if (CT_UG_REQUEST_SELECT_GROUP == cgroup_d->ug_request)
379                         return NULL;
380                 if(info->is_read_only == true){
381                         check = elm_check_add(obj);
382                         p_retvm_if(NULL == check, NULL, "elm_check_add() return NULL");
383                         evas_object_show(check);
384                         elm_object_disabled_set(check,EINA_TRUE);
385                         return check;
386                 }
387
388                 check = elm_check_add(obj);
389                 p_retvm_if(NULL == check, NULL, "elm_check_add() return NULL");
390                 evas_object_show(check);
391                 evas_object_propagate_events_set(check, EINA_FALSE);
392                 elm_check_state_pointer_set(check, &info->selected);
393                 elm_check_state_set(check, info->selected);
394                 evas_object_smart_callback_add(check, "changed", group_check_changed_cb, info);
395                 return check;
396         }
397         return NULL;
398 }
399
400 static void __group_return_id(ui_gadget_h ug, int group_id)
401 {
402         PH_FN_CALL;
403         service_h service = NULL;
404         char buf[16] = {0, };
405
406         service_create(&service);
407
408         if (group_id) {
409                 snprintf(buf, sizeof(buf), "%d", group_id);
410                 service_add_extra_data(service, CT_UG_BUNDLE_RESULT_GROUP_ID, buf);
411         }
412
413         PH_DBG("group_id=%d", group_id);
414         ug_send_result(ug, service);
415
416         service_destroy(service);
417 }
418
419
420 static void group_gl_sel(void *data, Evas_Object *obj, void *event_info)
421 {
422         PH_FN_CALL;
423         Elm_Object_Item *item = event_info;
424         ct_group_data *cgroup_d = data;
425         ct_group_list *info = elm_object_item_data_get(item);
426         ph_view_info *view_info;
427         p_retm_if(NULL == info, "elm_object_item_data_get() return NULL");
428
429         elm_gengrid_item_selected_set(item, EINA_FALSE);
430
431         if (CT_UG_REQUEST_SELECT_GROUP == cgroup_d->ug_request) {
432                 __group_return_id(cgroup_d->ug, info->id_grp);
433                 ug_destroy_me(cgroup_d->ug);
434                 cgroup_d->ug = NULL;
435         }
436         else if (GROUP_MODE_NORMAL == cgroup_d->group_mode) {
437                 view_info = calloc(1, sizeof(ph_view_info));
438                 phone_set_view_info(view_info, cgroup_d->win, cgroup_d->navi, cgroup_d->ug, cgroup_d->ug_request,
439                                 cgroup_d->ug_cnt_max, cgroup_d->ug_data);
440
441                 if (0 < info->id_grp)
442                         ctui_list_create_contact_view_with_info(view_info, CT_GET_LIST_PERSON_OF_GROUP_ID, info);
443                 else // not assigned
444                         ctui_list_create_contact_view_with_info(view_info, CT_GET_LIST_PERSON_NOT_ASSIGNED_OF_ADDRBOOK_ID, info);
445                 free(view_info);
446         }
447         else {
448
449                 if(info->is_read_only == true)return; //skip default group
450
451                 info->selected = !info->selected;
452                 elm_gengrid_item_update(info->item);
453
454                 if (EINA_TRUE == info->selected)
455                         cgroup_d->count++;
456                 else
457                         cgroup_d->count--;
458
459                 group_navi_item_update(cgroup_d);
460                 group_notify_update(cgroup_d);
461         }
462 }
463
464 static void group_create_itcs()
465 {
466         group_itcs[GROUP_ITC_GROUP_TITLE].func.text_get = group_gl_index_label_get;
467
468         group_itcs[GROUP_ITC_1IMAGE].func.text_get = group_gl_label_get;
469         group_itcs[GROUP_ITC_1IMAGE].func.content_get = group_gl_content_get;
470         group_itcs[GROUP_ITC_1IMAGE].func.del = group_gl_del;
471
472         group_itcs[GROUP_ITC_2IMAGE].func.text_get = group_gl_label_get;
473         group_itcs[GROUP_ITC_2IMAGE].func.content_get = group_gl_content_get;
474         group_itcs[GROUP_ITC_2IMAGE].func.del = group_gl_del;
475
476         group_itcs[GROUP_ITC_3IMAGE].func.text_get = group_gl_label_get;
477         group_itcs[GROUP_ITC_3IMAGE].func.content_get = group_gl_content_get;
478         group_itcs[GROUP_ITC_3IMAGE].func.del = group_gl_del;
479
480         group_itcs[GROUP_ITC_6IMAGE].func.text_get = group_gl_label_get;
481         group_itcs[GROUP_ITC_6IMAGE].func.content_get = group_gl_content_get;
482         group_itcs[GROUP_ITC_6IMAGE].func.del = group_gl_del;
483 }
484
485 static Elm_Gengrid_Item_Class* group_get_gengrid_item_class(const char *img, int count)
486 {
487         PH_FN_CALL;
488         if ((img && *img) || count < 2)
489                 return &group_itcs[GROUP_ITC_1IMAGE];
490         else if (2 == count)
491                 return &group_itcs[GROUP_ITC_2IMAGE];
492         else if (3 == count)
493                 return &group_itcs[GROUP_ITC_3IMAGE];
494         else
495                 return &group_itcs[GROUP_ITC_6IMAGE];
496 }
497
498 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)
499 {
500         contacts_error_e err = CONTACTS_ERROR_NONE;
501
502         if (NULL == filter) {
503                 err = contacts_filter_create(view_uri, &filter);
504                 p_retvm_if(CONTACTS_ERROR_NONE != err, NULL, "contacts_filter_create() Failed(%d)", err);
505         }
506         else {
507                 err = contacts_filter_add_operator(filter, CONTACTS_FILTER_OPERATOR_AND);
508                 p_warn_if(CONTACTS_ERROR_NONE != err, "contacts_filter_add_operator() Failed(%d)", err);
509         }
510
511         err = contacts_filter_add_int(filter, property_id, flag, match_value);
512         p_warn_if(CONTACTS_ERROR_NONE != err, "contacts_filter_add_int() Failed(%d)", err);
513
514         return filter;
515 }
516
517 static void __group_get_images(ct_group_list *info, contacts_list_h person_list)
518 {
519         int cnt=0;
520         contacts_error_e err = CONTACTS_ERROR_NONE;
521         contacts_record_h record = NULL;
522
523         if(person_list == NULL) {
524                 ERR("person list is null");
525                 return;
526         }
527
528         err = contacts_list_get_current_record_p(person_list, &record);
529         p_retm_if(CONTACTS_ERROR_NONE != err, "phone_cts_get_list() Failed(%d)", err);
530         while(record)
531         {
532                 char *path = NULL;
533                 contacts_record_get_str_p(record,_contacts_person_grouprel.image_thumbnail_path, &path);
534                 info->img_list[cnt++] = SAFE_STRDUP(path);
535                 err = contacts_list_next(person_list);
536                 if (CONTACTS_ERROR_NONE != err)
537                         break;
538                 contacts_list_get_current_record_p(person_list, &record);
539                 if (5 < cnt) break;
540         }
541
542 }
543
544
545 static void __group_append_gengrid_of_ab(ct_group_data *cgroup_d, int ab_id, int ab_mode)
546 {
547         PH_FN_CALL;
548         contacts_error_e err = CONTACTS_ERROR_NONE;
549         unsigned int count = 0;
550         ct_group_list *info;
551         contacts_record_h record = NULL;
552         contacts_list_h group_list = NULL;
553         contacts_list_h person_list = NULL;
554         contacts_filter_h filter = NULL;
555         contacts_query_h query = NULL;
556
557         unsigned int person_grouprel_projection[] = {
558                 _contacts_person_grouprel.person_id,
559                 _contacts_person_grouprel.status,
560                 _contacts_person_grouprel.display_name,
561                 _contacts_person_grouprel.display_name_index,
562                 _contacts_person_grouprel.addressbook_ids,
563                 _contacts_person_grouprel.image_thumbnail_path,
564                 _contacts_person_grouprel.link_count,
565         };
566
567         err = phone_cts_get_list(_contacts_group._uri, _contacts_group.address_book_id, ab_id, &group_list);
568         p_warn_if(CONTACTS_ERROR_NONE != err, "phone_cts_get_list() Failed(%d)", err);
569
570         err = contacts_list_get_current_record_p(group_list, &record);
571         p_warn_if(CONTACTS_ERROR_NONE != err, "contacts_list_get_current_record_p() Failed(%d)", err);
572         while(record){
573                 int grp_id;
574                 char* img = NULL;
575                 char* gname = NULL;
576                 char* group_system_id = NULL;
577                 bool is_read_only = false;
578
579                 err = contacts_record_get_int(record,_contacts_group.id, &grp_id);
580                 p_retm_if(CONTACTS_ERROR_NONE != err, "contacts_record_get_int() Failed(%d)", err);
581                 info = calloc(1, sizeof(ct_group_list));
582                 if (NULL == info) {
583                         ERR("calloc() return NULL");
584                         break;
585                 }
586                 info->id_ab = ab_id;
587                 info->mode = ab_mode;
588                 info->id_grp = grp_id;
589                 err = contacts_record_get_str_p(record,_contacts_group.image_path,&img);
590
591                 p_retm_if(CONTACTS_ERROR_NONE != err, "contacts_record_get_str_p() Failed(%d)", err);
592                 info->img = SAFE_STRDUP(img);
593
594                 contacts_record_get_str_p(record, _contacts_group.extra_data, &group_system_id);
595                 if (NULL != group_system_id) {
596                         if (strcmp(group_system_id,"friends")==0)
597                                 info->name = strdup(T_(CT_GET_TEXT_BASIC, CTTEXT_FRIENDS));
598                         else if (strcmp(group_system_id,"family")==0)
599                                 info->name = strdup(T_(CT_GET_TEXT_BASIC, CTTEXT_FAMILY));
600                         else if (strcmp(group_system_id,"coworkers")==0)
601                                 info->name = strdup(T_(CT_GET_TEXT_BASIC, CTTEXT_CO_WORKERS));
602                         else
603                                 info->name = strdup(T_(CT_GET_TEXT_ERR, CTTEXT_NONAME));
604                 }
605                 else {
606                         err = contacts_record_get_str_p(record,_contacts_group.name,&gname);
607                         p_retm_if(CONTACTS_ERROR_NONE != err, "contacts_record_get_str_p() Failed(%d)", err);
608                         info->name = SAFE_STRDUP(gname);
609                 }
610
611                 err = phone_cts_get_list(_contacts_person_grouprel._uri, _contacts_person_grouprel.group_id, grp_id, &person_list);
612                 p_retm_if(CONTACTS_ERROR_NONE != err, "phone_cts_get_list() Failed(%d)", err);
613
614                 err = contacts_record_get_bool(record,_contacts_group.is_read_only, &is_read_only);
615                 p_retm_if(CONTACTS_ERROR_NONE != err, "contacts_record_get_bool() Failed(%d)", err);
616                 info->is_read_only = is_read_only;
617
618                 err = contacts_list_get_count(person_list,&count);
619                 p_retm_if(CONTACTS_ERROR_NONE != err, "contacts_list_get_count() Failed(%d)", err);
620                 info->count = count;
621                 __group_get_images(info, person_list);
622
623                 info->item = elm_gengrid_item_append(cgroup_d->gengrid, group_get_gengrid_item_class(info->img, info->count), info, group_gl_sel, cgroup_d);
624
625                 err = contacts_list_next(group_list);
626                 if (CONTACTS_ERROR_NONE != err) {
627                         ERR("contacts_list_next() Failed(%d)", err);
628                         break;
629                 }
630                 err = contacts_list_get_current_record_p(group_list, &record);
631                 if (CONTACTS_ERROR_NONE != err) {
632                         ERR("contacts_list_get_current_record_p() Failed(%d)", err);
633                         break;
634                 }
635         }
636         err = contacts_list_destroy(group_list, true);
637         p_retm_if(CONTACTS_ERROR_NONE != err, "contacts_list_get_current_record_p() Failed(%d)", err);
638
639         err = contacts_query_create(_contacts_person_grouprel._uri, &query);
640         p_retm_if(CONTACTS_ERROR_NONE != err, "contacts_query_create() Failed(%d)", err);
641
642         filter = group_create_filter_int(filter, _contacts_person_grouprel._uri, _contacts_person_grouprel.address_book_id, CONTACTS_MATCH_EQUAL, ab_id);
643         filter = group_create_filter_int(filter, _contacts_person_grouprel._uri, _contacts_person_grouprel.group_id, CONTACTS_MATCH_NONE, 0);
644
645         do {
646                 if (CONTACTS_ERROR_NONE != (err = contacts_query_set_filter(query, filter))) break;
647                 if (CONTACTS_ERROR_NONE != (err = contacts_query_set_distinct(query, true))) break;
648                 if (CONTACTS_ERROR_NONE != (err = contacts_query_set_projection(query, person_grouprel_projection, sizeof(person_grouprel_projection)/sizeof(int)))) break;
649                 if (CONTACTS_ERROR_NONE != (err = contacts_db_get_records_with_query(query, 0, 0, &person_list))) break;
650
651                 err = contacts_list_get_count(person_list, &count);
652                 p_retm_if(CONTACTS_ERROR_NONE != err, "contacts_list_get_count() Failed(%d)", err);
653
654                 if (0 < count && cgroup_d->group_mode == GROUP_MODE_NORMAL ) {
655                         info = calloc(1, sizeof(ct_group_list));
656                         p_retm_if(NULL == info, "calloc() return NULL");
657                         info->id_ab = ab_id;
658                         info->count = count;
659                         info->mode = ab_mode;
660                         if (0 == ab_id)
661                                 info->name = strdup(T_(CT_GET_TEXT_BASIC, CTTEXT_NOT_ASSIGNED));
662                         else
663                                 info->name = strdup(T_(CT_GET_TEXT_BASIC, CTTEXT_ALL_CONTACTS));
664                         __group_get_images(info, person_list);
665                         info->item = elm_gengrid_item_append(cgroup_d->gengrid, group_get_gengrid_item_class(info->img, info->count), info, group_gl_sel, cgroup_d);
666                 }
667         } while (0);
668
669         contacts_query_destroy(query);
670         contacts_filter_destroy(filter);
671 }
672
673 static void __group_fill_layout(ct_group_data *cgroup_d)
674 {
675         int ret;
676         contacts_record_h record = NULL;
677         contacts_list_h addressbook_list = NULL;
678
679         ret = contacts_db_get_all_records(_contacts_address_book._uri, 0,0, &addressbook_list);
680         p_retm_if(CONTACTS_ERROR_NONE != ret, "contacts_db_get_all_records() Failed(%d)", ret);
681         ret = contacts_list_get_current_record_p(addressbook_list, &record);
682         p_retm_if(CONTACTS_ERROR_NONE != ret, "contacts_list_get_current_record_p() Failed(%d)", ret);
683         while(record){
684                 int ab_id;
685                 int ab_mode;
686                 char *name;
687
688                 ret = contacts_record_get_int(record,_contacts_address_book.id,&ab_id);
689                 p_retm_if(CONTACTS_ERROR_NONE != ret, "contacts_record_get_int() Failed(%d)", ret);
690                 if (0 == ab_id)
691                         name = (char *)T_(CT_GET_TEXT_BASIC, CTTEXT_PHONE);
692                 else {
693                         ret = contacts_record_get_str_p(record,_contacts_address_book.name,&name);
694                         p_retm_if(CONTACTS_ERROR_NONE != ret, "contacts_record_get_str() Failed(%d)", ret);
695                 }
696                 ret = contacts_record_get_int(record,_contacts_address_book.mode,&ab_mode);
697                 p_retm_if(CONTACTS_ERROR_NONE != ret, "contacts_record_get_int() Failed(%d)", ret);
698
699                 if (GROUP_MODE_NORMAL == cgroup_d->group_mode || CONTACTS_ADDRESS_BOOK_MODE_READONLY != ab_mode) {
700                         elm_gengrid_item_append(cgroup_d->gengrid, &group_itcs[GROUP_ITC_GROUP_TITLE], name, NULL, NULL);
701                         __group_append_gengrid_of_ab(cgroup_d, ab_id, ab_mode);
702                 }
703                 ret = contacts_list_next(addressbook_list);
704                 p_retm_if(CONTACTS_ERROR_NONE != ret, "contacts_list_next() Failed(%d)", ret);
705                 ret = contacts_list_get_current_record_p(addressbook_list, &record);
706                 p_retm_if(CONTACTS_ERROR_NONE != ret, "contacts_list_get_current_record_p() Failed(%d)", ret);
707         }
708         ret = contacts_list_destroy(addressbook_list, true);
709         p_retm_if(CONTACTS_ERROR_NONE != ret, "contacts_list_destroy() Failed(%d)", ret);
710 }
711
712 static void group_edit_mode_end(ct_group_data *cgroup_d, bool redraw)
713 {
714         p_retm_if(NULL == cgroup_d, "parameter(cgroup_d) is NULL");
715         cgroup_d->count = 0;
716         phone_hide_notify(cgroup_d->layout);
717         cgroup_d->group_mode = GROUP_MODE_NORMAL;
718         if (redraw)
719                 phone_group_set_navi(cgroup_d->layout);
720         elm_gengrid_clear(cgroup_d->gengrid);
721         __group_fill_layout(cgroup_d);
722 }
723
724 static Eina_Bool group_wait_changed(void *user_data)
725 {
726         ct_group_data *cgroup_d = user_data;
727         ecore_timer_del(cgroup_d->waiting_timer);
728         cgroup_d->waiting_timer = NULL;
729         if(cgroup_d->need_update) {
730                 PH_DBG("need to update");
731                 cgroup_d->need_update = false;
732                 group_changed(cgroup_d);
733         }
734         return ECORE_CALLBACK_CANCEL;
735 }
736
737
738 static Eina_Bool group_changed(void *user_data)
739 {
740         ct_group_data *cgroup_d = user_data;
741         PH_DBG("group_changed");
742         if(cgroup_d->update_timer) {
743                 ecore_timer_del(cgroup_d->update_timer);
744                 cgroup_d->update_timer = NULL;
745         }
746
747         if(cgroup_d->waiting_timer) {
748                 PH_DBG("waiting 3 seconds for group change");
749                 cgroup_d->need_update = true;
750                 return ECORE_CALLBACK_RENEW;;
751         }
752         else {
753                 cgroup_d->waiting_timer = ecore_timer_add(3.0, group_wait_changed, cgroup_d);
754         }
755
756         elm_gengrid_clear(cgroup_d->gengrid);
757         __group_fill_layout(cgroup_d);
758
759         return ECORE_CALLBACK_CANCEL;
760 }
761
762 static void group_data_lazy_update(const char* view_uri,void *data)
763 {
764         PH_FN_CALL;
765         ct_group_data *cgroup_d = data;
766
767         if (cgroup_d->update_timer) {
768                 ecore_timer_del(cgroup_d->update_timer);
769                 cgroup_d->update_timer = NULL;
770         }
771
772         PH_DBG("cgroup_d->is_background = %d", cgroup_d->is_background);
773
774         if (cgroup_d->is_background)
775                 cgroup_d->update_timer = ecore_timer_add(3.0, group_changed, cgroup_d);
776         else
777                 group_changed(cgroup_d);
778
779         if(cgroup_d->group_mode == GROUP_MODE_EDIT)
780                 group_edit_mode_end(cgroup_d, true);
781 }
782
783 static void group_delete_btn_cb(void *data, Evas_Object *obj, void *event_info)
784 {
785         int ret;
786         bool completed = true;
787         Elm_Object_Item *item;
788         const Elm_Gengrid_Item_Class *itc_temp;
789         ct_group_data *cgroup_d = data;
790
791         group_popup_hide_cb(cgroup_d, NULL, NULL);
792
793         item = elm_gengrid_first_item_get(cgroup_d->gengrid);
794
795         while (item) {
796                 itc_temp = elm_gengrid_item_item_class_get(item);
797                 if (0 == strcmp(itc_temp->item_style, group_itcs[GROUP_ITC_GROUP_TITLE].item_style)) {
798                         item = elm_gengrid_item_next_get(item);
799                         continue;
800                 }
801
802                 ct_group_list *info = elm_object_item_data_get(item);
803                 if (info && info->selected) {
804                         ret = contacts_db_delete_record(_contacts_group._uri,info->id_grp);
805                         if (CONTACTS_ERROR_NONE != ret) {
806                                 ERR("Error : contacts_db_delete_record() Failed(%d)", ret);
807                                 completed = false;
808                                 break;
809                         }
810                 }
811                 item = elm_gengrid_item_next_get(item);
812         }
813         if (completed)
814                 phone_show_tickernoti(S_(PH_SYS_POP_DELETED));
815         else
816                 phone_show_tickernoti(S_(PH_SYS_POP_FAILED));
817
818         group_edit_mode_end(cgroup_d, true);
819 }
820
821
822 static void group_cacnel_btn_cb(void *data, Evas_Object *obj, void *event_info)
823 {
824         Elm_Object_Item *item;
825         ct_group_data *cgroup_d = data;
826         ct_group_list *info;
827         const Elm_Gengrid_Item_Class *itc_temp;
828
829         item = elm_gengrid_first_item_get(cgroup_d->gengrid);
830         while (item) {
831                 itc_temp = elm_gengrid_item_item_class_get(item);
832                 if (0 == strcmp(itc_temp->item_style, group_itcs[GROUP_ITC_GROUP_TITLE].item_style)) {
833                         item = elm_gengrid_item_next_get(item);
834                         continue;
835                 }
836
837                 info = elm_object_item_data_get(item);
838                 if (NULL == info) continue;
839                 info->selected = EINA_FALSE;
840                 item = elm_gengrid_item_next_get(item);
841         }
842         group_edit_mode_end(cgroup_d, true);
843 }
844
845 static void group_edit_cb(void *data, Evas_Object *obj, void *event_info)
846 {
847         ct_group_data *cgroup_d = data;
848         if (cgroup_d->popup){
849                 evas_object_del(cgroup_d->popup);
850                 cgroup_d->popup = NULL;
851         }
852
853         cgroup_d->group_mode = GROUP_MODE_EDIT;
854         phone_group_set_navi(cgroup_d->layout);
855         elm_gengrid_clear(cgroup_d->gengrid);
856         __group_fill_layout(cgroup_d);
857         phone_show_notify(cgroup_d->layout, T_(CT_GET_TEXT_BASE_OP, CTTEXT_SELECT_GROUP));
858
859 }
860
861 static void group_account_cb(void *data, Evas_Object *obj, void *event_info)
862 {
863         ct_group_data *cgroup_d = data;
864         if (cgroup_d->popup){
865                 evas_object_del(cgroup_d->popup);
866                 cgroup_d->popup = NULL;
867         }
868
869         cgroup_d->child_ug = ctui_account_ug(cgroup_d->ug, NULL, NULL,
870                         ctui_destroy_child_ug, &cgroup_d->child_ug);
871 }
872
873 static void group_more_cb(void *data, Evas_Object *obj, void *event_info)
874 {
875         int rotate;
876         int x,y,w,h;
877         ct_group_data *cgroup_d = data;
878
879         if (cgroup_d->popup){
880                 evas_object_del(cgroup_d->popup);
881                 cgroup_d->popup = NULL;
882         }
883
884         cgroup_d->popup = elm_ctxpopup_add(cgroup_d->navi);
885         p_retm_if(NULL == cgroup_d->popup, "elm_ctxpopup_add() return NULL");
886
887         rotate = (int)evas_object_data_get(cgroup_d->navi, "phone_rotate");
888         if (0 == rotate || 180 == rotate)
889                 elm_ctxpopup_direction_priority_set(cgroup_d->popup, ELM_CTXPOPUP_DIRECTION_DOWN, ELM_CTXPOPUP_DIRECTION_UP,
890                                 ELM_CTXPOPUP_DIRECTION_LEFT, ELM_CTXPOPUP_DIRECTION_RIGHT);
891
892         evas_object_smart_callback_add(cgroup_d->popup, "dismissed", group_popup_hide_cb, cgroup_d);
893
894         elm_ctxpopup_item_append(cgroup_d->popup, S_(PH_SYS_SK_EDIT), NULL,
895                         group_edit_cb, cgroup_d);
896
897         evas_object_geometry_get(cgroup_d->ctrl_button, &x, &y, &w, &h);
898         evas_object_move(cgroup_d->popup, w/2, y+h/2);
899         evas_object_show(cgroup_d->popup);
900 }
901
902 static void group_add_cb(void *data, Evas_Object *obj, void *event_info)
903 {
904         ct_group_data *cgroup_d = data;
905         evas_object_data_set(cgroup_d->navi, "navi_it_pop_to", cgroup_d->navi_item);
906         ctui_create_group_input_view(cgroup_d->win, cgroup_d->navi,NULL, NULL, NULL);
907 }
908
909 #ifdef _CT_GROUP_DEFAULT_GROUP_UPDATE_DB
910 static void group_update_default_group_name(keynode_t *key, void *data)
911 {
912         PH_FN_CALL;
913         int ret;
914         int text_index= -1;
915         contacts_record_h record = NULL;
916         contacts_record_h group_record = NULL;
917         contacts_list_h group_list = NULL;
918
919         group_list = NULL;
920         ret = contacts_db_get_all_records( _contacts_group._uri,0,0,&group_list);
921         p_retm_if(CONTACTS_ERROR_NONE != ret, "contacts_db_get_all_records() Failed(%d)", ret);
922         ret = contacts_list_get_current_record_p(group_list, &record);
923         p_retm_if(CONTACTS_ERROR_NONE != ret, "contacts_list_get_current_record_p() Failed(%d)", ret);
924         while(record){
925                 int grp_id;
926                 char* group_sysid;
927                 char* group_name;
928
929                 ret = contacts_record_get_int(record,_contacts_group.id,&grp_id);
930                 p_retm_if(CONTACTS_ERROR_NONE != ret, "contacts_record_get_int() Failed(%d)", ret);
931                 ret = contacts_record_get_str_p(record,_contacts_group.extra_data,&group_sysid);
932                 p_retm_if(CONTACTS_ERROR_NONE != ret, "contacts_record_get_str_p() Failed(%d)", ret);
933                 ret = contacts_record_get_str_p(record,_contacts_group.name,&group_name);
934                 p_retm_if(CONTACTS_ERROR_NONE != ret, "contacts_record_get_str_p() Failed(%d)", ret);
935                 if(group_sysid == NULL){
936                         PH_DBG("sysid null ,group_name__ = %s ", group_name);
937
938                         ret = contacts_list_next(group_list);
939                         p_retm_if(CONTACTS_ERROR_NONE != ret, "contacts_list_next() Failed(%d)", ret);
940
941                         ret = contacts_list_get_current_record_p(group_list, &record);
942                         p_retm_if(CONTACTS_ERROR_NONE != ret, "contacts_list_get_current_record_p() Failed(%d)", ret);
943                         continue;
944                 }
945                 PH_DBG("group_sysid = %s",group_sysid);
946                 if(strcmp(group_sysid,"friends")==0)
947                         text_index = CTTEXT_FRIENDS;
948                 else if(strcmp(group_sysid,"family")==0)
949                         text_index = CTTEXT_FRIENDS+1;
950                 else if(strcmp(group_sysid,"coworkers")==0)
951                         text_index = CTTEXT_FRIENDS+2;
952                 else {
953                         ret = contacts_list_next(group_list);
954                         p_retm_if(CONTACTS_ERROR_NONE != ret, "contacts_list_next() Failed(%d)", ret);
955
956                         ret = contacts_list_get_current_record_p(group_list, &record);
957                         p_retm_if(CONTACTS_ERROR_NONE != ret, "contacts_list_get_current_record_p() Failed(%d)", ret);
958                         continue;
959                 }
960
961                 if(text_index == -1){
962                         ret = contacts_list_next(group_list);
963                         p_retm_if(CONTACTS_ERROR_NONE != ret, "contacts_list_next() Failed(%d)", ret);
964
965                         ret = contacts_list_get_current_record_p(group_list, &record);
966                         p_retm_if(CONTACTS_ERROR_NONE != ret, "contacts_list_get_current_record_p() Failed(%d)", ret);
967                         ERR("text_index is -1, failed");
968                         continue;
969                 }
970                 else
971                         PH_DBG("text_index = %d",text_index);
972
973                 PH_DBG("group = %s , %s", group_name,T_(CT_GET_TEXT_BASIC, text_index));
974
975                 if(strcmp(group_name,T_(CT_GET_TEXT_BASIC, text_index)) != 0){
976                         ret = contacts_db_get_record(_contacts_group._uri,grp_id,&group_record);
977                         p_retm_if(CONTACTS_ERROR_NONE != ret, "contacts_db_get_record() Failed(%d)", ret);
978
979                         ret = contacts_record_set_str(group_record,_contacts_group.name,T_(CT_GET_TEXT_BASIC, text_index));
980                         p_retm_if(CONTACTS_ERROR_NONE != ret, "contacts_record_set_str() Failed(%d)", ret);
981
982                         ret = contacts_db_update_record(group_record);
983                         p_retm_if(CONTACTS_ERROR_NONE != ret, "contacts_db_update_record() Failed(%d)", ret);
984
985                         ret = contacts_record_destroy(group_record, true);
986                         p_retm_if(CONTACTS_ERROR_NONE != ret, "contacts_record_destroy() Failed(%d)", ret);
987                 }
988                 ret = contacts_list_next(group_list);
989                 p_retm_if(CONTACTS_ERROR_NONE != ret, "contacts_list_next() Failed(%d)", ret);
990
991                 ret = contacts_list_get_current_record_p(group_list, &record);
992                 p_retm_if(CONTACTS_ERROR_NONE != ret, "contacts_list_get_current_record_p() Failed(%d)", ret);
993         }
994         ret = contacts_list_destroy(group_list, true);
995         p_retm_if(CONTACTS_ERROR_NONE != ret, "contacts_list_destroy() Failed(%d)", ret);
996
997 }
998 #endif
999
1000 static void __group_pop_as_topmost(void *data, Evas_Object *obj, void *event_info)
1001 {
1002         ct_group_data *cgroup_d = data;
1003         if(cgroup_d->navi_item == elm_naviframe_top_item_get(obj)) {
1004                 group_notify_update(cgroup_d);
1005         }
1006 }
1007
1008 static void group_view_delete_cb(void *data, Evas *e, Evas_Object *obj,
1009                 void *event_info)
1010 {
1011         int ret;
1012         ct_group_data *cgroup_d = data;
1013         p_retm_if(NULL == cgroup_d, "parameter(cgroup_d) is NULL");
1014
1015
1016         ret = contacts_db_remove_changed_cb(_contacts_contact._uri,group_data_lazy_update,cgroup_d);
1017         p_warn_if(CONTACTS_ERROR_NONE, "contacts_db_remove_changed_cb() Failed(%d)", ret);
1018         ret = contacts_db_remove_changed_cb(_contacts_group._uri,group_data_lazy_update,cgroup_d);
1019         p_warn_if(CONTACTS_ERROR_NONE, "contacts_db_remove_changed_cb() Failed(%d)", ret);
1020         ret = contacts_db_remove_changed_cb(_contacts_person._uri, group_data_lazy_update, cgroup_d);
1021         p_warn_if(CONTACTS_ERROR_NONE, "contacts_db_remove_changed_cb() Failed(%d)", ret);
1022
1023 #ifdef _CT_GROUP_DEFAULT_GROUP_UPDATE_DB
1024         ret = vconf_ignore_key_changed(VCONFKEY_LANGSET, group_update_default_group_name);
1025         p_warn_if(-1 == ret, "vconf_ignore_key_changed() Failed");
1026 #endif
1027
1028         if (cgroup_d->th) {
1029                 elm_theme_extension_del(cgroup_d->th, GROUP_THEME_EDJ);
1030                 elm_theme_extension_del(cgroup_d->th, CONTACT_BUTTON_THEME_EDJ);
1031                 elm_theme_free(cgroup_d->th);
1032         }
1033
1034         if (cgroup_d->child_ug)
1035                 ug_destroy(cgroup_d->child_ug);
1036
1037         if (cgroup_d->crop_ug)
1038                 ug_destroy(cgroup_d->crop_ug);
1039
1040         if (cgroup_d->src_ug)
1041                 ug_destroy(cgroup_d->src_ug);
1042
1043         if (cgroup_d->popup)
1044                 evas_object_del(cgroup_d->popup);
1045
1046         if (cgroup_d->update_timer)
1047                 ecore_timer_del(cgroup_d->update_timer);
1048
1049         if (cgroup_d->waiting_timer)
1050                 ecore_timer_del(cgroup_d->waiting_timer);
1051
1052         evas_object_smart_callback_del(cgroup_d->navi, "transition,finished", __group_pop_as_topmost);
1053
1054         free(cgroup_d);
1055 }
1056
1057 static int group_create_layout(ct_group_data *cgroup_d, Evas_Object *parent)
1058 {
1059         PH_FN_CALL;
1060         int ret;
1061         const int CT_GROUP_ITEM_WIDTH = 360;
1062         const int CT_GROUP_ITEM_HEIGHT = 340;
1063         double scale;
1064         Evas_Object *layout;
1065         Evas_Object *base;
1066         Evas_Object *gengrid;
1067         cgroup_d->navi = parent;
1068
1069         base = elm_layout_add(cgroup_d->navi);
1070         p_retvm_if(NULL == base, -1, "elm_layout_add() return NULL");
1071         elm_layout_file_set(base, SELECTION_INFO_EDJ, "selectioninfo_layout");
1072         layout = phone_create_base_layout(base, false);
1073         p_retvm_if(NULL == layout, -1, "phone_create_base_layout() return NULL");
1074         elm_object_part_content_set(base, "contents", layout);
1075         cgroup_d->layout = base;
1076
1077         gengrid = elm_gengrid_add(layout);
1078         p_retvm_if(NULL == gengrid, -1, "elm_gengrid_add() return NULL");
1079         elm_object_theme_set(gengrid, cgroup_d->th);
1080         evas_object_size_hint_weight_set(gengrid, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1081         elm_gengrid_align_set(gengrid, 0.5, 0.0);
1082         evas_object_data_set(gengrid, "cgroup_d", cgroup_d);
1083
1084         scale = elm_config_scale_get();
1085         elm_gengrid_group_item_size_set(gengrid, (int)(720*scale), (int)(50*scale));
1086         elm_gengrid_item_size_set(gengrid, (int)(CT_GROUP_ITEM_WIDTH*scale), (int)(CT_GROUP_ITEM_HEIGHT*scale));
1087         elm_gengrid_horizontal_set(gengrid, EINA_FALSE);
1088
1089         elm_gengrid_scroller_policy_set(gengrid, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_AUTO);
1090         elm_object_part_content_set(layout, "elm.swallow.content", gengrid);
1091         cgroup_d->gengrid = gengrid;
1092
1093 #ifdef _CT_GROUP_DEFAULT_GROUP_UPDATE_DB
1094         group_update_default_group_name(NULL, NULL);
1095         ret = vconf_notify_key_changed(VCONFKEY_LANGSET, group_update_default_group_name, NULL);
1096         p_warn_if(-1 == ret, "vconf_notify_key_changed() Failed");
1097 #endif
1098
1099         group_create_itcs();
1100         __group_fill_layout(cgroup_d);
1101
1102         evas_object_event_callback_add(cgroup_d->layout, EVAS_CALLBACK_DEL, group_view_delete_cb, cgroup_d);
1103
1104         ret = contacts_db_add_changed_cb(_contacts_contact._uri, group_data_lazy_update, cgroup_d);
1105         p_warn_if(CONTACTS_ERROR_NONE, "contacts_db_add_changed_cb() Failed(%d)", ret);
1106
1107         ret = contacts_db_add_changed_cb(_contacts_group._uri, group_data_lazy_update, cgroup_d);
1108         p_warn_if(CONTACTS_ERROR_NONE, "contacts_db_add_changed_cb() Failed(%d)", ret);
1109
1110         ret = contacts_db_add_changed_cb(_contacts_person._uri, group_data_lazy_update, cgroup_d);
1111         p_warn_if(CONTACTS_ERROR_NONE, "contacts_db_add_changed_cb() Failed(%d)", ret);
1112
1113         return 0;
1114
1115 }
1116
1117 API void phone_group_set_navi(Evas_Object *layout)
1118 {
1119         ct_group_data *cgroup_d;
1120         Elm_Object_Item *navi_it;
1121         Evas_Object *r_btn;
1122
1123         cgroup_d = evas_object_data_get(layout, KEY_GROUP_DATA);
1124         p_retm_if(NULL == cgroup_d, "cgroup_d is NULL");
1125         navi_it = elm_naviframe_bottom_item_get(cgroup_d->navi);
1126         p_retm_if(NULL == navi_it, "navi item is NULL");
1127
1128         phone_navi_item_clear(cgroup_d->navi_item);
1129
1130         if (cgroup_d->ug) {
1131                 r_btn = phone_create_toolbar_btn(cgroup_d->navi, S_(PH_SYS_SK_CANCEL), phone_ug_destroy_me_cb, cgroup_d->ug);
1132                 elm_object_item_part_content_set(cgroup_d->navi_item, "toolbar_button1", r_btn);
1133         }
1134         else {
1135                 if (GROUP_MODE_NORMAL == cgroup_d->group_mode) {
1136                         Evas_Object *group_button;
1137
1138                         cgroup_d->ctrl_button = ctui_create_more_btn(cgroup_d->navi, group_more_cb, cgroup_d);
1139                         elm_object_item_part_content_set(navi_it, "toolbar_more_btn", cgroup_d->ctrl_button);
1140
1141                         group_button = phone_create_toolbar_btn(cgroup_d->navi, S_(CT_SYS_BODY_CREATE), group_add_cb, cgroup_d);
1142                         elm_object_item_part_content_set(navi_it, "toolbar_button1", group_button);
1143
1144                         r_btn = elm_button_add(cgroup_d->navi);
1145                         elm_object_style_set(r_btn, "naviframe/back_btn/default");
1146                         evas_object_smart_callback_add(r_btn, "clicked", phone_back_btn_clicked_cb, cgroup_d->win);
1147                         elm_object_item_part_content_set(navi_it, "prev_btn", r_btn);
1148                 }
1149                 else {
1150                         phone_navi_item_clear(navi_it);
1151                         cgroup_d->delete_button = phone_create_toolbar_btn(cgroup_d->navi, S_(PH_SYS_SK_DELETE), group_delete_btn_cb, cgroup_d);
1152                         elm_object_item_part_content_set(navi_it, "toolbar_button1", cgroup_d->delete_button);
1153                         elm_object_disabled_set(cgroup_d->delete_button, EINA_TRUE);
1154
1155                         r_btn = phone_create_toolbar_btn(cgroup_d->navi, S_(PH_SYS_SK_CANCEL), group_cacnel_btn_cb, cgroup_d);
1156                         elm_object_item_part_content_set(cgroup_d->navi_item, "toolbar_button2", r_btn);
1157                 }
1158         }
1159 }
1160
1161 API Evas_Object* phone_create_group_view(ph_view_info *view_info)
1162 {
1163         int ret;
1164         Elm_Theme *th;
1165         ct_group_data *cgroup_d= calloc(1, sizeof(ct_group_data));
1166         p_retvm_if(NULL == cgroup_d, NULL, "Fail to calloc ct_group_data");
1167         cgroup_d->ug = view_info->ug;
1168         cgroup_d->ug_request = view_info->ug_request;
1169         cgroup_d->ug_cnt_max = view_info->ug_cnt_max;
1170         cgroup_d->ug_data = view_info->ug_data;
1171         cgroup_d->win = view_info->win;
1172         cgroup_d->navi_item = elm_naviframe_bottom_item_get(view_info->navi);
1173         cgroup_d->is_background = true;
1174
1175         th = elm_theme_new();
1176         elm_theme_ref_set(th, NULL);
1177         elm_theme_extension_add(th, GROUP_THEME_EDJ);
1178         elm_theme_extension_add(th, CONTACT_BUTTON_THEME_EDJ);
1179         cgroup_d->th = th;
1180
1181         ret = group_create_layout(cgroup_d, view_info->navi);
1182         if (ret < 0) {
1183                 free(cgroup_d);
1184                 return NULL;
1185         }
1186
1187         evas_object_data_set(cgroup_d->layout, KEY_GROUP_DATA, cgroup_d);
1188         evas_object_data_set(cgroup_d->navi, KEY_GROUP_DATA, cgroup_d);
1189
1190         evas_object_smart_callback_add(view_info->navi, "transition,finished", __group_pop_as_topmost, cgroup_d);
1191
1192         return cgroup_d->layout;
1193 }
1194
1195 API void phone_group_view_reset(Evas_Object *base)
1196 {
1197         PH_FN_CALL;
1198         ct_group_data *cgroup_d;
1199         Elm_Object_Item *item;
1200
1201         cgroup_d = evas_object_data_get(base, KEY_GROUP_DATA);
1202         p_retm_if(NULL == cgroup_d, "cgroup_d is null");
1203
1204         if (cgroup_d->child_ug) {
1205                 ug_destroy(cgroup_d->child_ug);
1206                 cgroup_d->child_ug = NULL;
1207         }
1208
1209         item = elm_naviframe_bottom_item_get(cgroup_d->navi);
1210         if (elm_naviframe_top_item_get(cgroup_d->navi) != item)
1211                 elm_naviframe_item_pop_to(item);
1212
1213         if (GROUP_MODE_EDIT == cgroup_d->group_mode)
1214                 group_edit_mode_end(cgroup_d, false);
1215 }
1216
1217 API void phone_group_view_language_changed(Evas_Object *base)
1218 {
1219         ct_group_data *cgroup_d;
1220         cgroup_d = evas_object_data_get(base, KEY_GROUP_DATA);
1221         p_retm_if(NULL == cgroup_d, "evas_object_data_get() return NULL");
1222         group_changed(cgroup_d);
1223
1224         if(cgroup_d->group_mode == GROUP_MODE_EDIT)
1225                 group_notify_update(cgroup_d);
1226 }
1227
1228 API void phone_group_set_background(Evas_Object *obj, bool is_background)
1229 {
1230         ct_group_data *cgroup_d;
1231         cgroup_d = evas_object_data_get(obj, KEY_GROUP_DATA);
1232         p_retm_if(NULL == cgroup_d, "group data is null");
1233
1234         cgroup_d->is_background = is_background;
1235         if (cgroup_d->update_timer) {
1236                 ecore_timer_del(cgroup_d->update_timer);
1237                 cgroup_d->update_timer = NULL;
1238                 group_changed(cgroup_d);
1239         }
1240 }
1241
1242 API Evas_Object* phone_create_group_view_ug(ui_gadget_h ug, Evas_Object *parent, int ug_request)
1243 {
1244         int ret;
1245         Elm_Theme *th;
1246         ct_group_data *cgroup_d= calloc(1, sizeof(ct_group_data));
1247         p_retvm_if(NULL == cgroup_d, NULL, "Fail to calloc ct_group_data");
1248         cgroup_d->ug = ug;
1249         cgroup_d->ug_request = ug_request;
1250         cgroup_d->navi = elm_naviframe_add(parent);
1251         p_retvm_if(NULL == cgroup_d->navi, FALSE, "elm_naviframe_add() return NULL");
1252         elm_object_part_content_set(parent, "elm.swallow.content", cgroup_d->navi);
1253         evas_object_show(cgroup_d->navi);
1254
1255         th = elm_theme_new();
1256         elm_theme_ref_set(th, NULL);
1257         elm_theme_extension_add(th, GROUP_THEME_EDJ);
1258         elm_theme_extension_add(th, CONTACT_BUTTON_THEME_EDJ);
1259         cgroup_d->th = th;
1260
1261         ret = group_create_layout(cgroup_d, cgroup_d->navi);
1262         if (ret < 0) {
1263                 free(cgroup_d);
1264                 return NULL;
1265         }
1266         cgroup_d->navi_item = elm_naviframe_item_push(cgroup_d->navi, T_(CT_GET_TEXT_BASIC, CTTEXT_GROUP), NULL, NULL, cgroup_d->layout, NULL);
1267         evas_object_data_set(cgroup_d->layout, KEY_GROUP_DATA, cgroup_d);
1268         return cgroup_d->layout;
1269 }
1270