TizenRefApp-8673 [Call UI] Implement ContactInfoProvider 98/133498/2
authorIgor Olshevskyi <i.olshevskyi@samsung.com>
Wed, 7 Jun 2017 05:58:40 +0000 (08:58 +0300)
committerIgor Olshevskyi <i.olshevskyi@samsung.com>
Thu, 15 Jun 2017 08:31:01 +0000 (11:31 +0300)
Change-Id: I11c6fe251559ba16c3dd87bf4eb65809d1009aa7

17 files changed:
src/model/ActiveCall.cpp
src/model/CallInfo.cpp
src/model/CallInfo.h
src/model/CallManager.cpp
src/model/CallManager.h
src/model/ConferenceCallInfo.cpp
src/model/ConferenceCallInfo.h
src/model/ContactInfo.cpp
src/model/ContactInfo.h
src/model/ContactInfoProvider.cpp [new file with mode: 0644]
src/model/ContactInfoProvider.h [new file with mode: 0644]
src/model/HeldCall.cpp
src/model/IncomingCall.cpp
src/model/SoundManager.cpp
src/model/implTypes.h
src/types.cpp
tizen-manifest.xml

index f945ed856e84499ccfc936dd112d3d43525e9b37..ba4bbdf8c17875f0720ac9d6ac5ffdb5d9514d25 100644 (file)
@@ -55,7 +55,9 @@ namespace callui {
 
        Result ActiveCall::prepare(cm_call_data_h callData)
        {
-               m_callInfo = CallInfo::newInstance(m_cm->getCallClient(), callData);
+               m_callInfo = CallInfo::newInstance(m_cm->getCallClient(),
+                               callData,
+                               m_cm->getContactInfoProvider());
                if (!m_callInfo) {
                        LOG_RETURN_VALUE(RES_FAIL, RES_FAIL, "CallInfo::newInstance() failed!");
                }
index 2119de3e8579f896615438b8a94a8d326e52853f..3a52533604ed39e282219b1727d6d81fb69aec5c 100644 (file)
@@ -21,8 +21,9 @@
 #include <glib/gtypes.h>
 #include <sys/sysinfo.h>
 
-#include "ContactInfo.h"
 #include "CallClient.h"
+#include "ContactInfoProvider.h"
+#include "ContactInfo.h"
 #include "ConferenceCallInfo.h"
 
 #include "common.h"
@@ -76,7 +77,9 @@ namespace callui {
        {
        }
 
-       CallInfoSRef CallInfo::newInstance(CallClient &client, cm_call_data_h callData)
+       CallInfoSRef CallInfo::newInstance(CallClient &client,
+                       cm_call_data_h callData,
+                       ContactInfoProviderSRef callInfoProvider)
        {
                if (!client) {
                        LOG_RETURN_VALUE(RES_FAIL, {}, "client is NULL");
@@ -87,11 +90,16 @@ namespace callui {
                }
 
                auto result = makeShared<CallInfo>();
-               FAIL_RETURN_VALUE(result->prepare(client, callData), {}, "result->prepare() failed!");
+               FAIL_RETURN_VALUE(result->prepare(client,
+                               callData,
+                               callInfoProvider),
+                               {}, "result->prepare() failed!");
                return result;
        }
 
-       Result CallInfo::prepare(CallClient &client, cm_call_data_h callData)
+       Result CallInfo::prepare(CallClient &client,
+                       cm_call_data_h callData,
+                       ContactInfoProviderSRef callInfoProvider)
        {
                Result res = convertCMResult(
                                cm_call_data_get_call_id(callData, &m_callId));
@@ -132,10 +140,10 @@ namespace callui {
                                cm_call_data_get_person_id(callData, &personId));
                FAIL_RETURN(res, "cm_call_data_get_person_id() failed!");
 
-               if (personId >= 0) {
-                       m_contactInfo = ContactInfo::newInstance(personId);
+               if (personId >= 0 && callInfoProvider) {
+                       m_contactInfo = callInfoProvider->createContactInfo(personId);
                        if (!m_contactInfo) {
-                               LOG_RETURN(RES_FAIL, "ContactInfo::newInstance() failed!");
+                               LOG_RETURN(RES_FAIL, "createContactInfo() failed!");
                        }
                }
 
@@ -143,14 +151,15 @@ namespace callui {
                FAIL_RETURN(res, "cm_call_data_get_call_member_count() failed!");
 
                if (m_confMemberCount > 1) {
-                       res = initConferenceCallInfoList(client);
+                       res = initConferenceCallInfoList(client, callInfoProvider);
                        FAIL_RETURN(res, "initConferenceCallInfoList() failed!");
                }
 
                return RES_OK;
        }
 
-       Result CallInfo::initConferenceCallInfoList(CallClient &client)
+       Result CallInfo::initConferenceCallInfoList(CallClient &client,
+                       ContactInfoProviderSRef callInfoProvider)
        {
                // XXX: must be initialized with nullptr. If not an there is no conference calls
                // cm_get_conference_callList return CM_ERROR_NONE and pointer will be not changed.
@@ -162,7 +171,9 @@ namespace callui {
                        res = RES_OK;
                        GSList *l = callList;
                        for (; l != nullptr; l = g_slist_next(l)) {
-                               auto confCallInfo = ConferenceCallInfo::newInstance(static_cast<cm_conf_call_data_t *>(l->data));
+                               auto confCallInfo = ConferenceCallInfo::newInstance(
+                                               static_cast<cm_conf_call_data_t *>(l->data),
+                                               callInfoProvider);
                                if (!confCallInfo) {
                                        LOG_BREAK(res = RES_OUT_OF_MEMORY, "ConferenceCallInfo::newInstance() failed!");
                                }
index 5a0d57e29ba069eb777ec57654121691ad10a59a..835f8e1cc54e9699c2c70764c353edab77086c7d 100644 (file)
@@ -27,7 +27,9 @@ namespace callui {
 
        class CallInfo final : public ICallInfo {
        public:
-               static CallInfoSRef newInstance(CallClient &client, cm_call_data_h callData);
+               static CallInfoSRef newInstance(CallClient &client,
+                               cm_call_data_h callData,
+                               ContactInfoProviderSRef callInfoProvider);
                virtual ~CallInfo();
 
                // ICallInfo
@@ -47,8 +49,11 @@ namespace callui {
                friend class ucl::RefCountObj<CallInfo>;
                CallInfo();
 
-               ucl::Result prepare(CallClient &client, cm_call_data_h callData);
-               ucl::Result initConferenceCallInfoList(CallClient &client);
+               ucl::Result prepare(CallClient &client,
+                               cm_call_data_h callData,
+                               ContactInfoProviderSRef callInfoProvider);
+               ucl::Result initConferenceCallInfoList(CallClient &client,
+                               ContactInfoProviderSRef callInfoProvider);
 
        private:
                unsigned int m_callId;
index df9089c20787b757c3404ac9bc52433be2803fdf..c3de082347af2011300b66f75fa1f95a31ff44b9 100644 (file)
@@ -25,6 +25,8 @@
 #include "HeldCall.h"
 #include "EndCall.h"
 
+#include "ContactInfoProvider.h"
+
 #include "CallInfo.h"
 #include "ConferenceCallInfo.h"
 
@@ -67,6 +69,11 @@ namespace callui {
 
        Result CallManager::prepare()
        {
+               m_contactInfoProvider = ContactInfoProvider::newInstance();
+               if (!m_contactInfoProvider) {
+                       ELOG("ContactInfoProvider::newInstance() failed");
+               }
+
                FAIL_RETURN(initCalls(), "initCalls() failed!");
 
                FAIL_RETURN(convertCMResult(
@@ -214,6 +221,11 @@ namespace callui {
                return endCall((*iter)->getCallId(), CallReleaseType::BY_CALL_HANDLE);
        }
 
+       ContactInfoProviderSRef CallManager::getContactInfoProvider()
+       {
+               return m_contactInfoProvider;
+       }
+
        RejectMsgProviderSRef CallManager::getRejectMsgProvider()
        {
                if (!m_rejectMsgProvider) {
index c1b24f5250bb89326faf9a596df5fe51f14e5469..b4412ba9beca81ee865f58a332c7e2fa4969f0a6 100644 (file)
@@ -39,6 +39,7 @@ namespace callui {
                ucl::Result endCall(unsigned int callId, CallReleaseType type);
                ucl::Result splitCalls(CallInfoSRef callInfo,
                                const IConferenceCallInfoSCRef &confCallInfo);
+               ContactInfoProviderSRef getContactInfoProvider();
                RejectMsgProviderSRef getRejectMsgProvider();
 
                ucl::Result processOutgoingCall(const std::string &telNum);
@@ -79,6 +80,7 @@ namespace callui {
        private:
                CallClientSRef m_callClient;
                RejectMsgProviderSRef m_rejectMsgProvider;
+               ContactInfoProviderSRef m_contactInfoProvider;
                ICallManagerListenerWRef m_listener;
                IncomingCallSRef m_incomingCall;
                ActiveCallSRef m_activeCall;
index 669f24f95a53a08b9f5cec441db55943a81abd65..3d3ebf2adbb6d81c474de6e9f2b68fa9f4c49dbb 100644 (file)
@@ -18,6 +18,7 @@
 
 #include <call-manager-ext.h>
 
+#include "ContactInfoProvider.h"
 #include "ContactInfo.h"
 
 #include "common.h"
@@ -35,37 +36,44 @@ namespace callui {
        {
        }
 
-       ConferenceCallInfoSRef ConferenceCallInfo::newInstance(cm_conf_call_data_t *confCallData)
+       ConferenceCallInfoSRef ConferenceCallInfo::newInstance(
+                       cm_conf_call_data_t *confCallData,
+                       ContactInfoProviderSRef callInfoProvider)
        {
                if (!confCallData) {
                        LOG_RETURN_VALUE(RES_FAIL, {}, "callData is NULL");
                }
 
                auto result = makeShared<ConferenceCallInfo>();
-               FAIL_RETURN_VALUE(result->prepare(confCallData), {}, "result->prepare() failed!");
+               FAIL_RETURN_VALUE(result->prepare(confCallData, callInfoProvider), {}, "result->prepare() failed!");
                return result;
        }
 
-       Result ConferenceCallInfo::prepare(cm_conf_call_data_t *confCallData)
+       Result ConferenceCallInfo::prepare(
+                       cm_conf_call_data_t *confCallData,
+                       ContactInfoProviderSRef callInfoProvider)
        {
-               Result res = convertCMResult(cm_conf_call_data_get_call_id(confCallData, &m_callId));
+               Result res = convertCMResult(
+                               cm_conf_call_data_get_call_id(confCallData, &m_callId));
                FAIL_RETURN(res, "cm_conf_call_data_get_call_id() failed!");
 
                char *number = nullptr;
-               res = convertCMResult(cm_conf_call_data_get_call_number(confCallData, &number));
+               res = convertCMResult(
+                               cm_conf_call_data_get_call_number(confCallData, &number));
                FAIL_RETURN(res, "cm_conf_call_data_get_call_number() failed!");
                m_phoneNum = nz(number);
                // XXX: According to documentation it must be free, but it leads to crash
 //             free(number);
 
                int personId = -1;
-               res = convertCMResult(cm_conf_call_data_get_person_id(confCallData, &personId));
+               res = convertCMResult(
+                               cm_conf_call_data_get_person_id(confCallData, &personId));
                FAIL_RETURN(res, "cm_conf_call_data_get_person_id() failed!");
 
-               if (personId >= 0) {
-                       m_contactInfo = ContactInfo::newInstance(personId);
+               if (personId >= 0 && callInfoProvider) {
+                       m_contactInfo = callInfoProvider->createContactInfo(personId);
                        if (!m_contactInfo) {
-                               LOG_RETURN_VALUE(RES_FAIL, RES_FAIL, "ContactInfo::newInstance() failed!");
+                               LOG_RETURN_VALUE(RES_FAIL, RES_FAIL, "createContactInfo() failed!");
                        }
                }
                return RES_OK;
index 374c46f22e2dae2420ab18ca1cf6c4ff556248e2..b3b0fd9f63ea2cd56ab454d0e2f238736365c7c8 100644 (file)
@@ -27,7 +27,9 @@ namespace callui {
 
        class ConferenceCallInfo final : public IConferenceCallInfo {
        public:
-               static ConferenceCallInfoSRef newInstance(cm_conf_call_data_t *confCallData);
+               static ConferenceCallInfoSRef newInstance(
+                               cm_conf_call_data_t *confCallData,
+                               ContactInfoProviderSRef callInfoProvider);
                virtual ~ConferenceCallInfo();
 
                // IConferenceCallInfo
@@ -40,7 +42,8 @@ namespace callui {
                friend class ucl::RefCountObj<ConferenceCallInfo>;
                ConferenceCallInfo();
 
-               ucl::Result prepare(cm_conf_call_data_t *confCallData);
+               ucl::Result prepare(cm_conf_call_data_t *confCallData,
+                               ContactInfoProviderSRef callInfoProvider);
        private:
                unsigned int m_callId;
                std::string m_phoneNum;
index 5dc6a8ac948133f2f23196deef99b79c19b0bc3e..2724f572c16a9c35db305a53ad3776afa6b6302c 100644 (file)
@@ -15,7 +15,6 @@
  */
 
 #include <call-manager-extension.h>
-#include <contacts.h>
 
 #include "ContactInfo.h"
 
@@ -25,9 +24,14 @@ namespace callui {
 
        using namespace ucl;
 
-       ContactInfo::ContactInfo(int personId):
+       ContactInfo::ContactInfo(int personId,
+                       const std::string &name,
+                       const std::string &imagePath,
+                       ContactNameSourceType type):
                        m_personId(personId),
-                       m_nameSource(ContactNameSourceType::INVALID)
+                       m_name(name),
+                       m_imagePath(imagePath),
+                       m_nameSource(type)
        {
        }
 
@@ -35,92 +39,12 @@ namespace callui {
        {
        }
 
-       ContactInfoSRef ContactInfo::newInstance(int personId)
+       ContactInfoSRef ContactInfo::newInstance(int personId,
+                       const std::string &name,
+                       const std::string &imagePath,
+                       ContactNameSourceType type)
        {
-               auto result = makeShared<ContactInfo>(personId);
-               FAIL_RETURN_VALUE(result->prepare(), {}, "result->prepare() failed!");
-               return result;
-       }
-
-       inline ContactNameSourceType ContactInfo::convertContactNameSourceType(contacts_display_name_source_type_e cdbType)
-       {
-               switch (cdbType) {
-               case CONTACTS_DISPLAY_NAME_SOURCE_TYPE_INVALID:  return ContactNameSourceType::INVALID;
-               case CONTACTS_DISPLAY_NAME_SOURCE_TYPE_EMAIL:    return ContactNameSourceType::EMAIL;
-               case CONTACTS_DISPLAY_NAME_SOURCE_TYPE_NUMBER:   return ContactNameSourceType::NUMBER;
-               case CONTACTS_DISPLAY_NAME_SOURCE_TYPE_NICKNAME: return ContactNameSourceType::NICKNAME;
-               case CONTACTS_DISPLAY_NAME_SOURCE_TYPE_COMPANY:  return ContactNameSourceType::COMPANY;
-               case CONTACTS_DISPLAY_NAME_SOURCE_TYPE_NAME:     return ContactNameSourceType::NAME;
-               default:
-                       return ContactNameSourceType::INVALID;
-               }
-       }
-
-       Result ContactInfo::prepare()
-       {
-               DLOG("Contact exists with index [%d]", m_personId);
-
-               contacts_filter_h filter = nullptr;
-               contacts_list_h list = nullptr;
-               contacts_query_h query = nullptr;
-               contacts_record_h record = nullptr;
-
-               contacts_filter_create(_contacts_contact._uri, &filter);
-               contacts_filter_add_int(filter, _contacts_contact.person_id, CONTACTS_MATCH_EQUAL, m_personId);
-               contacts_query_create(_contacts_contact._uri, &query);
-               contacts_query_set_filter(query, filter);
-
-               contacts_db_get_records_with_query(query, 0, 1, &list);
-               contacts_list_get_current_record_p(list, &record);
-
-               if (record) {
-                       char *name = nullptr;
-                       contacts_record_get_str_p(record, _contacts_contact.display_name, &name);
-                       m_name = nz(name);
-
-                       int type = CONTACTS_DISPLAY_NAME_SOURCE_TYPE_INVALID;
-                       contacts_record_get_int(record, _contacts_contact.display_source_type, &type);
-                       m_nameSource = convertContactNameSourceType(static_cast<contacts_display_name_source_type_e>(type));
-
-                       int count = 0;
-                       contacts_record_get_child_record_count(record, _contacts_contact.image, &count);
-                       if (count > 0) {
-                               char *imgPath = nullptr;
-                               contacts_record_h childRecord = NULL;
-                               contacts_record_get_child_record_at_p(record, _contacts_contact.image, 0, &childRecord);
-                               contacts_record_get_str_p(childRecord, _contacts_image.path, &imgPath);
-                               m_imagePath = nz(imgPath);
-                       }
-               }
-               contacts_list_destroy(list, true);
-               contacts_filter_destroy(filter);
-               contacts_query_destroy(query);
-
-               DLOG("PersonID [%d]", m_personId);
-               DLOG("Contact name [%s]", m_name.c_str());
-               DLOG("Contact image path [%s]", m_imagePath.c_str());
-
-               return RES_OK;
-       }
-
-       int ContactInfo::getPersonId() const
-       {
-               return m_personId;
-       }
-
-       void ContactInfo::setName(const std::string &name)
-       {
-               m_name = name;
-       }
-
-       void ContactInfo::setImagePath(const std::string &imagePath)
-       {
-               m_imagePath = imagePath;
-       }
-
-       void ContactInfo::setContactNameSourceType(ContactNameSourceType type)
-       {
-               m_nameSource = type;
+               return makeShared<ContactInfo>(personId, name, imagePath, type);
        }
 
        const std::string &ContactInfo::getName() const
index cd62571ee9e624f24a0daf470c573ce03248cc75..b899a8aa4058299afc930eb6b15895e637c3c06c 100644 (file)
@@ -27,14 +27,12 @@ namespace callui {
 
        class ContactInfo final : public IContactInfo {
        public:
-               static ContactInfoSRef newInstance(int personId);
+               static ContactInfoSRef newInstance(int personId,
+                               const std::string &name,
+                               const std::string &imagePath,
+                               ContactNameSourceType type);
                virtual ~ContactInfo();
 
-               int getPersonId() const;
-               void setName(const std::string &name);
-               void setImagePath(const std::string &imagePath);
-               void setContactNameSourceType(ContactNameSourceType type);
-
                // IContactInfo
 
                virtual const std::string &getName() const override final;
@@ -43,10 +41,10 @@ namespace callui {
 
        private:
                friend class ucl::RefCountObj<ContactInfo>;
-               ContactInfo(int personId);
-
-               ucl::Result prepare();
-               ContactNameSourceType convertContactNameSourceType(contacts_display_name_source_type_e cdbType);
+               ContactInfo(int personId,
+                               const std::string &name,
+                               const std::string &imagePath,
+                               ContactNameSourceType type);
 
        private:
                int m_personId;
diff --git a/src/model/ContactInfoProvider.cpp b/src/model/ContactInfoProvider.cpp
new file mode 100644 (file)
index 0000000..3cffba2
--- /dev/null
@@ -0,0 +1,195 @@
+/*
+ * Copyright 2017 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://floralicense.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 "ContactInfoProvider.h"
+
+#include <contacts.h>
+#include <contacts_service.h>
+#include <contacts_errors.h>
+
+#include "ContactInfo.h"
+
+#include "common.h"
+
+namespace callui { namespace { namespace impl {
+
+       using namespace ucl;
+
+       inline ContactNameSourceType convertContactNameSourceType(contacts_display_name_source_type_e cdbType)
+       {
+               switch (cdbType) {
+               case CONTACTS_DISPLAY_NAME_SOURCE_TYPE_INVALID:  return ContactNameSourceType::INVALID;
+               case CONTACTS_DISPLAY_NAME_SOURCE_TYPE_EMAIL:    return ContactNameSourceType::EMAIL;
+               case CONTACTS_DISPLAY_NAME_SOURCE_TYPE_NUMBER:   return ContactNameSourceType::NUMBER;
+               case CONTACTS_DISPLAY_NAME_SOURCE_TYPE_NICKNAME: return ContactNameSourceType::NICKNAME;
+               case CONTACTS_DISPLAY_NAME_SOURCE_TYPE_COMPANY:  return ContactNameSourceType::COMPANY;
+               case CONTACTS_DISPLAY_NAME_SOURCE_TYPE_NAME:     return ContactNameSourceType::NAME;
+               default:
+                       return ContactNameSourceType::INVALID;
+               }
+       }
+
+}}}
+
+namespace callui {
+
+       using namespace ucl;
+
+       ContactInfoProvider::ContactInfoProvider():
+                       m_isConnected(false)
+       {
+
+       }
+
+       ContactInfoProvider::~ContactInfoProvider()
+       {
+               if (m_isConnected) {
+                       contacts_disconnect();
+               }
+       }
+
+       ContactInfoProviderSRef ContactInfoProvider::newInstance()
+       {
+               auto result = makeShared<ContactInfoProvider>();
+               FAIL_RETURN_VALUE(result->prepare(), {}, "result->prepare() failed!");
+               return result;
+       }
+
+       Result ContactInfoProvider::prepare()
+       {
+               auto res = contacts_connect();
+               if (res != CONTACTS_ERROR_NONE) {
+                       LOG_RETURN(RES_FAIL, "contacts_connect() failed! res[%d] msg[%s]",
+                                       res, get_error_message(res));
+               }
+               m_isConnected = true;
+
+               return RES_OK;
+       }
+
+       ContactInfoSRef ContactInfoProvider::createContactInfo(int contactId)
+       {
+               DLOG("Try create contact info for ID [%d]", contactId);
+
+               std::string contactName;
+               std::string contactImagePath;
+               ContactNameSourceType contactNameSource;
+
+               contacts_filter_h filter = nullptr;
+               contacts_list_h list = nullptr;
+               contacts_query_h query = nullptr;
+               contacts_record_h record = nullptr;
+
+               int ret = CONTACTS_ERROR_NONE;
+               do {
+                       ret = contacts_filter_create(_contacts_contact._uri,
+                                       &filter);
+                       if (ret != CONTACTS_ERROR_NONE) {
+                               LOG_BREAK(RES_FAIL,
+                                               "contacts_filter_create() failed!"
+                                               "res[%d] res_msg[%s]",
+                                               ret, get_error_message(ret));
+                       }
+
+                       ret = contacts_filter_add_int(filter,
+                                       _contacts_contact.person_id,
+                                       CONTACTS_MATCH_EQUAL, contactId);
+                       if (ret != CONTACTS_ERROR_NONE) {
+                               LOG_BREAK(RES_FAIL,
+                                               "contacts_filter_add_int() failed!"
+                                               "res[%d] res_msg[%s]",
+                                               ret, get_error_message(ret));
+                       }
+
+                       ret = contacts_query_create(_contacts_contact._uri, &query);
+                       if (ret != CONTACTS_ERROR_NONE) {
+                               LOG_BREAK(RES_FAIL,
+                                               "contacts_query_create() failed!"
+                                               "res[%d] res_msg[%s]",
+                                               ret, get_error_message(ret));
+                       }
+
+                       ret = contacts_query_set_filter(query, filter);
+                       if (ret != CONTACTS_ERROR_NONE) {
+                               LOG_BREAK(RES_FAIL,
+                                               "contacts_query_set_filter() failed!"
+                                               "res[%d] res_msg[%s]",
+                                               ret, get_error_message(ret));
+                       }
+
+                       ret = contacts_db_get_records_with_query(query, 0, 1, &list);
+                       if (ret != CONTACTS_ERROR_NONE) {
+                               LOG_BREAK(RES_FAIL,
+                                               "contacts_db_get_records_with_query() failed!"
+                                               "res[%d] res_msg[%s]",
+                                               ret, get_error_message(ret));
+                       }
+
+                       ret = contacts_list_get_current_record_p(list, &record);
+                       if (ret != CONTACTS_ERROR_NONE) {
+                               LOG_BREAK(RES_FAIL,
+                                               "contacts_list_get_current_record_p() failed!"
+                                               "res[%d] res_msg[%s]",
+                                               ret, get_error_message(ret));
+                       }
+
+                       if (record) {
+                               char *name = nullptr;
+                               contacts_record_get_str_p(record,
+                                               _contacts_contact.display_name, &name);
+                               contactName = nz(name);
+
+                               int type = CONTACTS_DISPLAY_NAME_SOURCE_TYPE_INVALID;
+                               contacts_record_get_int(record,
+                                               _contacts_contact.display_source_type, &type);
+                               contactNameSource = impl::convertContactNameSourceType(
+                                               static_cast<contacts_display_name_source_type_e>(type));
+
+                               int count = 0;
+                               contacts_record_get_child_record_count(record,
+                                               _contacts_contact.image, &count);
+                               if (count > 0) {
+                                       char *imgPath = nullptr;
+                                       contacts_record_h childRecord = NULL;
+                                       contacts_record_get_child_record_at_p(record,
+                                                       _contacts_contact.image, 0, &childRecord);
+                                       contacts_record_get_str_p(childRecord,
+                                                       _contacts_image.path, &imgPath);
+                                       contactImagePath = nz(imgPath);
+                               }
+                       }
+               } while (false);
+
+               contacts_list_destroy(list, true);
+               contacts_filter_destroy(filter);
+               contacts_query_destroy(query);
+
+               if (ret != CONTACTS_ERROR_NONE) {
+                       return {};
+               }
+
+               DLOG("Contact ID [%d]", contactId);
+               DLOG("Contact name [%s]", contactName.c_str());
+               DLOG("Contact image path [%s]", contactImagePath.c_str());
+
+               return ContactInfo::newInstance(contactId,
+                               contactName,
+                               contactImagePath,
+                               contactNameSource);
+       }
+
+}
+
diff --git a/src/model/ContactInfoProvider.h b/src/model/ContactInfoProvider.h
new file mode 100644 (file)
index 0000000..627d680
--- /dev/null
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2017 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://floralicense.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.
+ */
+
+#ifndef __CALLUI_MODEL_CONTACT_INFO_PROVIDER_H__
+#define __CALLUI_MODEL_CONTACT_INFO_PROVIDER_H__
+
+#include "implTypes.h"
+
+namespace callui {
+
+       class ContactInfoProvider {
+       public:
+               static ContactInfoProviderSRef newInstance();
+               virtual ~ContactInfoProvider();
+
+               ContactInfoSRef createContactInfo(int contactId);
+
+       private:
+               friend class ucl::RefCountObj<ContactInfoProvider>;
+               ContactInfoProvider();
+
+               ucl::Result prepare();
+
+       private:
+               bool m_isConnected;
+       };
+}
+
+#endif // __CALLUI_MODEL_CONTACT_INFO_PROVIDER_H__
index 89cbc5347a93d4ebf3d1ba0efe147c6ddc0147a1..839bd62b2a7d0b1824c3a08da5a185040917c50a 100644 (file)
@@ -53,7 +53,9 @@ namespace callui {
 
        Result HeldCall::prepare(cm_call_data_h callData)
        {
-               m_callInfo = CallInfo::newInstance(m_cm->getCallClient(), callData);
+               m_callInfo = CallInfo::newInstance(m_cm->getCallClient(),
+                               callData,
+                               m_cm->getContactInfoProvider());
                if (!m_callInfo) {
                        LOG_RETURN_VALUE(RES_FAIL, RES_FAIL, "CallInfo::newInstance() failed!");
                }
index fc51eeac9d0c4053babecb31ed78c8f1b2fea195..9e1720aa1329d193dc56aece262850c2f8d5e8ab 100644 (file)
@@ -55,7 +55,9 @@ namespace callui {
 
        Result IncomingCall::prepare(cm_call_data_h callData)
        {
-               m_callInfo = CallInfo::newInstance(m_cm->getCallClient(), callData);
+               m_callInfo = CallInfo::newInstance(m_cm->getCallClient(),
+                               callData,
+                               m_cm->getContactInfoProvider());
                if (!m_callInfo) {
                        LOG_RETURN_VALUE(RES_FAIL, RES_FAIL, "CallInfo::newInstance() failed!");
                }
index 491ea9ace885fa92bee7d6293487f78de9388434..e3de217ba7c705ed7b6f19bed216b54ecb77e145 100644 (file)
@@ -45,13 +45,14 @@ namespace callui { namespace { namespace impl {
                        ret = sound_manager_get_next_device(deviceList, &device);
                        if (ret == SOUND_MANAGER_ERROR_NO_DATA) {
                                res = RES_OK;
-                               LOG_BREAK(res, "No more device to check");
+                               ILOG("No more device to check");
+                               break;
                        } else if (ret != SOUND_MANAGER_ERROR_NONE) {
-                               LOG_BREAK(res, "sound_manager_get_next_device() failed. [%d][%s]",
+                               UCL_FAIL_BREAK(res, "sound_manager_get_next_device() failed. [%d][%s]",
                                                ret, get_error_message(ret));
                        }
                        if (!device) {
-                               LOG_BREAK(res, "device is NULL");
+                               UCL_FAIL_BREAK(res, "device is NULL");
                        }
                        sound_manager_get_device_type(device, &type);
                        if (searchType == type) {
index a26c7a83146df95346d3ae16ad2e37aadde792ce..9b0ec173e5cca8dd59a666aa40810d8f16616cb3 100644 (file)
@@ -67,6 +67,8 @@ namespace callui {
        UCL_DECLARE_REF_ALIASES(SimSlotStateSource);
        UCL_DECLARE_REF_ALIASES(HdVoiceStateSource);
 
+       UCL_DECLARE_REF_ALIASES(ContactInfoProvider);
+
        UCL_DECLARE_REF_ALIASES(BluetoothVolume);
 
        using AudioStateEvent = ucl::Event<AudioStateHandler>;
index 5b3d28680a2554081bd26899f9f4f12d07fec506..08bd05807f99180828bc157ecbb7b89687f5cf8c 100644 (file)
@@ -24,6 +24,7 @@ ucl::ResultData getUCLResultData(const ucl::Result result)
        case callui::RES_NOT_REGISTERED:     return {"RES_NOT_REGISTERED", DLOG_FATAL};
        case callui::RES_ALREADY_REGISTERED: return {"RES_ALREADY_REGISTERED", DLOG_FATAL};
        case callui::RES_OPERATION_FAILED:   return {"RES_OPERATION_FAILED", DLOG_FATAL};
+       case callui::RES_NOT_CONNECTED:      return {"RES_NOT_CONNECTED", DLOG_FATAL};
        default:
                return ucl::getResultData(result);
        }
index 295e338004fed7a1f631ac13758f393658707f84..6a76d4d76749b1b7090ae10f3568258ab8e0fde8 100644 (file)
     </ui-application>
     <privileges>
         <privilege>http://tizen.org/privilege/telephony</privilege>
-        <privilege>http://tizen.org/privilege/telephony.admin</privilege>
-        <privilege>http://tizen.org/privilege/appmanager.launch</privilege>
+        <privilege>http://tizen.org/privilege/keygrab</privilege>
         <privilege>http://tizen.org/privilege/window.priority.set</privilege>
         <privilege>http://tizen.org/privilege/systemsettings.admin</privilege>
         <privilege>http://tizen.org/privilege/contact.read</privilege>
+        <privilege>http://tizen.org/privilege/display</privilege>
+        <privilege>http://tizen.org/privilege/telephony.admin</privilege>
+        <privilege>http://tizen.org/privilege/appmanager.launch</privilege>
         <privilege>http://tizen.org/privilege/volume.set</privilege>
         <privilege>http://tizen.org/privilege/message.write</privilege>
         <privilege>http://tizen.org/privilege/notification</privilege>
-        <privilege>http://tizen.org/privilege/display</privilege>
         <privilege>http://tizen.org/privilege/message.read</privilege>
-        <privilege>http://tizen.org/privilege/keygrab</privilege>
+        <privilege>http://tizen.org/privilege/callhistory.read</privilege>
     </privileges>
 </manifest>