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