change group system id as extra data
[apps/home/phone-contacts.git] / lib / list / ct-list-utils.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 #include <errno.h>
18 #include <fcntl.h>
19 #include <ui-gadget-module.h>
20 #include "phone.h"
21 #include "ct-detail.h"
22 #include "ct-list.h"
23 #include "ct-list-contact-view.h"
24 #include "ct-list-utils.h"
25
26 int ct_list_parse_bundle(service_h service, ct_list_data* clist_d)
27 {
28         char* val = NULL;
29
30         if (service) {
31                 service_get_extra_data(service, CT_UG_BUNDLE_TYPE, &val);
32                 if (val) clist_d->ug_request = atoi(val);
33                 PH_DBG("type = %d", clist_d->ug_request);
34                 free(val);
35
36                 switch (clist_d->ug_request) {
37                 case CT_UG_REQUEST_SELECT_GROUP:
38                 case CT_UG_REQUEST_SELECT_GROUP_ADD_TO_HOME:
39                         return 0;
40                 case CT_UG_REQUEST_LIST:
41                 case CT_UG_REQUEST_LIST_WITH_BACK:
42                 case CT_UG_REQUEST_SELECT_PERSON:
43                 case CT_UG_REQUEST_SHARE_CONTACT_INFO:
44                 case CT_UG_REQUEST_SELECT_VCARD:
45                         val = NULL;
46                         service_get_extra_data(service, CT_UG_BUNDLE_ACCOUNTID, &val);
47                         if(val) {
48                                 clist_d->list_op = CT_GET_LIST_PERSON_OF_ADDRBOOK_ID;
49                                 clist_d->base_ab = atoi(val);
50                                 free(val);
51                         }
52
53                         break;
54                 case CT_UG_REQUEST_SELECT_NUMBER:
55                 case CT_UG_REQUEST_SELECT_CONTACT_ADD_TO_HOME:
56                         val = NULL;
57                         service_get_extra_data(service, CT_UG_BUNDLE_ACCOUNTID, &val);
58                         if(val) {
59                                 clist_d->list_op = CT_GET_LIST_PERSON_HAD_NUMBER_OF_ADDRBOOK_ID;
60                                 clist_d->base_ab = atoi(val);
61                                 free(val);
62                         }
63                         else {
64                                 clist_d->list_op = CT_GET_LIST_ALL_PERSON_HAD_NUMBER;
65                         }
66                         break;
67                 case CT_UG_REQUEST_SELECT_EMAIL:
68                         val = NULL;
69                         service_get_extra_data(service, CT_UG_BUNDLE_ACCOUNTID, &val);
70                         if(val) {
71                                 clist_d->list_op = CT_GET_LIST_PERSON_HAD_EMAIL_OF_ADDRBOOK_ID;
72                                 clist_d->base_ab = atoi(val);
73                                 free(val);
74                         }
75                         else {
76                                 clist_d->list_op = CT_GET_LIST_ALL_PERSON_HAD_EMAIL;
77                         }
78                         break;
79                 case CT_UG_REQUEST_SELECT_NUMBER_OR_EMAIL:
80                         val = NULL;
81                         service_get_extra_data(service, CT_UG_BUNDLE_ACCOUNTID, &val);
82                         if(val) {
83                                 clist_d->list_op = CT_GET_LIST_PERSON_HAD_NUMBER_OR_EMAIL_OF_ADDRBOOK_ID;
84                                 clist_d->base_ab = atoi(val);
85                                 free(val);
86                         }
87                         else {
88                                 clist_d->list_op = CT_GET_LIST_ALL_PERSON_HAD_NUMBER_OR_EMAIL;
89                         }
90                         break;
91                 case CT_UG_REQUEST_UPDATE_CONTACT:
92                         val = NULL;
93                         service_get_extra_data(service, CT_UG_BUNDLE_ACCOUNTID, &val);
94                         if(val) {
95                                 clist_d->list_op = CT_GET_LIST_PERSON_OF_ADDRBOOK_ID;
96                                 clist_d->base_ab = atoi(val);
97                                 free(val);
98                         }
99                         service_get_extra_data(service, CT_UG_BUNDLE_NUM, &clist_d->ug_data);
100                         if(clist_d->ug_data)
101                                 break;
102                         service_get_extra_data(service, CT_UG_BUNDLE_EMAIL, &clist_d->ug_data);
103                         if(clist_d->ug_data)
104                                 break;
105                         service_get_extra_data(service, CT_UG_BUNDLE_WEB, &clist_d->ug_data);
106                         if(clist_d->ug_data)
107                                 break;
108                         break;
109                 case CT_UG_REQUEST_UPDATE_WITH_NUM:
110                         service_get_extra_data(service, CT_UG_BUNDLE_NUM, &clist_d->ug_data);
111                         val = NULL;
112                         service_get_extra_data(service, CT_UG_BUNDLE_ACCOUNTID, &val);
113                         if(val) {
114                                 clist_d->base_ab = atoi(val);
115                                 free(val);
116                         }
117                         clist_d->list_op = CT_GET_LIST_PERSON_OF_WRITABLE_ADDRBOOK_ID;
118                         break;
119                 case CT_UG_REQUEST_UPDATE_WITH_EMAIL:
120                         service_get_extra_data(service, CT_UG_BUNDLE_EMAIL, &clist_d->ug_data);
121                         val = NULL;
122                         service_get_extra_data(service, CT_UG_BUNDLE_ACCOUNTID, &val);
123                         if(val) {
124                                 clist_d->base_ab = atoi(val);
125                                 free(val);
126                         }
127                         clist_d->list_op = CT_GET_LIST_PERSON_OF_WRITABLE_ADDRBOOK_ID;
128                         break;
129                 case CT_UG_REQUEST_UPDATE_WITH_WEB:
130                         service_get_extra_data(service, CT_UG_BUNDLE_WEB, &clist_d->ug_data);
131                         val = NULL;
132                         service_get_extra_data(service, CT_UG_BUNDLE_ACCOUNTID, &val);
133                         if(val) {
134                                 clist_d->base_ab = atoi(val);
135                                 free(val);
136                         }
137                         clist_d->list_op = CT_GET_LIST_PERSON_OF_WRITABLE_ADDRBOOK_ID;
138                         break;
139                 case CT_UG_REQUEST_CHECK:
140                         val = NULL;
141                         service_get_extra_data(service, CT_UG_BUNDLE_ACCOUNTID, &val);
142                         if(val) {
143                                 clist_d->list_op = CT_GET_LIST_PERSON_OF_ADDRBOOK_ID;
144                                 clist_d->base_ab = atoi(val);
145                                 free(val);
146                         }
147                         else {
148                                 service_get_extra_data(service, CT_UG_BUNDLE_MAX, &val);
149                                 if (val) {
150                                         clist_d->cnt_max_check = atoi(val);
151                                         free(val);
152                                 }
153                         }
154                         break;
155                 case CT_UG_REQUEST_CHECK_FOR_NUMBER:
156                         val = NULL;
157                         service_get_extra_data(service, CT_UG_BUNDLE_ACCOUNTID, &val);
158                         if (val) {
159                                 clist_d->list_op = CT_GET_LIST_PERSON_HAD_NUMBER_OF_ADDRBOOK_ID;
160                                 clist_d->base_ab = atoi(val);
161                                 free(val);
162                         }
163                         else {
164                                 clist_d->list_op = CT_GET_LIST_ALL_PERSON_HAD_NUMBER;
165                                 service_get_extra_data(service, CT_UG_BUNDLE_MAX, &val);
166                                 if (val)
167                                         clist_d->cnt_max_check = atoi(val);
168                                 free(val);
169                         }
170                         break;
171                 case CT_UG_REQUEST_CHECK_FOR_EMAIL:
172                         val = NULL;
173                         service_get_extra_data(service, CT_UG_BUNDLE_ACCOUNTID, &val);
174                         if(val) {
175                                 clist_d->list_op = CT_GET_LIST_PERSON_HAD_EMAIL_OF_ADDRBOOK_ID;
176                                 clist_d->base_ab = atoi(val);
177                                 free(val);
178                         }
179                         else {
180                                 clist_d->list_op = CT_GET_LIST_ALL_PERSON_HAD_EMAIL;
181                                 service_get_extra_data(service, CT_UG_BUNDLE_MAX, &val);
182                                 if (val)
183                                         clist_d->cnt_max_check = atoi(val);
184                                 free(val);
185                         }
186                         break;
187                 case CT_UG_REQUEST_CHECK_FOR_NUMBER_OR_EMAIL:
188                         val = NULL;
189                         service_get_extra_data(service, CT_UG_BUNDLE_ACCOUNTID, &val);
190                         if (val) {
191                                 clist_d->list_op = CT_GET_LIST_PERSON_HAD_NUMBER_OR_EMAIL_OF_ADDRBOOK_ID;
192                                 clist_d->base_ab = atoi(val);
193                                 free(val);
194                         }
195                         else {
196                                 clist_d->list_op = CT_GET_LIST_ALL_PERSON_HAD_NUMBER_OR_EMAIL;
197                                 service_get_extra_data(service, CT_UG_BUNDLE_MAX, &val);
198                                 if (val)
199                                         clist_d->cnt_max_check = atoi(val);
200                                 free(val);
201                         }
202                         break;
203                         break;
204                 case PH_UG_REQUEST_SET_WITH_IMG:
205                 case PH_UG_REQUEST_SET_WITH_RINGTONE:
206                 case CT_UG_REQUEST_SAVE_IMG:
207                 case CT_UG_REQUEST_SAVE_RINGTONE:
208                         service_get_extra_data(service, CT_UG_BUNDLE_PATH, &clist_d->ug_data);
209                         if(CT_UG_REQUEST_SAVE_IMG == clist_d->ug_request)
210                                 clist_d->list_op = CT_GET_LIST_PERSON_OF_WRITABLE_ADDRBOOK_ID;
211                         if (-1 == access(clist_d->ug_data, R_OK)) {
212                                 ERR("Invalid filepath(%s)", clist_d->ug_data);
213                                 return -2;
214                         }
215                         break;
216                 default:
217                         ERR("Invalid request(%d)", clist_d->ug_request);
218                         return -1;
219                 }
220         }
221         return 0;
222 }
223
224 static void list_img_crop_result_for_add(ui_gadget_h ug,service_h service, void *data)
225 {
226         contacts_record_h record_image = NULL;
227         contacts_error_e err = CONTACTS_ERROR_NONE;
228         ct_detail_data *cdetail_d = data;
229
230         p_retm_if(NULL == ug || NULL == data, "ug or data is NULL");
231
232         if (service) {
233                 char *normal = NULL;
234                 char *full = NULL;
235
236                 service_get_extra_data(service, "crop_image_path", &normal);
237                 p_retm_if(!normal, "return value is NULL.\n");
238
239                 service_get_extra_data(service, "image_path", &full);
240                 record_image = ctui_get_record_image(cdetail_d->contact);
241
242                 err = contacts_record_set_str(record_image, _contacts_image.path, normal);
243                 p_warn_if(CONTACTS_ERROR_NONE != err, "contacts_record_set_str() Failed(%d)", err);
244
245                 free(normal);
246                 free(full);
247         }
248         cdetail_d->only_input = true;
249         ctui_create_input_view(cdetail_d);
250 }
251
252 static void list_destory_detail_child_ug(ui_gadget_h ug, void *priv)
253 {
254         ct_detail_data *cdetail_d = priv;
255         p_retm_if(NULL == ug, "ug is NULL");
256         ug_destroy(ug);
257
258         p_retm_if(NULL == priv, "priv is NULL");
259         cdetail_d->child_ug = NULL;
260 }
261
262 void ct_list_destroy_child_ug(void *data)
263 {
264         ct_list_data *clist_d = (ct_list_data*)data;
265         clist_d->child_ug = NULL;
266 }
267
268 API void ctui_list_update_with_data(ph_view_info *view_info, void *data, int person_id, int grp_id, int ab_id)
269 {
270         PH_FN_CALL;
271         ct_detail_data *cdetail_d;
272         contacts_error_e err = CONTACTS_ERROR_NONE;
273         contacts_record_h record = NULL;
274         struct ug_cbs cbs = {0};
275
276         cdetail_d = calloc(1, sizeof(ct_detail_data));
277         p_retm_if(!cdetail_d, "cdetail_d is NULL, Not enough memory");
278
279         cdetail_d->win = view_info->win;
280         cdetail_d->navi = view_info->navi;
281         cdetail_d->ug = view_info->ug;
282         cdetail_d->prev_navi_item = elm_naviframe_top_item_get(view_info->navi);
283         cdetail_d->prev_view_data = data;
284         cdetail_d->person_id = person_id;
285         cdetail_d->base_grp = grp_id;
286         cdetail_d->base_ab = ab_id;
287         cdetail_d->ug_request = view_info->ug_request;
288
289         if (person_id) {
290                 Eina_List *list_contact;
291                 err = contacts_db_get_record(_contacts_person._uri, person_id, &(cdetail_d->person));
292                 p_warn_if(CONTACTS_ERROR_NONE != err, "contacts_db_get_record() Failed(%d)", err);
293
294                 list_contact = ctui_person_get_writable_contact_list(person_id);
295                 if (NULL == list_contact) {
296                         err = contacts_record_create(_contacts_contact._uri, &(cdetail_d->contact));
297                         p_warn_if(CONTACTS_ERROR_NONE != err, "contacts_record_create() Failed(%d)", err);
298                 }
299                 else {
300                         err = contacts_record_clone((contacts_record_h)list_contact->data, &(cdetail_d->contact));
301                         p_warn_if(CONTACTS_ERROR_NONE != err, "contacts_record_clone() Failed(%d)", err);
302                         ctui_free_record_list(list_contact);
303                 }
304         }
305
306         if (NULL == cdetail_d->contact) {
307                 err = contacts_record_create(_contacts_contact._uri, &(cdetail_d->contact));
308                 p_warn_if(CONTACTS_ERROR_NONE != err, "contacts_record_create() Failed(%d)", err);
309         }
310
311         switch (view_info->ug_request) {
312                 //case PH_UG_REQUEST_SET_WITH_NUM:
313         case CT_UG_REQUEST_UPDATE_WITH_NUM:
314                 err = contacts_record_create(_contacts_number._uri, &record);
315                 p_warn_if(CONTACTS_ERROR_NONE != err, "contacts_record_create() Failed(%d)", err);
316
317                 err = contacts_record_set_str(record, _contacts_number.number, view_info->ug_data);
318                 p_warn_if(CONTACTS_ERROR_NONE != err, "contacts_record_set_str() Failed(%d)", err);
319
320                 err = contacts_record_set_int(record, _contacts_number.type, CONTACTS_NUMBER_TYPE_CELL);
321                 p_warn_if(CONTACTS_ERROR_NONE != err, "contacts_record_set_int() Failed(%d)", err);
322
323                 err = contacts_record_add_child_record(cdetail_d->contact, _contacts_contact.number, record);
324                 p_warn_if(CONTACTS_ERROR_NONE != err, "contacts_record_add_child_record() Failed(%d)", err);
325                 break;
326                 //case PH_UG_REQUEST_SET_WITH_EMAIL:
327         case CT_UG_REQUEST_UPDATE_WITH_EMAIL:
328                 err = contacts_record_create(_contacts_email._uri, &record);
329                 p_warn_if(CONTACTS_ERROR_NONE != err, "contacts_record_create() Failed(%d)", err);
330
331                 err = contacts_record_set_str(record, _contacts_email.email, view_info->ug_data);
332                 p_warn_if(CONTACTS_ERROR_NONE != err, "contacts_record_set_str() Failed(%d)", err);
333
334                 err = contacts_record_add_child_record(cdetail_d->contact, _contacts_contact.email, record);
335                 p_warn_if(CONTACTS_ERROR_NONE != err, "contacts_record_add_child_record() Failed(%d)", err);
336                 break;
337                 //case PH_UG_REQUEST_SET_WITH_WEB:
338         case CT_UG_REQUEST_UPDATE_WITH_WEB:
339                 err = contacts_record_create(_contacts_url._uri, &record);
340                 p_warn_if(CONTACTS_ERROR_NONE != err, "contacts_record_create() Failed(%d)", err);
341
342                 err = contacts_record_set_str(record, _contacts_url.url, view_info->ug_data);
343                 p_warn_if(CONTACTS_ERROR_NONE != err, "contacts_record_set_str() Failed(%d)", err);
344
345                 err = contacts_record_add_child_record(cdetail_d->contact, _contacts_contact.url, record);
346                 p_warn_if(CONTACTS_ERROR_NONE != err, "contacts_record_add_child_record() Failed(%d)", err);
347                 break;
348         case CT_UG_REQUEST_UPDATE_CONTACT:
349                 break;
350         case PH_UG_REQUEST_SET_WITH_IMG:
351         case CT_UG_REQUEST_SAVE_IMG: //only handle for add
352                 cbs.result_cb = list_img_crop_result_for_add;
353                 cbs.destroy_cb = list_destory_detail_child_ug;
354                 cbs.priv = cdetail_d;
355                 cdetail_d->child_ug = phone_image_crop_ug(cdetail_d->ug, view_info->ug_data, &cbs);
356                 return;
357         case PH_UG_REQUEST_SET_WITH_RINGTONE:
358         case CT_UG_REQUEST_SAVE_RINGTONE: //only handle for add
359                 err = contacts_record_set_str(cdetail_d->contact, _contacts_contact.ringtone_path, view_info->ug_data);
360                 p_warn_if(CONTACTS_ERROR_NONE != err, "contacts_record_set_str() Failed(%d)", err);
361                 break;
362         default:
363                 ERR("Invalid type(%d)", view_info->ug_request);
364                 break;
365         }
366         cdetail_d->only_input = true;
367         ctui_create_input_view(cdetail_d);
368         PH_FN_END;
369 }
370
371 void ct_list_call(void *data, Evas_Object *obj, void *event_info)
372 {
373         ct_list_data *clist_d;
374         ct_person_list *person_info = data;
375         p_retm_if(NULL == person_info, "parameter(person_info) is NULL");
376         p_retm_if(NULL == person_info->number || '\0' == *person_info->number, "number is NULL");
377         phone_launch_voice_call(person_info->id, person_info->number);
378
379         clist_d = (ct_list_data *)evas_object_data_get(obj, "clist_d");
380         if(clist_d)
381                 ctui_list_set_unsweep(clist_d);
382 }
383
384 void ct_list_msg(void *data, Evas_Object *obj, void *event_info)
385 {
386         ct_list_data *clist_d;
387         ct_person_list *person_info = data;
388
389         p_retm_if(NULL == data, "parameter(person_info) is NULL");
390         p_retm_if(NULL == person_info->number || '\0' == *person_info->number, "number is NULL");
391
392         clist_d = (ct_list_data *)evas_object_data_get(obj, "clist_d");
393         p_retm_if(NULL == clist_d, "evas_object_data_get() return NULL");
394
395         clist_d->child_ug = ctui_msg_ug(clist_d->ug, person_info->number, person_info->id, NULL,
396                         ct_list_destroy_child_ug, clist_d);
397
398         ctui_list_set_unsweep(clist_d);
399 }
400
401 void ct_list_popup_hide_cb(void *data, Evas_Object *obj, void *event_info)
402 {
403         ct_list_data *clist_d;
404
405         clist_d = evas_object_data_get(data, "clist_d");
406         p_retm_if(NULL == clist_d, "evas_object_data_get(clist_d) return NULL");
407         evas_object_del(clist_d->popup);
408         clist_d->popup = NULL;
409 }
410
411 static void list_sweep_delete_contact(void *data, Evas_Object *obj, void *event_info)
412 {
413         contacts_error_e err = CONTACTS_ERROR_NONE;
414         ct_list_data *clist_d;
415         contacts_record_h record = NULL;
416         int contact_id =0;
417
418         PH_DBG("##### [TSP_TEST] list->sweep delete start#####");
419
420         clist_d = evas_object_data_get(obj, "clist_d");
421         p_retm_if(NULL == clist_d, "evas_object_data_get() return NULL");
422         evas_object_del(clist_d->popup);
423         clist_d->popup = NULL;
424
425         evas_object_data_set(clist_d->navi, "ct_list_update_ui", (void *)1);
426
427         err = contacts_db_get_record(_contacts_person._uri,(int)data,&record);
428         p_retm_if(err != CONTACTS_ERROR_NONE, "contacts_db_get_record() fail");
429         err = contacts_record_get_int(record,_contacts_person.display_contact_id,&contact_id);
430         p_retm_if(err != CONTACTS_ERROR_NONE, "contacts_record_get_int() fail");
431         err = contacts_db_delete_record(_contacts_person._uri, (int)data);
432         if (CONTACTS_ERROR_NONE == err)
433                 phone_show_tickernoti(S_(PH_SYS_POP_DELETED));
434         else
435                 phone_show_tickernoti(S_(PH_SYS_POP_FAILED));
436 }
437
438
439 void ct_list_sweep_del_cb(void *data, Evas_Object *obj, void *event_info)
440 {
441         int id;
442         ct_list_data *clist_d;
443         Evas_Object *btn;
444
445         clist_d = evas_object_data_get(obj, "clist_d");
446         p_retm_if(NULL == clist_d, "evas_object_data_get() return NULL");
447
448         id = (int)data;
449         btn = phone_create_confirm_popup(&clist_d->popup, clist_d->win, S_(PH_SYS_POP_DELETE_Q), list_sweep_delete_contact, (void *)id);
450         evas_object_data_set(btn,"clist_d", clist_d);
451
452         ctui_list_set_unsweep(clist_d);
453 }
454
455 void ct_list_get_title(ct_list_data *clist_d, int list_op, int id_ab, int id_grp)
456 {
457         char *title = NULL;
458         contacts_error_e err = CONTACTS_ERROR_NONE;
459         contacts_record_h record = NULL;
460         char* group_system_id = NULL;
461
462         // TODO: Fixme
463         switch(list_op) {
464         case CT_GET_LIST_ALL_PERSON:
465         case CT_GET_LIST_PERSON_OF_WRITABLE_ADDRBOOK_ID:
466         case CT_GET_LIST_ALL_PERSON_HAD_EMAIL:
467         case CT_GET_LIST_ALL_PERSON_HAD_NUMBER:
468                 {
469                         char buf[PH_TEXT_SHORT_LEN];
470                         snprintf(buf, sizeof(buf), "%s (%d)", T_(CT_GET_TEXT_BASIC, CTTEXT_ALL_CONTACTS), clist_d->cnt_list_total);
471                         clist_d->title = strdup(buf);
472                 }
473                 break;
474         case CT_GET_LIST_PERSON_OF_ADDRBOOK_ID:
475         case CT_GET_LIST_PERSON_HAD_NUMBER_OF_ADDRBOOK_ID:
476         case CT_GET_LIST_PERSON_HAD_EMAIL_OF_ADDRBOOK_ID:
477                 if (0 < id_ab) {
478                         char temp[PH_TEXT_MAX_LEN];
479                         temp[0] = '\0';
480                         ctui_get_addressbook_name(id_ab, temp, sizeof(temp));
481                         if (*temp)
482                                 title = strdup(temp);
483                 }
484                 else
485                         title = strdup(T_(CT_GET_TEXT_BASIC, CTTEXT_PHONE));
486                 clist_d->sub_title = title;
487                 clist_d->title = strdup(T_(CT_GET_TEXT_BASIC, CTTEXT_ALL_CONTACTS));
488                 break;
489         case CT_GET_LIST_PERSON_OF_GROUP_ID:
490         case CT_GET_LIST_PERSON_HAD_NUMBER_OF_GROUP_ID:
491         case CT_GET_LIST_PERSON_HAD_EMAIL_OF_GROUP_ID:
492                 err = contacts_db_get_record(_contacts_group._uri, id_grp, &record);
493                 p_retm_if(CONTACTS_ERROR_NONE != err, "contacts_db_record_get() Failed(%d)", err);
494
495                 err = contacts_record_get_str_p(record, _contacts_group.extra_data, &group_system_id);
496                 p_warn_if(CONTACTS_ERROR_NONE != err, "contacts_record_get_str_p() Failed(%d)", err);
497                 if (group_system_id != NULL) {
498                         if (strcmp(group_system_id,"friends")==0)
499                                 clist_d->title = SAFE_STRDUP(T_(CT_GET_TEXT_BASIC, CTTEXT_FRIENDS));
500                         else if (strcmp(group_system_id,"family")==0)
501                                 clist_d->title = SAFE_STRDUP(T_(CT_GET_TEXT_BASIC, CTTEXT_FAMILY));
502                         else if (strcmp(group_system_id,"coworkers")==0)
503                                 clist_d->title = SAFE_STRDUP(T_(CT_GET_TEXT_BASIC, CTTEXT_CO_WORKERS));
504                         else
505                                 clist_d->title = SAFE_STRDUP(T_(CT_GET_TEXT_ERR, CTTEXT_NONAME));
506                 }else{
507                         err = contacts_record_get_str(record, _contacts_group.name, &(clist_d->title));
508                         p_warn_if(CONTACTS_ERROR_NONE != err, "contacts_record_get_str() Failed(%d)", err);
509                 }
510                 err = contacts_record_destroy(record, true);
511                 p_warn_if(CONTACTS_ERROR_NONE != err, "contacts_record_destroy() Failed(%d)", err);
512
513                 if(0 < id_ab) {
514                         char temp[PH_TEXT_MAX_LEN];
515                         temp[0] = '\0';
516                         ctui_get_addressbook_name(id_ab, temp, sizeof(temp));
517                         if (*temp)
518                                 title = strdup(temp);
519                 }
520                 else
521                         title = strdup(T_(CT_GET_TEXT_BASIC, CTTEXT_PHONE));
522                 clist_d->sub_title = title;
523                 break;
524         case CT_GET_LIST_PERSON_NOT_ASSIGNED_OF_ADDRBOOK_ID:
525         case CT_GET_LIST_PERSON_NOT_ASSIGNED_HAD_NUMBER_OF_ADDRBOOK_ID:
526         case CT_GET_LIST_PERSON_NOT_ASSIGNED_HAD_EMAIL_OF_ADDRBOOK_ID:
527                 clist_d->title = strdup(T_(CT_GET_TEXT_BASIC, CTTEXT_NOT_ASSIGNED));
528                 if(0 < id_ab) {
529                         char temp[PH_TEXT_MAX_LEN];
530                         temp[0] = '\0';
531                         ctui_get_addressbook_name(id_ab, temp, sizeof(temp));
532                         if (*temp)
533                                 title = strdup(temp);
534                 }
535                 else
536                         title = strdup(T_(CT_GET_TEXT_BASIC, CTTEXT_PHONE));
537                 clist_d->sub_title = title;
538                 break;
539
540         }
541 }
542
543 static void __list_add_contacts_to_favorite(ct_list_data *clist_d);
544
545 static void __list_add_contacts_to_favorite_cb(int err, void *data)
546 {
547         ct_list_data *clist_d = data;
548         ph_progress_info *p_info = NULL;
549
550         p_retm_if(NULL == clist_d, "Invalid parameter(clist_d is NULL)");
551         p_info = clist_d->p_info;
552         p_retm_if(NULL == p_info, "Invalid parameter(p_info is NULL)");
553
554         if (p_info->update_list) {
555                 contacts_list_destroy(p_info->update_list, true);
556                 p_info->update_list = NULL;
557         }
558
559         if (CONTACTS_ERROR_NONE != err || p_info->alive == false) {
560                 if (p_info->popup) {
561                         evas_object_del(p_info->popup);
562                         p_info->popup = NULL;
563                 }
564                 phone_show_tickernoti(S_(PH_SYS_POP_FAILED));
565                 free(p_info);
566                 clist_d->p_info = NULL;
567                 clist_d->updating = false;
568                 elm_naviframe_item_pop_to(evas_object_data_get(clist_d->navi, "navi_it_pop"));
569                 return;
570         }
571         else if (p_info->cnt == p_info->cnt_checked_total) {
572                 if (p_info->popup) {
573                         evas_object_del(p_info->popup);
574                         p_info->popup = NULL;
575                 }
576                 phone_show_tickernoti(S_(CT_SYS_POP_SUCCESS));
577                 free(p_info);
578                 clist_d->p_info = NULL;
579                 elm_naviframe_item_pop_to(evas_object_data_get(clist_d->navi, "navi_it_pop"));
580                 return;
581         }
582         else {
583                 __list_add_contacts_to_favorite(clist_d);
584         }
585
586 }
587
588 static void __list_add_contacts_to_favorite(ct_list_data *clist_d)
589 {
590         PH_FN_CALL;
591         const int LIST_BULK_LENGTH = 50;
592         int count = 0;
593         int base_count = 0;
594         double value = 0.0;
595         char percent_total[PH_TEXT_MAX_LEN+1] = {0, };
596         char percent[PH_TEXT_MAX_LEN+1] = {0, };
597         ph_progress_info *p_info = NULL;
598         contacts_record_h record = NULL;
599         contacts_list_h list = NULL;
600         contacts_error_e err = CONTACTS_ERROR_NONE;
601         Eina_List *l;
602         ct_person_list *person_info;
603
604         p_retm_if(NULL == clist_d, "parameter(clist_d) is NULL");
605         p_info = clist_d->p_info;
606         p_retm_if(NULL == p_info, "parameter(p_info) is NULL");
607
608         err = contacts_list_create(&list);
609         p_retm_if(CONTACTS_ERROR_NONE != err, "contacts_list_create() Failed(%d)", err);
610
611         EINA_LIST_FOREACH(clist_d->list, l, person_info) {
612                 if (NULL == person_info) continue;
613                 if (person_info->checked) {
614                         if (base_count < p_info->cnt) {
615                                 base_count++;
616                                 continue;
617                         }
618
619                         err = contacts_db_get_record(_contacts_person._uri, person_info->id, &record);
620                         if (CONTACTS_ERROR_NONE != err) {
621                                 ERR("contacts_db_get_record() Failed(%d)", err);
622                                 p_info->result = FALSE;
623                                 p_info->completed = true;
624                                 break;
625                         }
626                         err = contacts_record_set_bool(record, _contacts_person.is_favorite, true);
627                         if (CONTACTS_ERROR_NONE != err) {
628                                 ERR("contacts_record_set_bool() Failed(%d)", err);
629                                 p_info->result = FALSE;
630                                 p_info->completed = true;
631                                 break;
632                         }
633
634                         err = contacts_list_add(list, record);
635
636                         count++;
637                         if (LIST_BULK_LENGTH == count || (count + p_info->cnt) == p_info->cnt_checked_total) {
638                                 p_info->cnt += count;
639                                 break;
640                         }
641                 }
642         }
643         value = (double)p_info->cnt / (double)p_info->cnt_checked_total;
644         elm_progressbar_value_set(p_info->progressbar, value);
645         snprintf(percent, sizeof(percent), "%d%%", (int)(100.0 * (double)p_info->cnt/(double)p_info->cnt_checked_total));
646         snprintf(percent_total, sizeof(percent_total), "%d/%d", p_info->cnt, p_info->cnt_checked_total);
647         edje_object_part_text_set(elm_layout_edje_get(p_info->layout), "elm.text.subtext1", percent);
648         edje_object_part_text_set(elm_layout_edje_get(p_info->layout), "elm.text.subtext2", percent_total);
649
650         p_info->update_list = list;
651         contacts_db_update_records_async(list, __list_add_contacts_to_favorite_cb, clist_d);
652 }
653
654
655 void ct_list_add_contacts_to_favorite(Evas_Object *win, Evas_Object *navi, int cnt)
656 {
657         ct_list_data *clist_d;
658         ph_progress_info *p_info;
659
660         clist_d = evas_object_data_get(navi, "favor_list_d");
661         p_retm_if(NULL == clist_d, "evas_object_data_get return NULL");
662
663         p_retm_if(clist_d->p_info, "thread is running");
664
665         p_info = calloc(1, sizeof(ph_progress_info));
666         p_retm_if(NULL == p_info, "calloc return NULL");
667
668         clist_d->p_info = p_info;
669         p_info->cnt_checked_total = cnt;
670         p_info->alive = true;
671         p_info->result = TRUE;
672         p_info->popup = phone_progressbar_popup(win, p_info, T_(CT_GET_TEXT_BASIC, CTTEXT_ADDING_ING));
673         __list_add_contacts_to_favorite(clist_d);
674 }
675
676 static void __list_add_group_relation(int group_id, int person_id, contacts_list_h list_result)
677 {
678         contacts_record_h record_group = NULL;
679         contacts_list_h list = NULL;
680         contacts_filter_h filter = NULL;
681         contacts_query_h query = NULL;
682         contacts_error_e err = CONTACTS_ERROR_NONE;
683
684         p_retm_if(group_id <= 0, "Invalid parameter(group_id is %d)", group_id);
685         p_retm_if(person_id <= 0, "Invalid parameter(person_id is %d)", person_id);
686         p_retm_if(NULL == list_result, "Invalid parameter(list is NULL)");
687
688         do {
689                 int address_book_id = 0;
690                 if (CONTACTS_ERROR_NONE != (err = contacts_db_get_record(_contacts_group._uri, group_id, &record_group))) break;
691                 if (CONTACTS_ERROR_NONE != (err = contacts_record_get_int(record_group, _contacts_group.address_book_id, &address_book_id))) break;
692
693                 if (CONTACTS_ERROR_NONE != (err = contacts_query_create(_contacts_contact._uri, &query))) break;
694                 if (CONTACTS_ERROR_NONE != (err = contacts_filter_create(_contacts_contact._uri, &filter))) break;
695                 if (CONTACTS_ERROR_NONE != (err = contacts_filter_add_int(filter, _contacts_contact.address_book_id, CONTACTS_MATCH_EQUAL, address_book_id))) break;
696                 if (CONTACTS_ERROR_NONE != (err = contacts_filter_add_operator(filter, CONTACTS_FILTER_OPERATOR_AND))) break;
697                 if (CONTACTS_ERROR_NONE != (err = contacts_filter_add_int(filter, _contacts_contact.person_id, CONTACTS_MATCH_EQUAL, person_id))) break;
698                 if (CONTACTS_ERROR_NONE != (err = contacts_query_set_filter(query, filter))) break;
699                 if (CONTACTS_ERROR_NONE != (err = contacts_db_get_records_with_query(query, 0, 0, &list))) break;
700
701                 while (CONTACTS_ERROR_NONE == err) {
702                         contacts_record_h record = NULL;
703                         contacts_record_h record_clone = NULL;
704                         contacts_record_h record_group_relation = NULL;
705                         if (CONTACTS_ERROR_NONE != (err = contacts_list_get_current_record_p(list, &record))) break;
706                         if (CONTACTS_ERROR_NONE != (err = contacts_record_clone(record, &record_clone))) {
707                                 ERR("contacts_record_clone() Failed(%d)", err);
708                                 break;
709                         }
710                         if (CONTACTS_ERROR_NONE != (err = contacts_record_create(_contacts_group_relation._uri, &record_group_relation))) {
711                                 ERR("contacts_record_create() Failed(%d)", err);
712                                 break;
713                         }
714                         contacts_record_set_int(record_group_relation, _contacts_group_relation.group_id, group_id);
715                         contacts_record_add_child_record(record_clone, _contacts_contact.group_relation, record_group_relation);
716                         contacts_list_add(list_result, record_clone);
717
718                         err = contacts_list_next(list);
719                 }
720                 contacts_filter_destroy(filter);
721                 contacts_query_destroy(query);
722                 contacts_list_destroy(list, true);
723                 contacts_record_destroy(record_group, true);
724                 return;
725         }while (0);
726         contacts_filter_destroy(filter);
727         contacts_query_destroy(query);
728         contacts_list_destroy(list, true);
729         contacts_record_destroy(record_group, true);
730         return;
731 }
732
733 static void __list_add_contacts_to_group(ct_list_data *clist_d);
734
735 static void __list_add_contacts_to_group_cb(int err, void *data)
736 {
737         ct_list_data *clist_d = data;
738         ph_progress_info *p_info = NULL;
739
740         p_retm_if(NULL == clist_d, "Invalid parameter(clist_d is NULL)");
741         p_info = clist_d->p_info;
742         p_retm_if(NULL == p_info, "Invalid parameter(p_info is NULL)");
743
744         if (p_info->update_list) {
745                 contacts_list_destroy(p_info->update_list, true);
746                 p_info->update_list = NULL;
747         }
748
749         if (CONTACTS_ERROR_NONE != err || p_info->alive == false) {
750                 char *err_msg = NULL;
751                 if (p_info->popup) {
752                         evas_object_del(p_info->popup);
753                         p_info->popup = NULL;
754                 }
755                 switch (err) {
756                 case CONTACTS_ERROR_DB:
757                         err_msg = T_(CT_GET_TEXT_ERR, CTTEXT_ERR_DB_LOCKED);
758                         break;
759                 case CONTACTS_ERROR_FILE_NO_SPACE:
760                         err_msg = S_(CT_SYS_POP_NOT_ENOUGH_MEMORY);
761                         break;
762                 default:
763                         err_msg = S_(PH_SYS_POP_FAILED);
764                         break;
765                 }
766
767                 phone_show_tickernoti(err_msg);
768                 free(p_info);
769                 clist_d->p_info = NULL;
770                 clist_d->updating = false;
771                 elm_naviframe_item_pop_to(evas_object_data_get(clist_d->navi, "navi_it_pop"));
772                 return;
773         }
774         else if (p_info->cnt == p_info->cnt_checked_total) {
775                 if (p_info->popup) {
776                         evas_object_del(p_info->popup);
777                         p_info->popup = NULL;
778                 }
779                 phone_show_tickernoti(S_(CT_SYS_POP_SUCCESS));
780                 free(p_info);
781                 clist_d->p_info = NULL;
782                 elm_naviframe_item_pop_to(evas_object_data_get(clist_d->navi, "navi_it_pop"));
783                 return;
784         }
785         else {
786                 __list_add_contacts_to_group(clist_d);
787         }
788 }
789
790
791 static void __list_add_contacts_to_group(ct_list_data *clist_d)
792 {
793         PH_FN_CALL;
794         const int LIST_BULK_LENGTH = 50;
795         int count = 0;
796         int base_count = 0;
797         double value = 0.0;
798         char percent_total[PH_TEXT_MAX_LEN+1] = {0, };
799         char percent[PH_TEXT_MAX_LEN+1] = {0, };
800
801         contacts_list_h list = NULL;
802         contacts_error_e err = CONTACTS_ERROR_NONE;
803         ph_progress_info *p_info = NULL;
804         Eina_List *l = NULL;
805         ct_person_list *person_info = NULL;
806
807         p_retm_if(NULL == clist_d, "parameter(clist_d) is NULL");
808         p_info = clist_d->p_info;
809         p_retm_if(NULL == p_info, "parameter(p_info) is NULL");
810
811         err = contacts_list_create(&list);
812         p_retm_if(CONTACTS_ERROR_NONE != err, "contacts_list_create() Failed(%d)", err);
813
814         EINA_LIST_FOREACH(clist_d->list, l, person_info) {
815                 if (NULL == person_info) continue;
816
817                 if (person_info->checked) {
818                         if (base_count < p_info->cnt) {
819                                 base_count++;
820                                 continue;
821                         }
822
823                         __list_add_group_relation(clist_d->base_grp, person_info->id, list);
824
825                         count++;
826                         if (LIST_BULK_LENGTH == count || (count + p_info->cnt) == p_info->cnt_checked_total) {
827                                 p_info->cnt += count;
828                                 break;
829                         }
830                 }
831         }
832
833         value = (double)p_info->cnt / (double)p_info->cnt_checked_total;
834         elm_progressbar_value_set(p_info->progressbar, value);
835         snprintf(percent, sizeof(percent), "%d%%", (int)(100.0 * (double)p_info->cnt/(double)p_info->cnt_checked_total));
836         snprintf(percent_total, sizeof(percent_total), "%d/%d", p_info->cnt, p_info->cnt_checked_total);
837         edje_object_part_text_set(elm_layout_edje_get(p_info->layout), "elm.text.subtext1", percent);
838         edje_object_part_text_set(elm_layout_edje_get(p_info->layout), "elm.text.subtext2", percent_total);
839
840         p_info->update_list = list;
841         contacts_db_update_records_async(list, __list_add_contacts_to_group_cb, clist_d);
842 }
843
844
845 void ct_list_add_contacts_to_group(Evas_Object *win, Evas_Object *navi, int cnt)
846 {
847         PH_FN_CALL;
848         ct_list_data *clist_d;
849         ph_progress_info *p_info;
850
851         clist_d = evas_object_data_get(navi, "gadd_list_d");
852         p_retm_if(NULL == clist_d, "evas_object_data_get return NULL");
853
854         p_retm_if(clist_d->p_info, "thread is running");
855
856         p_info = calloc(1, sizeof(ph_progress_info));
857         p_retm_if(NULL == p_info, "calloc return NULL");
858
859         clist_d->p_info = p_info;
860         p_info->cnt_checked_total = cnt;
861         p_info->alive = true;
862         p_info->result = TRUE;
863         p_info->popup = phone_progressbar_popup(win, p_info, T_(CT_GET_TEXT_BASIC, CTTEXT_ADDING_MEMBERS_TO_GROUP));
864         __list_add_contacts_to_group(clist_d);
865 }
866