summaryrefslogtreecommitdiff
path: root/lib-contact/ct-setting/src/CtSettingView.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lib-contact/ct-setting/src/CtSettingView.cpp')
-rw-r--r--lib-contact/ct-setting/src/CtSettingView.cpp503
1 files changed, 503 insertions, 0 deletions
diff --git a/lib-contact/ct-setting/src/CtSettingView.cpp b/lib-contact/ct-setting/src/CtSettingView.cpp
new file mode 100644
index 0000000..bc846cb
--- /dev/null
+++ b/lib-contact/ct-setting/src/CtSettingView.cpp
@@ -0,0 +1,503 @@
+/*
+ * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
+ *
+ * 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 <map>
+#include <string>
+#include <vector>
+
+#include <app.h>
+#include <contacts.h>
+#include <notification.h>
+
+#include "WNaviframe.h"
+#include "WWindow.h"
+#include "WPopup.h"
+#include "WToastPopup.h"
+#include "WGenlistItem.h"
+#include "ContactsDebug.h"
+#include "CtType.h"
+#include "ContactsAppControlLauncher.h"
+#include "ContactsAppControl.h"
+
+#include "CtContactsToVcard.h"
+#include "CtString.h"
+#include "CtSettingData.h"
+#include "CtSettingView.h"
+#include "CtSettingRadioPopup.h"
+#include "CtSettingPopup.h"
+#include "CtImporter.h"
+
+#define MYFILE_UG "ug-myfile-efl"
+
+class __SortByItem: public WGenlistItem
+{
+public:
+ __SortByItem( CtSettingData* data ) { __data = data; }
+ virtual ~__SortByItem(){}
+public:
+ virtual Elm_Genlist_Item_Class* getItemClassNew() {
+ Elm_Genlist_Item_Class* itc = elm_genlist_item_class_new();
+ WPRET_VM(!itc, NULL, "elm_genlist_item_class_new() failed");
+ itc->item_style = "type1";
+ itc->func.text_get = [](void* data, Evas_Object* obj, const char* part)->char*
+ {
+ __SortByItem* p = static_cast<__SortByItem*>(data);
+
+ if(!strcmp(part, "elm.text")) {
+ return strdup(V_("IDS_PB_MBODY_SORT_BY"));
+ }
+ else if(!strcmp(part, "elm.text.sub")){
+ if ( p->__data->getSortMode() == CtSettingData::SORT_MODE_FIRST_NAME)
+ return strdup(V_("IDS_PB_OPT_FIRST_NAME"));
+ else
+ return strdup(V_("IDS_PB_BODY_LAST_NAME_ABB"));
+ }
+ return NULL;
+ };
+ itc->func.del = WGENLIST_ITEM_DEL();
+ return itc;
+ }
+private:
+ __SortByItem();
+ CtSettingData* __data;
+};
+
+class __DisplayNameByItem: public WGenlistItem
+{
+public:
+ __DisplayNameByItem( CtSettingData* data ) { __data = data; }
+ virtual ~__DisplayNameByItem(){}
+public:
+ virtual Elm_Genlist_Item_Class* getItemClassNew() {
+ Elm_Genlist_Item_Class* itc = elm_genlist_item_class_new();
+ WPRET_VM(!itc, NULL, "elm_genlist_item_class_new() failed");
+ itc->item_style = "type1";
+ itc->func.text_get = __getText;
+ itc->func.del = WGENLIST_ITEM_DEL();
+ return itc;
+ }
+private:
+ static char* __getText(void* data, Evas_Object* obj, const char* part ) {
+ __DisplayNameByItem* p = static_cast<__DisplayNameByItem*>(data);
+ if(!strcmp(part, "elm.text")) {
+ return strdup(V_("IDS_PB_TMBODY_NAME_FORMAT"));
+ }
+ else if(!strcmp(part, "elm.text.sub")) {
+ if ( p->__data->getNameOrder() == CtSettingData::NAME_ORDER_FIRST_NAME_FIRST)
+ return strdup(V_("IDS_PB_OPT_FIRST_NAME_FIRST_ABB"));
+ else
+ return strdup(V_("IDS_PB_OPT_LAST_NAME_FIRST_ABB"));
+ }
+ return NULL;
+ }
+private:
+ __DisplayNameByItem();
+ CtSettingData* __data;
+};
+
+class __ImportItem : public WGenlistItem
+{
+public:
+ __ImportItem(){}
+ virtual ~__ImportItem(){}
+public:
+ virtual Elm_Genlist_Item_Class* getItemClassNew() {
+ Elm_Genlist_Item_Class* itc = elm_genlist_item_class_new();
+ WPRET_VM(!itc, NULL, "elm_genlist_item_class_new() failed");
+ itc->item_style = "type1";
+ itc->func.text_get = [](void* data, Evas_Object* obj, const char* part)->char* {
+ if(!strcmp(part, "elm.text")) {
+ return strdup(V_("IDS_PB_MBODY_IMPORT"));
+ }
+ return NULL;
+ };
+ itc->func.del = WGENLIST_ITEM_DEL();
+ return itc;
+ }
+};
+
+class __ExportItem : public WGenlistItem
+{
+public:
+ __ExportItem() {}
+ virtual ~__ExportItem(){}
+public:
+ virtual Elm_Genlist_Item_Class* getItemClassNew() {
+ Elm_Genlist_Item_Class* itc = elm_genlist_item_class_new();
+ WPRET_VM(!itc, NULL, "elm_genlist_item_class_new() failed");
+ itc->item_style = "type1";
+ itc->func.text_get = [](void* data, Evas_Object* obj, const char* part)->char* {
+ if(!strcmp(part, "elm.text")) {
+ return strdup(V_("IDS_PB_MBODY_EXPORT"));
+ }
+ return NULL;
+ };
+ itc->func.del = WGENLIST_ITEM_DEL();
+ return itc;
+ }
+};
+
+class __SendContactInformationItem: public WGenlistItem
+{
+public:
+ __SendContactInformationItem( CtSettingData* data ) { __data = data; }
+ virtual ~__SendContactInformationItem(){}
+public:
+ virtual Elm_Genlist_Item_Class* getItemClassNew() {
+ Elm_Genlist_Item_Class* itc = elm_genlist_item_class_new();
+ WPRET_VM(!itc, NULL, "elm_genlist_item_class_new() failed");
+ itc->item_style = "type1";
+ itc->func.text_get = __getText;
+ itc->func.del = WGENLIST_ITEM_DEL();
+ return itc;
+ }
+private:
+ static char* __getText( void* data, Evas_Object* obj, const char* part ) {
+ __SendContactInformationItem* p = static_cast<__SendContactInformationItem*>(data);
+ if(!strcmp(part, "elm.text")) {
+ return strdup(V_("IDS_PB_MBODY_SEND_CONTACT_INFORMATION_ABB"));
+ }
+ else if(!strcmp(part, "elm.text.sub")) {
+ if ( p->__data->getSendMode() == CtSettingData::SEND_MODE_TOGETHER)
+ return strdup(V_("IDS_PB_MBODY_SEND_TOGETHER_ABB"));
+ else
+ return strdup(V_("IDS_PB_MBODY_SEND_INDIVIDUALLY_ABB"));
+ }
+
+ return NULL;
+ }
+private:
+ __SendContactInformationItem();
+ CtSettingData* __data;
+};
+
+CtSettingView::CtSettingView()
+: __genlist(NULL)
+, __settingData(NULL)
+, __importAbId(0)
+, __popupIdler(NULL)
+, __ctToDispItem(NULL)
+{
+ WHIT();
+}
+
+CtSettingView::~CtSettingView()
+{
+ WHIT();
+
+ ContactsAppControlLauncher::getInstance().terminate();
+ if(__popupIdler)
+ ecore_idler_del(__popupIdler);
+
+ delete __settingData;
+}
+
+const char* CtSettingView::getClassName()
+{
+ return "CtSettingView";
+
+
+}
+
+Evas_Object* CtSettingView::onCreate( Evas_Object* parent, void* viewParam)
+{
+ WHIT();
+
+ setTitle(V_("IDS_PB_HEADER_SETTINGS"));
+
+ __settingData = new CtSettingData();
+ __settingData->init();
+ __settingData->addListener(this);
+
+ Evas_Object* layout = elm_layout_add(parent);
+ evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_layout_theme_set(layout, "layout", "application", "default");
+
+ __genlist = elm_genlist_add(parent);
+ if (__genlist == NULL) {
+ WERROR("elm_genlist_add failed");
+ return NULL;
+ }
+
+ elm_genlist_mode_set(__genlist, ELM_LIST_COMPRESS);
+ elm_genlist_homogeneous_set(__genlist, EINA_TRUE);
+ elm_object_part_content_set(layout, "elm.swallow.content", __genlist);
+ evas_object_show(layout);
+
+ Elm_Genlist_Item_Class* itc = NULL;
+ WGenlistItem* item = NULL;
+
+ item = new __SortByItem(__getSettingData() );
+ item->setElmObjectItem( elm_genlist_item_append(__genlist, itc = item->getItemClassNew(), item, NULL, ELM_GENLIST_ITEM_NONE, __onSortByItemSelectedCb, this) );
+ elm_genlist_item_class_free(itc);
+
+ item = new __DisplayNameByItem(__getSettingData() );
+ item->setElmObjectItem( elm_genlist_item_append(__genlist, itc = item->getItemClassNew(), item, NULL, ELM_GENLIST_ITEM_NONE, __onDisplayNameByItemSelectedCb, this));
+ elm_genlist_item_class_free(itc);
+
+ item = new __ImportItem();
+ item->setElmObjectItem( elm_genlist_item_append(__genlist, itc = item->getItemClassNew(), item, NULL, ELM_GENLIST_ITEM_NONE, __onImportItemSelectedCb, this));
+ elm_genlist_item_class_free(itc);
+
+ item = new __ExportItem();
+ item->setElmObjectItem( elm_genlist_item_append(__genlist, itc = item->getItemClassNew(), item, NULL, ELM_GENLIST_ITEM_NONE, __onExportItemSelectedCb, this));
+ elm_genlist_item_class_free(itc);
+
+ return layout;
+}
+
+void CtSettingView::onDestroy()
+{
+ WHIT();
+ destroyPopup();
+ ContactsAppControlLauncher::getInstance().terminate();
+}
+
+CtSettingData* CtSettingView::__getSettingData()
+{
+ return __settingData;
+}
+
+void CtSettingView::onPushed(Elm_Object_Item* naviItem)
+{
+ WHIT();
+
+ elm_naviframe_item_title_enabled_set(naviItem, EINA_TRUE, EINA_TRUE);
+}
+
+void CtSettingView::onEvent(int eventType)
+{
+ elm_genlist_realized_items_update(__genlist);
+}
+
+void CtSettingView::__onSortByItemSelectedCb(void *data, Evas_Object *obj, void *event_info)
+{
+ elm_genlist_item_selected_set((Elm_Object_Item *)event_info, EINA_FALSE);
+ CtSettingView* p = static_cast<CtSettingView*>(data);
+ CtSettingData::SortMode sortMode = p->__getSettingData()->getSortMode();
+
+ std::vector<std::string> label = {V_("IDS_PB_OPT_FIRST_NAME"), V_("IDS_PB_BODY_LAST_NAME_ABB")};
+
+ Elm_Object_Item* objItem = (Elm_Object_Item *)event_info;
+ CtSettingData* settingData = p->__getSettingData();
+
+ CtSettingRadioPopup* popup = new CtSettingRadioPopup(label, sortMode == CtSettingData::SORT_MODE_FIRST_NAME ? 0 : 1);
+ popup->setTextTranslatable(PACKAGE);
+ popup->setTitle( "IDS_PB_MBODY_SORT_BY");
+ popup->setOnResultCb([popup,objItem, settingData](int index){
+ WDEBUG("item %d selected", index);
+ if (index == 0)
+ settingData->setSortMode(CtSettingData::SORT_MODE_FIRST_NAME);
+ else
+ settingData->setSortMode(CtSettingData::SORT_MODE_LAST_NAME);
+
+ elm_genlist_item_fields_update( objItem, "elm.text.sub", ELM_GENLIST_ITEM_FIELD_TEXT);
+ popup->destroy();
+ });
+ p->attachPopup( popup );
+}
+
+void CtSettingView::__onDisplayNameByItemSelectedCb(void *data, Evas_Object *obj, void *event_info)
+{
+ elm_genlist_item_selected_set((Elm_Object_Item *)event_info, EINA_FALSE);
+ CtSettingView* p = static_cast<CtSettingView*>(data);
+ CtSettingData::NameOrder nameOrder = p->__getSettingData()->getNameOrder();
+
+ std::vector<std::string> label = {V_("IDS_PB_OPT_FIRST_NAME_FIRST_ABB"), V_("IDS_PB_OPT_LAST_NAME_FIRST_ABB")};
+ Elm_Object_Item* objItem = (Elm_Object_Item *)event_info;
+ CtSettingData* settingData = p->__getSettingData();
+
+ CtSettingRadioPopup* popup = new CtSettingRadioPopup(label, nameOrder == CtSettingData::NAME_ORDER_FIRST_NAME_FIRST ? 0 : 1);
+ popup->setTextTranslatable(PACKAGE);
+ popup->setTitle( "IDS_PB_TMBODY_NAME_FORMAT");
+ popup->setOnResultCb([popup,objItem, settingData](int index){
+ WDEBUG("item %d selected", index);
+ if (index == 0)
+ settingData->setNameOrder(CtSettingData::NAME_ORDER_FIRST_NAME_FIRST);
+ else
+ settingData->setNameOrder(CtSettingData::NAME_ORDER_LAST_NAME_FIRST);
+
+ elm_genlist_item_fields_update(objItem, "elm.text.sub", ELM_GENLIST_ITEM_FIELD_TEXT);
+ popup->destroy();
+ });
+ p->attachPopup( popup );
+}
+
+void CtSettingView::__onImportItemSelectedCb(void *data, Evas_Object *obj, void *event_info)
+{
+ const int deviceAbId = 0;
+ elm_genlist_item_selected_set((Elm_Object_Item *)event_info, EINA_FALSE);
+ CtSettingView* view = static_cast<CtSettingView*>(data);
+
+ view->__importFromStorage(true, deviceAbId);
+}
+
+void CtSettingView::__onExportItemSelectedCb(void *data, Evas_Object *obj, void *event_info)
+{
+ elm_genlist_item_selected_set((Elm_Object_Item *)event_info, EINA_FALSE);
+ CtSettingView* p = static_cast<CtSettingView*>(data);
+
+ p->__exportContactsTo(TargetStorage::DEVICE);
+}
+
+void CtSettingView::__importFromStorage(bool phone, int abId)
+{
+ WHIT();
+ __importAbId = abId;
+
+ app_control_h service;
+
+ app_control_create(&service);
+ if (phone)
+ app_control_add_extra_data(service, "path", "/opt/usr/media");
+ else
+ app_control_add_extra_data(service, "path", "/opt/storage/sdcard");
+
+ app_control_add_extra_data(service, "select_type", "IMPORT_PATH_SELECT");
+ app_control_add_extra_data(service, "file_type", "vcf");
+
+ app_control_set_app_id(service, MYFILE_UG);
+ app_control_set_launch_mode(service, APP_CONTROL_LAUNCH_MODE_GROUP);
+
+ ContactsAppControlLauncher::getInstance().sendLaunchRequest(service, __importFromStrorageReplyCb, this, getNaviframe()->getEvasObj());
+}
+
+void CtSettingView::__importFromStrorageReplyCb(app_control_h request, app_control_h reply, app_control_result_e result, void *data)
+{
+ WPRET_M(NULL == data, "data is NULL");
+ CtSettingView* view = static_cast<CtSettingView*>(data);
+
+ std::vector<std::string> vcards;
+ char* val = NULL;
+ char* last = NULL;
+ app_control_get_extra_data(reply, "result", &val);
+
+ if (val == NULL)
+ return;
+
+ char* path = strtok_r(val, "?", &last);
+ while (path) {
+ vcards.push_back(path);
+ WHIT();
+ path = strtok_r(NULL, "?", &last);
+ }
+
+ free(val);
+
+ WHIT();
+ view->__excuteContactImporter(std::move(vcards));
+
+ return;
+}
+
+std::vector<int> __getPersonIdListFromReply(app_control_h reply)
+{
+ WHIT();
+ int length = 0;
+ char **resultArray = NULL;
+ std::vector<int> idList;
+
+ app_control_get_extra_data_array(reply, APP_CONTROL_DATA_SELECTED, &resultArray, &length);
+ idList.reserve(length);
+ for (int i = 0; i < length; ++i) {
+ int personId = atoi(resultArray[i]);
+ idList.push_back(personId);
+ free(resultArray[i]);
+ }
+ free(resultArray);
+ return idList;
+}
+
+void CtSettingView::__exportContactsTo(TargetStorage exportTo)
+{
+ WHIT();
+ if (exportTo == TargetStorage::DEVICE)
+ {
+ launchContactPick(APP_CONTROL_DATA_SELECTION_MODE_MULTIPLE,
+ APP_CONTROL_DATA_TYPE_ID, [](app_control_h request, app_control_h reply, app_control_result_e result, void *data){
+ CtSettingView *view = static_cast<CtSettingView*>(data);
+ view->__excuteContactExporter(TargetStorage::DEVICE, request, reply, result, data);
+ }, this);
+ }
+ else if (exportTo == TargetStorage::SD_CARD) {
+ launchContactPick(APP_CONTROL_DATA_SELECTION_MODE_MULTIPLE,
+ APP_CONTROL_DATA_TYPE_ID, [](app_control_h request, app_control_h reply, app_control_result_e result, void *data){
+ CtSettingView *view = static_cast<CtSettingView*>(data);
+ view->__excuteContactExporter(TargetStorage::SD_CARD, request, reply, result, data);
+ }, this);
+ }
+}
+
+void CtSettingView::__excuteContactExporter(TargetStorage saveTo, app_control_h request, app_control_h reply, app_control_result_e result, void *data)
+{
+ WHIT();
+ CtContactsToVcard *vcard = new CtContactsToVcard(V_("IDS_PB_HEADER_EXPORT_CONTACTS_ABB"), saveTo, __getPersonIdListFromReply(reply));
+ vcard->setOnFinish(std::bind(&CtSettingView::__createExportResultPopup, this, std::placeholders::_1));
+
+ attachPopup(vcard->getProgressPopup());
+ vcard->run();
+}
+
+void CtSettingView::__createExportResultPopup(CtProgressController &controller)
+{
+ WHIT();
+ CtContactsToVcard &vcard = static_cast<CtContactsToVcard&>(controller);
+
+ const char *deviceDirName = "Device";
+ const char *devicePosition = strstr(vcard.getVcardPath().c_str(), deviceDirName);
+ char content[CT_TEXT_SHORT_LEN] = { 0, };
+ snprintf(content, sizeof(content), ctGetContactsString("IDS_PB_POP_P1SD_CONTACTS_HAVE_BEEN_EXPORTED_TO_P2SS"), vcard.getTotalCount(), devicePosition);
+
+ WPopup *finishPopup = new WPopup();
+ finishPopup->setTextTranslatable(PACKAGE);
+ finishPopup->setTitle("IDS_PB_HEADER_CONTACTS_EXPORTED_ABB");
+ finishPopup->setContent(content);
+ finishPopup->addButton("IDS_PB_BUTTON_OK_ABB2", NULL);
+ attachPopup(finishPopup);
+}
+
+void CtSettingView::__excuteContactImporter(std::vector<std::string> vcards)
+{
+ WHIT();
+ int totalCount = 0;
+ for (auto &&vcard : vcards) {
+ int count = 0;
+ int err = contacts_vcard_get_entity_count(vcard.c_str(), &count);
+ if (err != CONTACTS_ERROR_NONE) {
+ WERROR("contacts_vcard_get_entity_count failed, vcard = %s", vcard.c_str());
+ }
+ totalCount += count;
+ }
+
+ CtImporter *contactImporter = new CtImporter(__importAbId, std::move(vcards), totalCount);
+ attachPopup(contactImporter->getProgressPopup());
+ attachHiddenPopup(contactImporter->getCancelPopup());
+ contactImporter->run();
+}
+
+void CtSettingView::onChanged()
+{
+ elm_genlist_realized_items_update(__genlist);
+}
+
+extern "C" {
+ WAPP_ASSIST_EXPORT WView* createSettingView() {
+ CtSettingView* view = new CtSettingView;
+ return view;
+ }
+}
+