diff options
Diffstat (limited to 'lib/settings/ct-setting-view.c')
-rwxr-xr-x | lib/settings/ct-setting-view.c | 1140 |
1 files changed, 1140 insertions, 0 deletions
diff --git a/lib/settings/ct-setting-view.c b/lib/settings/ct-setting-view.c new file mode 100755 index 0000000..e90a737 --- /dev/null +++ b/lib/settings/ct-setting-view.c @@ -0,0 +1,1140 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include <errno.h> +#include <fcntl.h> +#include <vconf.h> +#include <vconf-keys.h> +#include <unistd.h> +#include <pthread.h> +#include "phone.h" +#include "phone-common.h" +#include "ct-list.h" +#include "ct-setting-view.h" + +#define SETTING_VCARD_PATH "/opt/media/Backup/Contacts" +#define SETTING_TIMER_DURATION 0.2 + +enum SETTING_ITC_TYPE{ + SETTING_ITC_MY_NUM = 0, + SETTING_ITC_TEXT = 1, + SETTING_ITC_IMPORT = SETTING_ITC_TEXT, + SETTING_ITC_EXPORT = SETTING_ITC_TEXT, + SETTING_ITC_IMPORT_EXPORT = SETTING_ITC_TEXT, + SETTING_ITC_ORDER = 2, + SETTING_ITC_RADIO = 3, + SETTING_ITC_FIRSTLAST = SETTING_ITC_RADIO, + SETTING_ITC_LASTFIRST = SETTING_ITC_RADIO, + SETTING_ITC_SDN, + SETTING_ITC_MAX, +}; + +static Elm_Genlist_Item_Class setting_itcs[] = { + {.item_style="dialogue/2text.2"}, + {.item_style="dialogue.1text"}, + {.item_style="dialogue/2text.3/expandable"}, + {.item_style="dialogue/1text.1icon/expandable2"}, + {.item_style="dialogue/2text.2"}, +}; + +typedef enum { + CT_SETTING_IMPORT, + CT_SETTING_EXPORT, +} ct_setting_op; + +static void setting_order(int order_type) +{ + int ret; + + /* set ORDER_OF_DISPLAY */ + ret = contacts_svc_set_order(CTS_ORDER_OF_DISPLAY, order_type); + p_warn_if(CTS_SUCCESS != ret, "contacts_svc_set_order() Failed(%d)", ret); + + ret = contacts_svc_set_order(CTS_ORDER_OF_SORTING, order_type); + p_warn_if(CTS_SUCCESS != ret, "contacts_svc_set_order() Failed(%d)", ret); +} + +static void setting_order_ui(Evas_Object *genlist) +{ + int order; + ct_setting_data *csetting_d; + Elm_Object_Item *item_order; + + p_retm_if(NULL == genlist, "parameter(genlist) is NULL"); + + csetting_d = evas_object_data_get(genlist, "csetting_d"); + p_retm_if(NULL == csetting_d, "evas_object_data_get() return NULL"); + + order = contacts_svc_get_order(CTS_ORDER_OF_DISPLAY); + elm_radio_value_set(csetting_d->radio_grp, order); + + item_order = evas_object_data_get(genlist, "order"); + p_retm_if(NULL == item_order, "evas_object_data_get() return NULL"); + + elm_genlist_item_update(item_order); +} + +static void setting_handle_order(void *data, Evas_Object *obj, void *event_info) +{ + Elm_Object_Item *it = event_info; + elm_genlist_item_selected_set(it, EINA_FALSE); + + setting_order((int)data); + setting_order_ui(obj); +} + +static PTHREAD_FN setting_import_sim_contacts(void *data) +{ + ct_setting_data *csetting_d = data; + ph_progress_info *p_info = csetting_d->p_info; + p_info->result = contacts_svc_import_sim(); + p_info->completed = true; + pthread_exit(NULL); +} + +static Eina_Bool setting_import_sim_timer_cb(void *data) +{ + const char *message; + ct_setting_data *csetting_d = data; + ph_progress_info *p_info; + + p_retvm_if(NULL == csetting_d , ECORE_CALLBACK_CANCEL, "parameter(ct_setting_data) is NULL"); + p_info = csetting_d->p_info; + + if (!p_info->completed) + return ECORE_CALLBACK_RENEW; + + pthread_join(p_info->thread, NULL); + + if (CTS_SUCCESS == p_info->result) + message = T_(CT_GET_TEXT_BASIC, CTTEXT_IMPORTED); + else if (CTS_ERR_NO_DATA == p_info->result) + message = T_(CT_GET_TEXT_ERR, CTTEXT_IMPORT_SIM_NO_DATA); + else + message = S_(PH_SYS_POP_FAILED); + + evas_object_del(csetting_d->popup); + csetting_d->popup = NULL; + + free(p_info); + csetting_d->p_info = NULL; + + phone_show_tickernoti(message); + return ECORE_CALLBACK_CANCEL; +} + +static void setting_import_sim(ct_setting_data *csetting_d) +{ + int ret; + ph_progress_info *p_info; + + p_retm_if(csetting_d->p_info, "thread is running"); + + p_info = calloc(1, sizeof(ph_progress_info)); + p_retm_if(NULL == p_info, "calloc() return NULL"); + csetting_d->p_info = p_info; + p_info->alive = true; + p_info->result = TRUE; + p_info->without_cancel_btn = true; + ret = pthread_create(&p_info->thread, NULL, setting_import_sim_contacts, csetting_d ); + if (0 != ret) { + ERR("Thread creation failed(%d)", ret); + free(p_info); + csetting_d->p_info = NULL; + return; + } + + p_info->timer = ecore_timer_add(SETTING_TIMER_DURATION, setting_import_sim_timer_cb, csetting_d ); + if (NULL == p_info->timer) { + ERR("ecore_timer_add() return NULL"); + p_info->alive = false; + pthread_join(p_info->thread, NULL); + free(p_info); + csetting_d->p_info = NULL; + return; + } + csetting_d->popup = phone_progressbar_popup(csetting_d->navi, p_info, T_(CT_GET_TEXT_BASIC, CTTEXT_IMPORTING_SIM_CONTACTS)); +} + +static inline Eina_List* setting_get_contact_list(Eina_List *list_ab) +{ + int ret; + CTSiter *iter; + Eina_List *result; + Eina_List *l; + int id_ab; + void *data; + + result = NULL; + EINA_LIST_FOREACH(list_ab, l, data) { + id_ab = (int)data; + ret = contacts_svc_get_list_with_int(CTS_LIST_MEMBERS_OF_ADDRESSBOOK_ID, id_ab, &iter); + p_retvm_if(CTS_SUCCESS != ret, NULL, "contacts_svc_get_list...() Failed(%d)", ret); + + while (CTS_SUCCESS == contacts_svc_iter_next(iter)) { + CTSvalue *info = contacts_svc_iter_get_info(iter); + int id = contacts_svc_value_get_int(info, CTS_LIST_CONTACT_ID_INT); + result = eina_list_append(result, (void *)id); + contacts_svc_value_free(info); + } + contacts_svc_iter_remove(iter); + } + return result; +} + +static inline void setting_progress_fail(ph_progress_info *p_info) +{ + p_info->completed = true; + p_info->result = FALSE; + pthread_exit(NULL); +} + +static Eina_Bool setting_export_timer_cb(void *data) +{ + ct_setting_data *csetting_d = data; + ph_progress_info *p_info; + + p_retvm_if(NULL == csetting_d, ECORE_CALLBACK_CANCEL, "parameter(ct_setting_data) is NULL"); + p_info = csetting_d->p_info; + + if (!p_info->completed) { + char count[PH_TEXT_SHORT_LEN]; + char percent[PH_TEXT_SHORT_LEN]; + double value = (double)p_info->cnt/(double)p_info->cnt_checked_total; + + if (!p_info->alive) { + p_info->result = FALSE; + p_info->completed = true; + return ECORE_CALLBACK_RENEW; + } + + elm_progressbar_value_set(p_info->progressbar, value); + snprintf(percent, sizeof(percent), "%d%%", (int)(100.0*value)); + snprintf(count, sizeof(count), "%d/%d", p_info->cnt, p_info->cnt_checked_total); + edje_object_part_text_set(elm_layout_edje_get(p_info->layout), "elm.text.subtext1", percent); + edje_object_part_text_set(elm_layout_edje_get(p_info->layout), "elm.text.subtext2", count); + + if (p_info->cnt == p_info->cnt_checked_total) + p_info->completed = true; + + return ECORE_CALLBACK_RENEW; + } + else { + int ret; + const char *message; + + pthread_join(p_info->thread, NULL); + + if (p_info->result) { + message = T_(CT_GET_TEXT_BASIC, CTTEXT_EXPORTED); + ret = contacts_svc_end_trans(true); + } + else { + message = S_(PH_SYS_POP_FAILED); + ret = contacts_svc_end_trans(false); + } + p_warn_if(ret < CTS_SUCCESS, "contacts_svc_end_trans() Failed(%d)", ret); + + free(p_info); + csetting_d->p_info = NULL; + + if (csetting_d->list_export_ct) { + free(csetting_d->list_export_ct); + csetting_d->list_export_ct = NULL; + } + + evas_object_del(csetting_d->popup); + csetting_d->popup = NULL; + phone_show_tickernoti(message); + elm_naviframe_item_pop_to(csetting_d->navi_item_main); + return ECORE_CALLBACK_CANCEL; + } +} + +static Eina_Bool setting_import_timer_cb(void *data) +{ + ct_setting_data *csetting_d = data; + ph_progress_info *p_info; + + p_retvm_if(NULL == csetting_d, ECORE_CALLBACK_CANCEL, "parameter(ct_setting_data) is NULL"); + p_info = csetting_d->p_info; + + if (!p_info->completed) { + return ECORE_CALLBACK_RENEW; + } + else { + int ret; + const char *message; + + pthread_join(p_info->thread, NULL); + + if (p_info->result) { + message = T_(CT_GET_TEXT_BASIC, CTTEXT_IMPORTED); + ret = contacts_svc_end_trans(true); + } + else { + message = S_(PH_SYS_POP_FAILED); + ret = contacts_svc_end_trans(false); + } + p_warn_if(ret < CTS_SUCCESS, "contacts_svc_end_trans() Failed(%d)", ret); + + evas_object_del(csetting_d->popup); + csetting_d->popup = NULL; + phone_show_tickernoti(message); + + free(p_info); + csetting_d->p_info = NULL; + + elm_naviframe_item_pop_to(csetting_d->navi_item_main); + return ECORE_CALLBACK_CANCEL; + } +} + + +static PTHREAD_FN setting_export_contacts(void *data) +{ + int i; + int ret; + int fd; + ct_setting_data *csetting_d = data; + ph_progress_info *p_info = csetting_d->p_info; + + fd = open(csetting_d->path, O_WRONLY|O_CREAT|O_TRUNC, 0644); + if (fd < 0) { + ERR("open(%s) Failed", csetting_d->path); + setting_progress_fail(p_info); + } + + for (i=0;i<csetting_d->list_export_ct_cnt;i++) { + char* vcard; + CTSstruct *contact; + + if (!p_info->alive) { + p_info->result = FALSE; + p_info->completed = true; + break; + } + + ret = contacts_svc_get_contact(csetting_d->list_export_ct[i], &contact); + if (ret < CTS_SUCCESS) { + ERR("contacts_svc_get_contact() Failed(%d)", ret); + p_info->result = FALSE; + continue; + } + + ret = contacts_svc_get_vcard_from_contact(contact, &vcard); + contacts_svc_struct_free(contact); + if (ret < CTS_SUCCESS) { + ERR("contacts_svc_struct_free() Failed(%d)", ret); + p_info->result = FALSE; + continue; + } + + if (-1 == write(fd, vcard, strlen(vcard))) + ERR("write()... Failed(%s)", strerror(errno)); + p_info->cnt++; + free(vcard); + } + + ret = fsync(fd); + if (0 != ret) + ERR("fsync() failed(%d)", ret); + + close(fd); + if (!p_info->result) { + ret = unlink(csetting_d->path); + if (0 != ret) + ERR("unlink(%s) failed(%d)", csetting_d->path, ret); + } + + pthread_exit(NULL); +} + +static void setting_get_filename(char *fullpath, char *dest, int size_dest) +{ + char* index; + index = strrchr(fullpath, '/'); + snprintf(dest, size_dest, "%s", index + 1); +} + +static inline char* setting_export_get_filename(char *path) +{ + time_t timer; + struct tm *stime; + char buf[PH_TEXT_SHORT_LEN]; + + timer = time(NULL); + stime = localtime(&timer); + p_retvm_if(NULL == stime, NULL, "localtime() Failed(%d)", errno); + + snprintf(buf, sizeof(buf), "%s/contacts_%02d%02d%02d%02d%02d%02d.vcf", path, + stime->tm_year-100, stime->tm_mon+1, stime->tm_mday, + stime->tm_hour, stime->tm_min, stime->tm_sec); + + return strdup(buf); +} + +static void setting_export_myfile_ug_result(ui_gadget_h ug, service_h service, void *data) +{ + int ret; + char *val = NULL; + char title[PH_TEXT_MAX_LEN]; + char filepath[PH_TEXT_SHORT_LEN]; + ph_progress_info *p_info; + ct_setting_data *csetting_d = data; + + p_retm_if(csetting_d->p_info, "thread is running"); + p_retm_if(NULL == ug, "parameter(ug) is NULL"); + ug_destroy(ug); + + p_retm_if(NULL == data, "parameter(ct_setting_data) is NULL"); + csetting_d->child_ug = NULL; + + p_retm_if(NULL == service, "parameter(service) is NULL"); + + service_get_extra_data(service, "result", &val); + p_retm_if(NULL == val, "service_get_extra_data() return NULL"); + + p_info = calloc(1, sizeof(ph_progress_info)); + p_retm_if(NULL == p_info, "calloc() return NULL"); + csetting_d->p_info = p_info; + + p_info->cnt_checked_total = csetting_d->list_export_ct_cnt; + if (p_info->cnt_checked_total <= 0) { + char err[PH_TEXT_SHORT_LEN]; + ERR("cnt_checked_total is %d", p_info->cnt_checked_total); + free(p_info); + free(csetting_d->list_export_ct); + csetting_d->p_info = NULL; + csetting_d->list_export_ct = NULL; + snprintf(err, sizeof(err), "Fail (%s)", T_(CT_GET_TEXT_ERR, CTTEXT_NO_CONTACTS)); + phone_show_tickernoti(err); + return; + } + free(csetting_d->path); + csetting_d->path = setting_export_get_filename((char *)val); + free(val); + + p_info->alive = true; + p_info->result = TRUE; + setting_get_filename(csetting_d->path, filepath, sizeof(filepath)); + snprintf(title, sizeof(title), T_(CT_GET_TEXT_BASIC, CTTEXT_EXPORTING_CONTACTS_TO), filepath); + + ret = pthread_create(&p_info->thread, NULL, setting_export_contacts, csetting_d ); + if (0 != ret) { + ERR("Thread creation failed(%d)", ret); + free(p_info); + free(csetting_d->list_export_ct); + csetting_d->p_info = NULL; + csetting_d->list_export_ct = NULL; + return; + } + + p_info->timer = ecore_timer_add(SETTING_TIMER_DURATION, setting_export_timer_cb, csetting_d ); + if (NULL == p_info->timer) { + ERR("ecore_timer_add() return NULL"); + p_info->alive = false; + pthread_join(p_info->thread, NULL); + free(p_info); + free(csetting_d->list_export_ct); + csetting_d->p_info = NULL; + csetting_d->list_export_ct = NULL; + return; + } + + csetting_d->popup = phone_progressbar_popup(csetting_d->navi, p_info, title); +} + +static void setting_ug_destroy_cb(ui_gadget_h ug, void *priv) +{ + ct_setting_data *csetting_d = priv; + p_retm_if(NULL == ug, "parameter(ug) is NULL"); + ug_destroy(ug); + + p_retm_if(NULL == priv, "parameter(ct_setting_data) is NULL"); + csetting_d->child_ug = NULL; +} + +static void setting_export_contacts_myfile_ug(void *data) +{ + service_h service; + ui_gadget_h ug; + struct ug_cbs cbs = {0}; + ct_setting_data *csetting_d = data; + p_retm_if(NULL == csetting_d, "parameter(csetting_d) is NULL"); + + service_create(&service); + service_add_extra_data(service, "path", SETTING_VCARD_PATH); + service_add_extra_data(service, "select_type", "EXPORT"); + + cbs.result_cb = setting_export_myfile_ug_result; + cbs.layout_cb = ug_common_layout_cb; + cbs.destroy_cb = setting_ug_destroy_cb; + cbs.priv = csetting_d; + + ug = ug_create(csetting_d->ug, MYFILES_UG, UG_MODE_FULLVIEW, service, &cbs); + p_warn_if(NULL == ug, "ug_create() Failed"); + csetting_d->child_ug = ug; + + service_destroy(service); +} + +static int setting_import_vcard_foreach_cb(const char *a_vcard_stream, void *data) +{ + int ret; + ph_progress_info *p_info; + ct_setting_data *csetting_d = data; + + p_retvm_if(NULL == csetting_d, -1, "parameter(csetting_d) is NULL"); + + p_info = csetting_d->p_info; + p_retvm_if(NULL == p_info, -1, "csetting_d->p_info is NULL"); + + if (!p_info->alive) { + p_info->result = FALSE; + p_info->completed = true; + return -1; + } + + ret = contacts_svc_insert_vcard(0, a_vcard_stream); + if (ret <= 0) { + ERR("contacts_svc_insert_contact() Failed(%d)", ret); + return ret; + } + return CTS_SUCCESS; +} + +static PTHREAD_FN setting_import_vcard_contacts(void *data) +{ + int ret; + const char *path = NULL; + char *last = NULL; + ct_setting_data *csetting_d = data; + ph_progress_info *p_info = csetting_d->p_info; + + path = strtok_r(csetting_d->path, "?", &last); + while (path) { + PH_DBG("import vcard path = %s", path); + ret = contacts_svc_vcard_foreach(path, setting_import_vcard_foreach_cb, csetting_d); + if (CTS_SUCCESS != ret) { + p_info->result = FALSE; + ERR("contacts_svc_vcard_foreach() Failed(%d)", p_info->result); + break; + } + path = strtok_r(NULL, "?", &last); + } + p_info->completed = true; + pthread_exit(NULL); +} + + +static void setting_import_vcard_myfile_ug_result(ui_gadget_h ug, service_h service, void *data) +{ + int ret; + char *val = NULL; + ct_setting_data *csetting_d = data; + ph_progress_info *p_info; + + p_retm_if(NULL == ug, "parameter(ug) is NULL"); + ug_destroy(ug); + + p_retm_if(NULL == data, "parameter(ct_setting_data) is NULL"); + csetting_d->child_ug = NULL; + + p_retm_if(NULL == service, "parameter(result) is NULL"); + + service_get_extra_data(service, "result", &val); + p_retm_if(NULL == val, "service_get_extra_data() return NULL"); + + FREEandSTRDUP(csetting_d->path, val); + p_retm_if(NULL == csetting_d->path, "strdup() return NULL"); + + free(val); + + p_retm_if(csetting_d->p_info, "thread is running"); + + p_info = calloc(1, sizeof(ph_progress_info)); + p_retm_if(NULL == p_info, "calloc() return NULL"); + csetting_d->p_info = p_info; + p_info->alive = true; + p_info->result = TRUE; + + ret = contacts_svc_begin_trans(); + if (CTS_SUCCESS != ret) { + ERR("contacts_svc_begin_trans() Failed(%d)", ret); + free(p_info); + phone_show_tickernoti(S_(PH_SYS_POP_FAILED)); + elm_naviframe_item_pop(csetting_d->navi); + return; + } + + ret = pthread_create(&p_info->thread, NULL, setting_import_vcard_contacts, csetting_d); + if (0 != ret) { + ERR("Thread creation failed(%d)", ret); + contacts_svc_end_trans(false); + free(p_info); + csetting_d->p_info = NULL; + return; + } + + p_info->timer = ecore_timer_add(SETTING_TIMER_DURATION, setting_import_timer_cb, csetting_d ); + if (NULL == p_info->timer) { + ERR("ecore_timer_add() return NULL"); + contacts_svc_end_trans(false); + p_info->alive = false; + pthread_join(p_info->thread, NULL); + free(p_info); + csetting_d->p_info = NULL; + return; + } + csetting_d->popup = phone_progressbar_popup(csetting_d->navi, p_info, T_(CT_GET_TEXT_BASIC, CTTEXT_IMPORTING_SD_CONTACTS)); +} + +static void setting_import_vcard_myfile_ug(ct_setting_data *csetting_d) +{ + ui_gadget_h ug; + struct ug_cbs cbs = {0}; + service_h service; + + service_create(&service); + + service_add_extra_data(service, "path", SETTING_VCARD_PATH); + service_add_extra_data(service, "select_type", "IMPORT"); + service_add_extra_data(service, "file_type", "vcf"); + + cbs.result_cb = setting_import_vcard_myfile_ug_result; + cbs.destroy_cb = setting_ug_destroy_cb; + cbs.layout_cb = ug_common_layout_cb; + cbs.priv = csetting_d; + + ug = ug_create(csetting_d->ug, MYFILES_UG, UG_MODE_FULLVIEW, service, &cbs); + p_warn_if(NULL == ug, "ug_create() Failed"); + csetting_d->child_ug = ug; + + service_destroy(service); +} + +static PTHREAD_FN setting_export_sim_contacts(void *data) +{ + PH_FN_CALL; + int i; + ct_setting_data *csetting_d = data; + + csetting_d->p_info->result = CTS_SUCCESS; + for(i =0; i < csetting_d->list_export_ct_cnt ; i++) + { + if(1)//contacts_svc_export_sim(csetting_d->list_export_ct[i]) == CTS_SUCCESS) + { + sleep(1);//have to remove + csetting_d->p_info->cnt++; + } + else + { + csetting_d->p_info->result = CTS_ERR_FAIL; + ERR("contacts_svc_export_sim is Fail"); + } + } + pthread_exit(NULL); +} +static Eina_Bool setting_export_sim_timer_cb(void *data) +{ + PH_FN_CALL; + const char *message; + ct_setting_data *csetting_d = data; + ph_progress_info *p_info; + p_info = csetting_d->p_info; + + double value = (double)p_info->cnt/(double)p_info->cnt_checked_total; + p_retvm_if(NULL == csetting_d , ECORE_CALLBACK_CANCEL, "parameter(ct_setting_data) is NULL"); + p_info = csetting_d->p_info; + + if (!p_info->completed) + { + char count[PH_TEXT_SHORT_LEN]; + char percent[PH_TEXT_SHORT_LEN]; + if (!p_info->alive) + { + p_info->result = FALSE; + p_info->completed = true; + return ECORE_CALLBACK_RENEW; + } + elm_progressbar_value_set(p_info->progressbar, value); + snprintf(percent, sizeof(percent), "%d%%", (int)(100.0*value)); + snprintf(count, sizeof(count), "%d/%d", p_info->cnt, p_info->cnt_checked_total); + edje_object_part_text_set(elm_layout_edje_get(p_info->layout), "elm.text.subtext1", percent); + edje_object_part_text_set(elm_layout_edje_get(p_info->layout), "elm.text.subtext2", count); + + if (p_info->cnt == p_info->cnt_checked_total) + p_info->completed = true; + return ECORE_CALLBACK_RENEW; + } + pthread_join(p_info->thread, NULL); + + if (CTS_SUCCESS == p_info->result) + message = T_(CT_GET_TEXT_BASIC, CTTEXT_EXPORTED); + else + message = S_(PH_SYS_POP_FAILED); + + + evas_object_del(csetting_d->popup); + csetting_d->popup = NULL; + + free(p_info); + csetting_d->p_info = NULL; + + phone_show_tickernoti(message); + return ECORE_CALLBACK_CANCEL; +} +static void setting_export_sim(void *data, int *list, int cnt) +{ + PH_FN_CALL; + int ret; + ct_setting_data *csetting_d = data; + ph_progress_info *p_info; + char title[PH_TEXT_MAX_LEN]; + + if (NULL == csetting_d) { + ERR("parameter(csetting_d) is NULL"); + free(list); + return; + } + + if (cnt <= 0) { + ERR("evas_object_data_get() return NULL"); + free(list); + return; + } + + p_retm_if(csetting_d->p_info, "thread is running"); + p_info = calloc(1, sizeof(ph_progress_info)); + p_retm_if(NULL == p_info, "calloc() return NULL"); + + csetting_d->p_info = p_info; + p_info->cnt_checked_total = csetting_d->list_export_ct_cnt = cnt; + csetting_d->list_export_ct = list; + p_info->alive = true; + p_info->result = TRUE; + p_info->without_cancel_btn = true; + + ret = pthread_create(&p_info->thread, NULL, setting_export_sim_contacts, csetting_d ); + if (0 != ret) { + ERR("Thread creation failed(%d)", ret); + free(p_info); + csetting_d->p_info = NULL; + return; + } + + p_info->timer = ecore_timer_add(SETTING_TIMER_DURATION, setting_export_sim_timer_cb, csetting_d ); + if (NULL == p_info->timer) { + ERR("ecore_timer_add() return NULL"); + p_info->alive = false; + free(p_info); + csetting_d->p_info = NULL; + return; + } + snprintf(title, sizeof(title), T_(CT_GET_TEXT_BASIC, CTTEXT_EXPORTING_CONTACTS_TO), "SIM"); + csetting_d->popup = phone_progressbar_popup(csetting_d->navi, p_info, title); + + return; + +} +static void setting_import_export_sim_sel(void *data, Evas_Object *obj, void *event_info) +{ + ct_setting_data *csetting_d = data; + elm_genlist_item_selected_set(event_info, EINA_FALSE); + + if (CT_SETTING_IMPORT == csetting_d->mode) + setting_import_sim(csetting_d); + else {// CT_SETTING_EXPORT + ctui_create_list_select_view(csetting_d->navi, setting_export_sim, csetting_d,CT_GET_LIST_ALL_CONTACTS, 0, 0); + } +} + +static void setting_export_vcard_contacts(void *data, int *list, int cnt) +{ + ct_setting_data *csetting_d = data; + + if (NULL == csetting_d) { + ERR("parameter(csetting_d) is NULL"); + free(list); + return; + } + + if (cnt <= 0) { + ERR("evas_object_data_get() return NULL"); + free(list); + return; + } + + csetting_d->list_export_ct = list; + csetting_d->list_export_ct_cnt = cnt; + + setting_export_contacts_myfile_ug(data); +} + +static void setting_import_export_vcard_sel(void *data, Evas_Object *obj, void *event_info) +{ + ct_setting_data *csetting_d = data; + elm_genlist_item_selected_set(event_info, EINA_FALSE); + + if (CT_SETTING_IMPORT == csetting_d->mode) + setting_import_vcard_myfile_ug(csetting_d); + else {// CT_SETTING_EXPORT + ctui_create_list_select_view(csetting_d->navi, setting_export_vcard_contacts, csetting_d, + CT_GET_LIST_ALL_CONTACTS, 0, 0); + } +} + +static void setting_import_export(ct_setting_data *csetting_d) +{ + int sim_state; + char buf[PH_TEXT_SHORT_LEN]; + Evas_Object *genlist; + Evas_Object *l_btn; + Elm_Object_Item *item; + + genlist = elm_genlist_add(csetting_d->navi); + elm_object_style_set(genlist,"dialogue"); + vconf_get_int(VCONFKEY_TELEPHONY_SIM_PB_INIT, &sim_state); + + ctui_genlist_append_separator_20px_with_line(genlist); + + item = elm_genlist_item_append(genlist, &setting_itcs[SETTING_ITC_IMPORT_EXPORT], + S_(CT_SYS_BODY_SIM), NULL, ELM_GENLIST_ITEM_NONE, setting_import_export_sim_sel, csetting_d); + + item = elm_genlist_item_append(genlist, &setting_itcs[SETTING_ITC_IMPORT_EXPORT], + S_(CT_SYS_BODY_MEMORYCARD), NULL, ELM_GENLIST_ITEM_NONE, setting_import_export_vcard_sel, csetting_d); + + if (CT_SETTING_IMPORT == csetting_d->mode) + snprintf(buf, sizeof(buf), "%s", T_(CT_GET_TEXT_BASE_OP, CTTEXT_IMPORT_CONTACTS)); + else + snprintf(buf, sizeof(buf), "%s", T_(CT_GET_TEXT_BASE_OP, CTTEXT_EXPORT_CONTACTS)); + + l_btn = elm_button_add(csetting_d->navi); + evas_object_smart_callback_add(l_btn, "clicked", phone_view_back_btn_cb, csetting_d->navi); + elm_object_style_set(l_btn, "naviframe/back_btn/default"); + + elm_naviframe_item_push(csetting_d->navi, buf, l_btn, NULL, genlist, NULL); +} + +static void setting_export_contacts_cb(void *data, Evas_Object *obj, void *event_info) +{ + ct_setting_data *csetting_d = data; + elm_genlist_item_selected_set(event_info, EINA_FALSE); + + csetting_d->mode = CT_SETTING_EXPORT; + setting_import_export(csetting_d); +} + +static void setting_import_contacts_cb(void *data, Evas_Object *obj, void *event_info) +{ + ct_setting_data *csetting_d = data; + elm_genlist_item_selected_set(event_info, EINA_FALSE); + + csetting_d->mode = CT_SETTING_IMPORT; + setting_import_export(csetting_d); +} + +static void setting_order_item_sel(void *data, Evas_Object *obj, void *event_info) +{ + Elm_Object_Item *item = event_info; + elm_genlist_item_selected_set(item, EINA_FALSE); + + if (EINA_TRUE == elm_genlist_item_expanded_get(item)) + elm_genlist_item_expanded_set(item, EINA_FALSE); + else + elm_genlist_item_expanded_set(item, EINA_TRUE); +} + +static void setting_mynum_cb(void *data, Evas_Object *obj, void *event_info) +{ + Elm_Object_Item *it = event_info; + elm_genlist_item_selected_set(it, EINA_FALSE); +} + +static void setting_gl_exp(void *data, Evas_Object *obj, void *event_info) +{ + int order; + Evas_Object *genlist = obj; + Elm_Object_Item *it = event_info; + ct_setting_data *csetting_d = data; + + csetting_d->radio_grp = elm_radio_add(genlist); + + elm_genlist_item_append(genlist, &setting_itcs[SETTING_ITC_FIRSTLAST], + (void *)CTS_ORDER_NAME_FIRSTLAST, it, ELM_GENLIST_ITEM_NONE, + setting_handle_order, (void *)CTS_ORDER_NAME_FIRSTLAST); + elm_genlist_item_append(genlist, &setting_itcs[SETTING_ITC_LASTFIRST], + (void *)CTS_ORDER_NAME_LASTFIRST, it, ELM_GENLIST_ITEM_NONE, + setting_handle_order, (void *)CTS_ORDER_NAME_LASTFIRST); + + order = contacts_svc_get_order(CTS_ORDER_OF_DISPLAY); + elm_radio_value_set(csetting_d->radio_grp, order); +} + +static void setting_gl_con(void *data, Evas_Object *obj, void *event_info) +{ + ct_setting_data *csetting_d = data; + Elm_Object_Item *item = event_info; + elm_genlist_item_subitems_clear(item); + + p_retm_if(NULL == csetting_d, "parameter(csetting_d) is NUL"); + if(csetting_d->radio_grp) { + evas_object_del(csetting_d->radio_grp); + csetting_d->radio_grp = NULL; + } +} + +static char *setting_gl_text_label_get(void *data, Evas_Object *obj, const char *part) +{ + if (0 == strcmp(part, "elm.text")) + return strdup(data); + return NULL; +} + +static char *setting_gl_order_label_get(void *data, Evas_Object *obj, const char *part) +{ + if (0 == strcmp(part, "elm.text.1")) + return strdup(T_(CT_GET_TEXT_BASIC, CTTEXT_ORDER_DISPLAY_NAME)); + else if (0 == strcmp(part, "elm.text.2")) { + if (CTS_ORDER_NAME_FIRSTLAST == contacts_svc_get_order(CTS_ORDER_OF_DISPLAY)) + return strdup(T_(CT_GET_TEXT_BASE_OP, CTTEXT_FIRSTLAST)); + else + return strdup(T_(CT_GET_TEXT_BASE_OP, CTTEXT_LASTFIRST)); + } + return NULL; +} + +static char *setting_gl_radio_label_get(void *data, Evas_Object *obj, const char *part) +{ + int type = (int)data; + if (0 == strcmp(part, "elm.text")) { + if (CTS_ORDER_NAME_FIRSTLAST == type) + return strdup(T_(CT_GET_TEXT_BASE_OP, CTTEXT_FIRSTLAST)); + else if (CTS_ORDER_NAME_LASTFIRST == type) + return strdup(T_(CT_GET_TEXT_BASE_OP, CTTEXT_LASTFIRST)); + } + return NULL; +} + +static char *setting_gl_my_num_label_get(void *data, Evas_Object *obj, const char *part) +{ + if (0 == strcmp(part, "elm.text.2")) + return strdup(T_(CT_GET_TEXT_BASIC, CTTEXT_OWN_NUMBER)); + else if (0 == strcmp(part, "elm.text.1")) { + char *number = vconf_get_str(VCONFKEY_TELEPHONY_SUBSCRIBER_NUMBER); + if (number && *number) + return strdup(number); + else + return strdup(T_(CT_GET_TEXT_BASIC, CTTEXT_NA)); + } + return NULL; +} + +static Evas_Object *setting_gl_radio_icon_get(void *data, Evas_Object *obj, const char *part) +{ + int type = (int)data; + ct_setting_data *csetting_d; + + if (0 == strcmp(part, "elm.icon")) { + Evas_Object *radio; + + csetting_d = evas_object_data_get(obj, "csetting_d"); + p_retvm_if(NULL == csetting_d, NULL, "evas_object_data_get() return NULL"); + + radio = elm_radio_add(obj); + p_retvm_if(NULL == radio, NULL, "elm_radio_add() return NULL"); + + elm_radio_group_add(radio, csetting_d->radio_grp); + elm_radio_state_value_set(radio, type); + + return radio; + } + return NULL; +} + +static char* setting_gl_sdn_label_get(void *data, Evas_Object *obj, const char *part) +{ + ct_sdn_list *info = data; + p_retvm_if(NULL == data, NULL, "The parameter(data) is NULL"); + + if (0 == strcmp(part, "elm.text.2")) + return SAFE_STRDUP(info->name); + else if (0 == strcmp(part, "elm.text.1")) + return SAFE_STRDUP(info->number); + return NULL; +} + +static void setting_gl_sdn_del(void *data, Evas_Object *obj) +{ + ct_sdn_list *info = data; + p_retm_if(NULL == info, "parameter(info) is NULL"); + + free(info->name); + free(info->number); + free(info); +} + + +static inline void setting_create_itcs() +{ + setting_itcs[SETTING_ITC_TEXT].func.text_get = setting_gl_text_label_get; + + setting_itcs[SETTING_ITC_ORDER].func.text_get = setting_gl_order_label_get; + + setting_itcs[SETTING_ITC_RADIO].func.text_get = setting_gl_radio_label_get; + setting_itcs[SETTING_ITC_RADIO].func.content_get = setting_gl_radio_icon_get; + + setting_itcs[SETTING_ITC_MY_NUM].func.text_get = setting_gl_my_num_label_get; + + setting_itcs[SETTING_ITC_SDN].func.text_get = setting_gl_sdn_label_get; + setting_itcs[SETTING_ITC_SDN].func.del = setting_gl_sdn_del; +} + +static void setting_view_delete_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) +{ + int ret; + ct_setting_data *csetting_d = data; + p_retm_if(NULL == csetting_d, "parameter(csetting_d) is NULL"); + + if (csetting_d->popup) + evas_object_del(csetting_d->popup); + + if (csetting_d->p_info) { + csetting_d->p_info->alive = false; + pthread_join(csetting_d->p_info->thread, NULL); + + ret = contacts_svc_end_trans(false); + p_warn_if(ret < CTS_SUCCESS, "contacts_svc_end_trans() Failed(%d)", ret); + + ecore_timer_del(csetting_d->p_info->timer); + free(csetting_d->p_info); + csetting_d->p_info = NULL; + } + + if (csetting_d->child_ug); + ug_destroy(csetting_d->child_ug); + + free(csetting_d->path); + free(csetting_d); +} + +static void setting_gl_sdn_sel(void *data, Evas_Object *obj, void *event_info) +{ + Elm_Object_Item *item = event_info; + ct_sdn_list *info = elm_object_item_data_get(item); + + elm_genlist_item_selected_set(item, EINA_FALSE); + phone_launch_voice_call(0, info->number); +} + + +static Evas_Object* setting_fill_sdn_view(Evas_Object *parent, ct_setting_data *csetting_d) +{ + int ret; + CTSiter *iter; + CTSvalue *info; + Evas_Object *genlist; + + genlist = elm_genlist_add(parent); + elm_object_style_set(genlist,"dialogue"); + p_retvm_if(NULL == genlist, NULL, "elm_genlist_add() return NULL"); + + ctui_genlist_append_separator_20px_with_line(genlist); + + ret = contacts_svc_get_list(CTS_LIST_ALL_SDN, &iter); + p_retvm_if(CTS_SUCCESS != ret, NULL, "contacts_svc_get_list...() Failed(%d)", ret); + + csetting_d->cnt_sdn_list = 0; + while (CTS_SUCCESS == contacts_svc_iter_next(iter)) { + ct_sdn_list *data; + info = contacts_svc_iter_get_info(iter); + data = calloc(1, sizeof(ct_sdn_list)); + if (NULL == data) { + ERR("calloc() return NULL"); + break; + } + data->name = contacts_svc_value_steal_str(info, CTS_LIST_SDN_NAME_STR); + data->number = contacts_svc_value_steal_str(info, CTS_LIST_SDN_NUMBER_STR); + csetting_d->cnt_sdn_list++; + contacts_svc_value_free(info); + elm_genlist_item_append(genlist, &setting_itcs[SETTING_ITC_SDN], data, NULL, ELM_GENLIST_ITEM_NONE, setting_gl_sdn_sel, NULL); + } + contacts_svc_iter_remove(iter); + return genlist; +} + +static void setting_create_genlist_sdn(void *data, Evas_Object *obj, void *event_info) +{ + Evas_Object *back_btn; + Evas_Object *genlist; + ct_setting_data *csetting_d = data; + char buf[PH_TEXT_SHORT_LEN]; + + elm_genlist_item_selected_set(event_info, EINA_FALSE); + + genlist = setting_fill_sdn_view(csetting_d->navi, csetting_d); + + back_btn = elm_button_add(csetting_d->navi); + evas_object_smart_callback_add(back_btn, "clicked", phone_view_back_btn_cb, csetting_d->navi); + elm_object_style_set(back_btn, "naviframe/back_btn/default"); + + snprintf(buf, sizeof(buf), "%s (%d)", T_(CT_GET_TEXT_BASIC, CTTEXT_SDN), csetting_d->cnt_sdn_list); + + elm_naviframe_item_push(csetting_d->navi, buf, back_btn, NULL, genlist, NULL); +} + +Evas_Object* ct_setting_create_layout(ct_setting_data *csetting_d) +{ + Evas_Object *genlist; + Elm_Object_Item *item; + + setting_create_itcs(); + + genlist = elm_genlist_add(csetting_d->navi); + elm_object_style_set(genlist,"dialogue"); + evas_object_data_set(genlist, "csetting_d", csetting_d); + evas_object_event_callback_add(genlist, EVAS_CALLBACK_DEL, setting_view_delete_cb, csetting_d); + + ctui_genlist_append_separator_20px_with_line(genlist); + + elm_genlist_item_append(genlist, &setting_itcs[SETTING_ITC_IMPORT], + T_(CT_GET_TEXT_BASE_OP, CTTEXT_IMPORT_CONTACTS), NULL, ELM_GENLIST_ITEM_NONE, + setting_import_contacts_cb, csetting_d); + + elm_genlist_item_append(genlist, &setting_itcs[SETTING_ITC_EXPORT], + T_(CT_GET_TEXT_BASE_OP, CTTEXT_EXPORT_CONTACTS), NULL, ELM_GENLIST_ITEM_NONE, + setting_export_contacts_cb, csetting_d ); + + item = elm_genlist_item_append(genlist, &setting_itcs[SETTING_ITC_ORDER], + NULL, NULL, ELM_GENLIST_ITEM_TREE, setting_order_item_sel, NULL); + evas_object_data_set(genlist, "order", item); + + item = elm_genlist_item_append(genlist, &setting_itcs[SETTING_ITC_MY_NUM], + NULL, NULL, ELM_GENLIST_ITEM_NONE, setting_mynum_cb, NULL); + elm_genlist_item_select_mode_set(item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY); + + if (0 < contacts_svc_count(CTS_GET_COUNT_SDN)) + item = elm_genlist_item_append(genlist, &setting_itcs[SETTING_ITC_TEXT], + T_(CT_GET_TEXT_BASIC, CTTEXT_SDN), NULL, ELM_GENLIST_ITEM_NONE, setting_create_genlist_sdn, csetting_d); + + evas_object_smart_callback_add(genlist, "expanded", setting_gl_exp, csetting_d); + evas_object_smart_callback_add(genlist, "contracted", setting_gl_con, csetting_d); + + return genlist; +} + + |