TizenRefApp-8592 [Call UI] Implement Call volume level controling feature 16/132216/1
authorIgor Olshevskyi <i.olshevskyi@samsung.com>
Thu, 25 May 2017 14:22:45 +0000 (17:22 +0300)
committerIgor Olshevskyi <i.olshevskyi@samsung.com>
Thu, 1 Jun 2017 13:51:30 +0000 (16:51 +0300)
Change-Id: Icf02b5475a5868a862b00606cd51a33378ac6671

23 files changed:
edc/accessory.edc
edc/volume_control.edc
inc/model/ISoundManager.h
inc/model/types.h
inc/presenters/AccessoryPresenter.h [new file with mode: 0644]
inc/presenters/MainPage.h
inc/presenters/types.h
inc/resources.h
src/model/BluetoothManager.cpp [new file with mode: 0644]
src/model/BluetoothManager.h [new file with mode: 0644]
src/model/Call.cpp
src/model/Call.h
src/model/CallClient.cpp
src/model/SoundManager.cpp
src/model/SoundManager.h
src/model/implTypes.h
src/presenters/AcceptRejectPresenter.cpp
src/presenters/AccessoryPresenter.cpp [new file with mode: 0644]
src/presenters/MainPage.cpp
src/presenters/common.h
src/resources.cpp
src/view/common.h
tizen-manifest.xml

index 740a4e0ab57beba3ae82e6cf2dfb5da468cf800e..9579bbb684e663e2507daf1fbaa8bbbe3fcf104a 100644 (file)
  * limitations under the License.
  */
 
-/*
-#define CU_BTN_VOLUME_EFF_DEFAULT_SIZE 160 160
-#define CU_BTN_VOLUME_EFF_PRESSED_SIZE 144 144
-#define CU_BTN_VOLUME_ICON_SIZE 64 64
-
-#define CU_BTN_VOLUME_CONTROL(_name, _icon)
-       group { "elm/button/base/"_name;
-       images {
-               image: "w_call_button_press_circle.png" COMP;
-               image: _icon COMP;
-       }
-       parts {
-               image { "image.bg";
-                       nomouse;
-                       scale;
-                       desc { "default";
-                               fixed: 1 1;
-                               min: CU_BTN_VOLUME_EFF_DEFAULT_SIZE;
-                               image.normal: "w_call_button_press_circle.png";
-                               color: 255 255 255 0;
-                       }
-                       desc { "pressed_effect";
-                               inherit: "default";
-                               min: CU_BTN_VOLUME_EFF_PRESSED_SIZE;
-                               color: 255 255 255 33;
-                       }
-                       desc { "pressed";
-                               inherit: "pressed_effect";
-                               min: CU_BTN_VOLUME_EFF_DEFAULT_SIZE;
-                       }
-               }
-               image { "icon";
-                       scale;
-                       desc { "default";
-                               min: CU_BTN_VOLUME_ICON_SIZE;
-                               max: CU_BTN_VOLUME_ICON_SIZE;
-                               image.normal: _icon;
-                       }
-               }
-       }
-       programs {
-               program {
-                       signal: "mouse,clicked,*";
-                       source: "icon";
-                       action: SIGNAL_EMIT "elm,action,click" "";
-               }
-               program {
-                       signal: "mouse,down,*";
-                       source: "icon";
-                       sequence {
-                               action: STATE_SET "pressed_effect";
-                               target: "image.bg";
-                               action: STATE_SET "pressed";
-                               target: "image.bg";
-                               transition: TRANSITION_GLIDE(0.3);
-                       }
-               }
-               program {
-                       signal: "mouse,up,*";
-                       source: "icon";
-                       action: STATE_SET "default";
-                       target: "image.bg";
-                       transition: LINEAR 0.535;
-               }
-       }
-*/
-
 group { "elm/layout/callui/accessory";
        parts {
                swallow { "swl.volume_control"
index 8c9632ee19485cbee2c44f2f9d0056ae7048b471..25ce08ddca2a9603f2da1906d1fc3e52b7724380 100644 (file)
@@ -62,17 +62,17 @@ group { "elm/layout/callui/volume_control";
                        }
                }
                spacer { "pad.top";
-            scale;
-            desc { "default";
+                       scale;
+                       desc { "default";
                                min: CU_VOLUME_PAD_TOP_MIN;
                                fixed: 0 1;
                                rel1 { relative: 0.0 0.0; to: "sizer"; }
                                rel2 { relative: 1.0 0.0; to: "sizer"; }
                                align: 0.0 0.0;
-            }
-         }
-         spacer { "pad.bottom";
-            scale;
+                       }
+               }
+               spacer { "pad.bottom";
+                       scale;
                        desc { "default";
                                min: CU_VOLUME_PAD_BOTTOM_MIN;
                                fixed: 0 1;
@@ -80,20 +80,20 @@ group { "elm/layout/callui/volume_control";
                                rel2 { relative: 1.0 1.0; to: "sizer"; }
                                align: 0.0 1.0;
                        }
-         }
-         spacer { "action_zone";
-               scale;
-               desc { "default";
-                       min: CU_VOLUME_ACTION_ZONE_MIN;
-                       max: CU_VOLUME_ACTION_ZONE_MIN;
-                       fixed: 1 1;
-                       rel1 { relative: 0.0 1.0; to_y: "pad.top"; }
-                       rel2 { relative: 1.0 1.0; to_y: "pad.top"; }
-                       align: 0.5 0.0;
-               }
-         }
-         spacer { "txt.value.pad.bottom";
-            scale;
+               }
+               spacer { "action_zone";
+                       scale;
+                       desc { "default";
+                               min: CU_VOLUME_ACTION_ZONE_MIN;
+                               max: CU_VOLUME_ACTION_ZONE_MIN;
+                               fixed: 1 1;
+                               rel1 { relative: 0.0 1.0; to_y: "pad.top"; }
+                               rel2 { relative: 1.0 1.0; to_y: "pad.top"; }
+                               align: 0.5 0.0;
+                       }
+               }
+               spacer { "txt.value.pad.bottom";
+                       scale;
                        desc { "default";
                                min: CU_VOLUME_ACTION_BTN_MIN;
                                fixed: 0 1;
@@ -117,49 +117,49 @@ group { "elm/layout/callui/volume_control";
                        }
                }
                swallow { "swl.minus";
-               scale;
-               desc { "default";
-                       min: CU_VOLUME_ACTION_BTN_SIZE;
-                       max: CU_VOLUME_ACTION_BTN_SIZE;
-                       fixed: 1 1;
-                       rel1 { relative: 0.0 0.0; to: "action_zone"; }
-                       rel2 { relative: 0.0 1.0; to: "action_zone"; }
-                       align: 0.0 0.5;
-               }
-               desc { "hide";
+                       scale;
+                       desc { "default";
+                               min: CU_VOLUME_ACTION_BTN_SIZE;
+                               max: CU_VOLUME_ACTION_BTN_SIZE;
+                               fixed: 1 1;
+                               rel1 { relative: 0.0 0.0; to: "action_zone"; }
+                               rel2 { relative: 0.0 1.0; to: "action_zone"; }
+                               align: 0.0 0.5;
+                       }
+                       desc { "hide";
                                hid;
                        }
                }
                swallow { "swl.plus";
-               scale;
-               desc { "default";
-                       min: CU_VOLUME_ACTION_BTN_SIZE;
-                       max: CU_VOLUME_ACTION_BTN_SIZE;
-                       fixed: 1 1;
-                       rel1 { relative: 1.0 0.0; to: "action_zone"; }
-                       rel2 { relative: 1.0 1.0; to: "action_zone"; }
-                       align: 1.0 0.5;
-               }
-               desc { "hide";
+                       scale;
+                       desc { "default";
+                               min: CU_VOLUME_ACTION_BTN_SIZE;
+                               max: CU_VOLUME_ACTION_BTN_SIZE;
+                               fixed: 1 1;
+                               rel1 { relative: 1.0 0.0; to: "action_zone"; }
+                               rel2 { relative: 1.0 1.0; to: "action_zone"; }
+                               align: 1.0 0.5;
+                       }
+                       desc { "hide";
                                hid;
                        }
-         }
+               }
                spacer { "txt.info.zone";
                        scale;
-               desc { "default";
-                       min: CU_VOLUME_INFO_TXT_ZONE_MIN;
-                       fixed: 1 1;
-                       rel1 { relative: 0.5 0.0; to_y: "pad.bottom"; }
+                       desc { "default";
+                               min: CU_VOLUME_INFO_TXT_ZONE_MIN;
+                               fixed: 1 1;
+                               rel1 { relative: 0.5 0.0; to_y: "pad.bottom"; }
                                rel2 { relative: 0.5 0.0; to_y: "pad.bottom"; }
                                align: 0.5 1.0;
                        }
                }
                textblock { "txt.info";
                        scale;
-               desc { "default";
-                       min: CU_VOLUME_INFO_TXT_MIN;
-                       fixed: 1 1;
-                       rel1 { relative: 0.5 0.5; to_y: "txt.info.zone"; }
+                       desc { "default";
+                               min: CU_VOLUME_INFO_TXT_MIN;
+                               fixed: 1 1;
+                               rel1 { relative: 0.5 0.5; to_y: "txt.info.zone"; }
                                rel2 { relative: 0.5 0.5; to_y: "txt.info.zone"; }
                                text.style: "volume_info";
                        }
index 1ac209f9453362cd2fb29ff41fda252286926765..8114ae26807955ec2f7dd036e0d0566fa823e52f 100644 (file)
@@ -30,10 +30,15 @@ namespace callui {
                virtual bool getMuteState() const = 0;
                virtual ucl::Result startDtmf(const unsigned char dtmfDigit) = 0;
                virtual ucl::Result stopDtmf() = 0;
-               virtual void addAudioStateChangeHandler(AudioStateHandler handler) = 0;
-               virtual void removeAudioStateChangeHandler(AudioStateHandler handler) = 0;
-               virtual void addMuteStateChangeHandler(MuteStateHandler handler) = 0;
-               virtual void removeMuteStateChangeHandler(MuteStateHandler handler) = 0;
+               virtual void addAudioStateHandler(AudioStateHandler handler) = 0;
+               virtual void removeAudioStateHandler(AudioStateHandler handler) = 0;
+               virtual void addMuteStateHandler(MuteStateHandler handler) = 0;
+               virtual void removeMuteStateHandler(MuteStateHandler handler) = 0;
+               virtual void addVolumeStateHandler(VolumeLevelHandler handler) = 0;
+               virtual void removeVolumeStateHandler(VolumeLevelHandler handler) = 0;
+               virtual int getMaxVolume() const = 0;
+               virtual int getVolume() const = 0;
+               virtual ucl::Result setVolume(int value) = 0;
        };
 }
 
index 3d4b92cdf211973ff7a473b891047befb1fbab1f..e6b1f5759ae0871708106298253884f0544fdc28 100644 (file)
@@ -162,6 +162,7 @@ namespace callui {
 
        using AudioStateHandler = ucl::Delegate<void(AudioStateType)>;
        using MuteStateHandler = ucl::Delegate<void(bool)>;
+       using VolumeLevelHandler = ucl::Delegate<void(int)>;
 
        using ConfMemberList = std::vector<IConferenceCallInfoSCRef>;
        using RejectMsgList = std::vector<IRejectMsgSRef>;
diff --git a/inc/presenters/AccessoryPresenter.h b/inc/presenters/AccessoryPresenter.h
new file mode 100644 (file)
index 0000000..8d2a568
--- /dev/null
@@ -0,0 +1,84 @@
+/*
+ * 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_PRESENTERS_ACCESSORY_PRESENTER_H__
+#define __CALLUI_PRESENTERS_ACCESSORY_PRESENTER_H__
+
+#include "Presenter.h"
+
+#include "ucl/gui/Layout.h"
+
+#include "types.h"
+
+namespace callui {
+
+       class AccessoryPresenter final : public Presenter {
+       public:
+               class Builder {
+               public:
+                       Builder();
+                       Builder &setSoundManager(const ISoundManagerSRef &sm);
+                       AccessoryPresenterSRef build(ucl::ElmWidget &parent) const;
+
+               private:
+                       ISoundManagerSRef m_sm;
+               };
+
+       public:
+               virtual ~AccessoryPresenter();
+
+               ucl::Widget &getWidget();
+               void hideVolumeControls();
+
+       private:
+               friend class ucl::RefCountObj<AccessoryPresenter>;
+               AccessoryPresenter(ucl::RefCountObjBase &rc,
+                               const ISoundManagerSRef &sm);
+
+               ucl::Result prepare(ucl::ElmWidget &parent);
+
+               ucl::Result createWidget(ucl::ElmWidget &parent);
+               ucl::Result createVolumeControl();
+               void registerCallbacks();
+               void unregisterCallbacks();
+               void onVolumeControlEventCb(VolumeControlEvent event);
+               Eina_Bool onRotaryEvent(Eext_Rotary_Event_Info *info);
+
+               void tryIncreaseVolume();
+               void tryDecreaseVolume();
+
+               void onAudioStateChanged(AudioStateType state);
+               void onVolumeLevelChanged(int value);
+
+               Eina_Bool onVCTimerCb();
+               void startVCTimer();
+               void restartVCTimer();
+               void stopVCTimer();
+
+               void updateVolume(int value);
+
+       private:
+               ucl::LayoutSRef m_widget;
+               VolumeControlSRef m_vc;
+               ISoundManagerSRef m_sm;
+               Ecore_Timer *m_vcTimer;
+               AudioStateType m_audioState;
+       };
+}
+
+
+
+#endif // __CALLUI_PRESENTERS_ACCESSORY_PRESENTER_H__
index 97fe7d9a61e3a56e8e45bbb0689a1964182aaf43..1db58b1188f4f5902b9c600690916baa371ebc9f 100644 (file)
@@ -61,6 +61,8 @@ namespace callui {
 
                ucl::Result createCallInfoPresenter(CallMode mode);
 
+               ucl::Result createAccessoryPresenter();
+
                ucl::Result createBottomBtn(const ucl::ElmStyle &style);
                void onBottomBtnClicked(ucl::Widget &widget, void *eventInfo);
 
@@ -95,6 +97,7 @@ namespace callui {
                CallInfoPresenterSRef m_callInfoPrs;
                AcceptRejectPresenterSRef m_acceptRejectPrs;
                RejectMsgPresenterSRef m_rmPrs;
+               AccessoryPresenterSRef m_accessoryPrs;
                CallMode m_mode;
                Ecore_Timer *m_ecTimer;
                bool m_ecTimerBtnReq;
index 182b515d722febab35cbc5cbc87a8c49a0715ada..e2a558db4b8cdc70f5e26ddff69b912999496e5d 100644 (file)
@@ -56,6 +56,8 @@ namespace callui {
 
        UCL_DECLARE_REF_ALIASES(RejectMsgPresenter);
 
+       UCL_DECLARE_REF_ALIASES(AccessoryPresenter);
+
        using AcceptDialogHandler = ucl::WeakDelegate<bool(AcceptDialog &, AcceptDialogEvent)>;
        using RejectMsgStateHandler = ucl::WeakDelegate<void(RejectMsgState)>;
        using RejectMsgSelectHandler = ucl::WeakDelegate<void(const IRejectMsgSRef &rm)>;
index 84f9354d7f466fdbd6cdf6b6874d74923bff93fd..4c247449349b8449d9cbffecd7c943dca09bc97b 100644 (file)
@@ -42,6 +42,8 @@ namespace callui {
        extern const ucl::TString STR_CALL_ENDED;
 
        extern const ucl::TString STR_DECLINE_MESSAGES;
+
+       extern const ucl::TString STR_VOLUME;
 }
 
 #endif // __CALLUI_RESOURCES_H__
diff --git a/src/model/BluetoothManager.cpp b/src/model/BluetoothManager.cpp
new file mode 100644 (file)
index 0000000..0e8dee7
--- /dev/null
@@ -0,0 +1,150 @@
+/*
+ * 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 "BluetoothManager.h"
+
+#include <bluetooth.h>
+#include <bluetooth_internal.h>
+#include <bluetooth_extension.h>
+#include <sound_manager.h>
+
+#include "common.h"
+
+namespace callui { namespace { namespace impl {
+
+       using namespace ucl;
+
+       constexpr auto BT_VOLUME_MAX = 15;
+
+}}}
+
+namespace callui {
+
+       using namespace ucl;
+
+       BluetoothManagerSRef BluetoothManager::newInstance()
+       {
+               auto result = makeShared<BluetoothManager>();
+               FAIL_RETURN_VALUE(result->prepare(), {}, "result->prepare() failed!");
+               return result;
+       }
+
+       BluetoothManager::BluetoothManager():
+               m_btInitialized(false),
+               m_btAudioInitialized(false)
+       {
+       }
+
+       BluetoothManager::~BluetoothManager()
+       {
+               unregisterAudioHandling();
+
+               bt_deinitialize();
+       }
+
+       Result BluetoothManager::prepare()
+       {
+               if (BT_ERROR_NONE != bt_initialize()) {
+                       LOG_RETURN(RES_FAIL, "BT initialize failed");
+               }
+               m_btInitialized = true;
+
+               FAIL_RETURN(registerAudioHandling(),
+                               "registerAudioHandling() failed");
+
+               return RES_OK;
+       }
+
+       int BluetoothManager::getVolume()
+       {
+               auto vol = 0;
+               auto ret = bt_ag_get_speaker_gain(&vol);
+               if (ret != BT_ERROR_NONE) {
+                       LOG_RETURN_VALUE(RES_FAIL, -1, "bt_ag_get_speaker_gain() failed!");
+               }
+               DLOG("BT Volume level [%d]", vol);
+               return vol;
+       }
+
+       int BluetoothManager::getMaxVolume()
+       {
+               return impl::BT_VOLUME_MAX;
+       }
+
+       Result BluetoothManager::setVolume(int volume)
+       {
+               auto ret = bt_ag_notify_speaker_gain(volume);
+               if (ret != BT_ERROR_NONE) {
+                       LOG_RETURN(RES_FAIL, "bt_ag_notify_speaker_gain() failed!");
+               }
+               return RES_OK;
+       }
+
+       void BluetoothManager::setVolumeStateHandler(
+                       const BluetoothVolumeHandler &handler)
+       {
+               m_handler = handler;
+       }
+
+       Result BluetoothManager::registerAudioHandling()
+       {
+               auto ret = bt_audio_initialize();
+               if (ret != BT_ERROR_NONE) {
+                       LOG_RETURN(RES_FAIL, "bt_audio_initialize() failed");
+               }
+               m_btAudioInitialized = true;
+
+               ret = bt_ag_set_speaker_gain_changed_cb(
+                               CALLBACK_B(BluetoothManager::onVolumeChanged), this);
+               if (ret != BT_ERROR_NONE) {
+                       LOG_RETURN(RES_FAIL, "bt_ag_set_speaker_gain_changed_cb() failed");
+               }
+
+               return RES_OK;
+       }
+
+       void BluetoothManager::unregisterAudioHandling()
+       {
+               bt_ag_unset_speaker_gain_changed_cb();
+
+               if (m_btAudioInitialized) {
+                       bt_audio_deinitialize();
+                       m_btAudioInitialized = false;
+               }
+       }
+
+       void BluetoothManager::onVolumeChanged(int volume)
+       {
+               sound_type_e soundType = SOUND_TYPE_SYSTEM;
+               auto ret = sound_manager_get_current_sound_type(&soundType);
+               if (ret != SOUND_MANAGER_ERROR_NONE) {
+                       LOG_RETURN_VOID(RES_FAIL, "sound_manager_get_current_sound_type() failed");
+               }
+
+               bool isSCOOpened = false;
+               ret = bt_ag_is_sco_opened(&isSCOOpened);
+               if (ret != BT_ERROR_NONE) {
+                       LOG_RETURN_VOID(RES_FAIL, "sound_manager_get_current_sound_type() failed");
+               }
+
+               if (isSCOOpened && soundType == SOUND_TYPE_CALL) {
+                       if (m_handler) {
+                               m_handler(volume);
+                       }
+               }
+       }
+
+}
diff --git a/src/model/BluetoothManager.h b/src/model/BluetoothManager.h
new file mode 100644 (file)
index 0000000..25b41ee
--- /dev/null
@@ -0,0 +1,53 @@
+/*
+ * 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_BLUETOOTH_MANAGER_H__
+#define __CALLUI_MODEL_BLUETOOTH_MANAGER_H__
+
+#include "implTypes.h"
+
+namespace callui {
+
+       class BluetoothManager final {
+       public:
+               static BluetoothManagerSRef newInstance();
+               virtual ~BluetoothManager();
+
+               int getVolume();
+               int getMaxVolume();
+               ucl::Result setVolume(int volume);
+
+               void setVolumeStateHandler(const BluetoothVolumeHandler &handler);
+
+       private:
+               friend class ucl::RefCountObj<BluetoothManager>;
+               BluetoothManager();
+
+               ucl::Result prepare();
+
+               ucl::Result registerAudioHandling();
+               void unregisterAudioHandling();
+               void onVolumeChanged(int volume);
+
+       private:
+               BluetoothVolumeHandler m_handler;
+               bool m_btInitialized;
+               bool m_btAudioInitialized;
+       };
+
+}
+
+#endif // __CALLUI_MODEL_BLUETOOTH_MANAGER_H__
index a54f03aa13854f128b040157ff3e8d0f55a9bc24..7d54f7bd0dfbbda64c240e01b1c55d3cab31a34f 100644 (file)
@@ -34,6 +34,7 @@
 #include "BatteryStateSource.h"
 #include "SimSlotStateSource.h"
 #include "HdVoiceStateSource.h"
+#include "BluetoothManager.h"
 
 #include "common.h"
 
@@ -127,6 +128,11 @@ namespace callui {
 
        Result Call::prepare()
        {
+               m_btManager = BluetoothManager::newInstance();
+               if (!m_btManager) {
+                       ELOG("BluetoothManager::newInstance() failed!");
+               }
+
                auto callClient = CallClient::newInstance();
                if (!callClient) {
                        LOG_RETURN(RES_FAIL, "Client::newInstance() failed!");
@@ -137,7 +143,7 @@ namespace callui {
                        LOG_RETURN(RES_FAIL, "CallManager::newInstance() failed!");
                }
 
-               m_soundManager = SoundManager::newInstance(callClient);
+               m_soundManager = SoundManager::newInstance(callClient, m_btManager);
                if (!m_soundManager) {
                        LOG_RETURN(RES_FAIL, "SoundManage::newInstance() failed!");
                }
index ff5a4061e6613b2d0958927c364825eb17ea1065..08429c09356000a2925142998d9598fafaf4ab06 100644 (file)
@@ -67,6 +67,7 @@ namespace callui {
        private:
                CallManagerSRef m_callManager;
                SoundManagerSRef m_soundManager;
+               BluetoothManagerSRef m_btManager;
                ICallListenerWRef m_listener;
                SimSlotStateSourceSRef m_simSlotStSrc;
                HdVoiceStateSourceSRef m_hdCallStSrc;
index 34b4b0d12054dc8b712390fd7051a9f60f90c458..f496bc2ae9599c486c0408ebe549e76ab1625e7d 100644 (file)
@@ -44,7 +44,7 @@ namespace callui {
        ucl::Result CallClient::prepare()
        {
                cm_client_h client;
-               FAIL_RETURN_VALUE(convertCMResult(cm_init(&client)), {}, "cm_init() failed!");
+               FAIL_RETURN(convertCMResult(cm_init(&client)), "cm_init() failed!");
                m_client = client;
 
                return RES_OK;
index ce60020a12e40e164444bd32f185b589a301e206..b7bc96f039881bdd7e873692bd9d57558e9fc606 100644 (file)
@@ -17,6 +17,7 @@
 #include "SoundManager.h"
 
 #include "CallClient.h"
+#include "BluetoothManager.h"
 
 #include "common.h"
 
@@ -24,20 +25,29 @@ namespace callui {
 
        using namespace ucl;
 
-       SoundManager::SoundManager(const CallClientSRef &client):
-                       m_client(client)
+       SoundManager::SoundManager(RefCountObjBase &rc,
+                       const CallClientSRef &client,
+                       const BluetoothManagerSRef &btManager):
+                                       RefCountAware(&rc),
+                               m_client(client),
+                               m_btManager(btManager),
+                               m_deviceVolumeCbID(-1)
        {
        }
 
        SoundManager::~SoundManager()
        {
+               if (m_deviceVolumeCbID >= 0) {
+                       sound_manager_remove_volume_changed_cb(m_deviceVolumeCbID);
+               }
                cm_unset_audio_state_changed_cb(*m_client);
                cm_unset_mute_status_cb(*m_client);
        }
 
-       SoundManagerSRef SoundManager::newInstance(const CallClientSRef &client)
+       SoundManagerSRef SoundManager::newInstance(const CallClientSRef &client,
+                       const BluetoothManagerSRef &btManager)
        {
-               auto result = makeShared<SoundManager>(client);
+               auto result = makeShared<SoundManager>(client, btManager);
                FAIL_RETURN_VALUE(result->prepare(), {}, "result->prepare() failed!");
                return result;
        }
@@ -48,7 +58,6 @@ namespace callui {
                        ILOG("Ignore. Unhandled state [%d]", state);
                        return;
                }
-
                m_audioStateEvent.dispatch(convertCMAudioState(state));
        }
 
@@ -59,15 +68,40 @@ namespace callui {
 
        Result SoundManager::prepare()
        {
-               Result res = convertCMResult(cm_set_audio_state_changed_cb(*m_client, CALLBACK_B(SoundManager::audioStateChangedCb), this));
+               Result res = convertCMResult(cm_set_audio_state_changed_cb(*m_client,
+                               CALLBACK_B(SoundManager::audioStateChangedCb), this));
                FAIL_RETURN(res, "cm_set_audio_state_changed_cb() failed!");
 
-               res = convertCMResult(cm_set_mute_status_cb(*m_client, CALLBACK_B(SoundManager::muteStateChangedCb), this));
-               FAIL_RETURN(res, "__callui_mute_state_changed_cb() failed!");
+               res = convertCMResult(cm_set_mute_status_cb(*m_client,
+                               CALLBACK_B(SoundManager::muteStateChangedCb), this));
+               FAIL_RETURN(res, "cm_set_mute_status_cb() failed!");
+
+               FAIL_RETURN(registerVolumeCallbacks(),
+                               "registerVolumeCallbacks() failed!");
 
                return res;
        }
 
+       Result SoundManager::registerVolumeCallbacks()
+       {
+               int ret = sound_manager_add_volume_changed_cb(
+                               CALLBACK_B(SoundManager::onDeviceVolumeChanged),
+                               this,
+                               &m_deviceVolumeCbID);
+               if (ret != SOUND_MANAGER_ERROR_NONE) {
+                       LOG_RETURN(RES_FAIL,
+                                       "sound_manager_add_volume_changed_cb() failed");
+               }
+
+               if (m_btManager) {
+                       m_btManager->setVolumeStateHandler(
+                                       WEAK_DELEGATE(SoundManager::onBluetoothVolumeChanged,
+                                       asWeak(*this)));
+               }
+
+               return RES_OK;
+       }
+
        Result SoundManager::setSpeakerState(bool isEnable)
        {
                if (isEnable) {
@@ -90,7 +124,8 @@ namespace callui {
        {
                cm_audio_state_type_e state = CM_AUDIO_STATE_NONE_E;
                Result res = convertCMResult(cm_get_audio_state(*m_client, &state));
-               FAIL_RETURN_VALUE(res, AudioStateType::NONE, "cm_get_audio_state() failed!");
+               FAIL_RETURN_VALUE(res, AudioStateType::NONE,
+                               "cm_get_audio_state() failed!");
 
                return convertCMAudioState(state);
        }
@@ -119,24 +154,117 @@ namespace callui {
                return convertCMResult(cm_stop_dtmf(*m_client));
        }
 
-       void SoundManager::addAudioStateChangeHandler(AudioStateHandler handler)
+       void SoundManager::addAudioStateHandler(AudioStateHandler handler)
        {
                m_audioStateEvent += handler;
        }
 
-       void SoundManager::removeAudioStateChangeHandler(AudioStateHandler handler)
+       void SoundManager::removeAudioStateHandler(AudioStateHandler handler)
        {
                m_audioStateEvent -= handler;
        }
 
-       void SoundManager::addMuteStateChangeHandler(MuteStateHandler handler)
+       void SoundManager::addMuteStateHandler(MuteStateHandler handler)
        {
                m_muteStateEvent += handler;
        }
 
-       void SoundManager::removeMuteStateChangeHandler(MuteStateHandler handler)
+       void SoundManager::removeMuteStateHandler(MuteStateHandler handler)
        {
                m_muteStateEvent -= handler;
        }
 
+       void SoundManager::addVolumeStateHandler(
+                       VolumeLevelHandler handler)
+       {
+               m_volumeLevelEvent += handler;
+       }
+
+       void SoundManager::removeVolumeStateHandler(
+                       VolumeLevelHandler handler)
+       {
+               m_volumeLevelEvent -= handler;
+       }
+
+       int SoundManager::getMaxVolume() const
+       {
+               int maxVol = 0;
+               if (getAudioState() == AudioStateType::BT) {
+                       if (m_btManager) {
+                               maxVol = m_btManager->getMaxVolume();
+                       } else {
+                               ELOG("BT is not set");
+                       }
+               } else {
+                       auto ret = sound_manager_get_max_volume(SOUND_TYPE_CALL, &maxVol);
+                       if (ret != SOUND_MANAGER_ERROR_NONE) {
+                               LOG_RETURN_VALUE(RES_FAIL, 0,
+                                               "Get max volume failed. ret[%d]", ret);
+                       }
+               }
+               DLOG("Max volume [%d]", maxVol);
+               return maxVol;
+       }
+
+       int SoundManager::getVolume() const
+       {
+               int vol = 0;
+               if (getAudioState() == AudioStateType::BT) {
+                       if (m_btManager) {
+                               vol = m_btManager->getVolume();
+                       } else {
+                               ELOG("BT is not set");
+                       }
+               } else {
+                       auto ret = sound_manager_get_volume(SOUND_TYPE_CALL, &vol);
+                       if (ret != SOUND_MANAGER_ERROR_NONE) {
+                               LOG_RETURN_VALUE(RES_FAIL, 0,
+                                               "Get volume failed. ret[%d]", ret);
+                       }
+               }
+               DLOG("Current volume [%d]", vol);
+               return vol;
+       }
+
+       Result SoundManager::setVolume(int value)
+       {
+               if (getAudioState() == AudioStateType::BT) {
+                       if (m_btManager) {
+                               return m_btManager->setVolume(value);
+                       } else {
+                               LOG_RETURN(RES_FAIL, "BT is not set");
+                       }
+               } else {
+                       auto ret = sound_manager_set_volume(SOUND_TYPE_CALL, value);
+                       if (ret != SOUND_MANAGER_ERROR_NONE) {
+                               LOG_RETURN(RES_FAIL,
+                                               "sound_manager_set_volume() failed. ret[%d]", ret);
+                       }
+               }
+               return RES_OK;
+       }
+
+
+       void SoundManager::onDeviceVolumeChanged(sound_type_e type, unsigned int volume)
+       {
+               DLOG("Volume [%d]", volume);
+               if (type != SOUND_TYPE_CALL) {
+                       ILOG("Ignored. Not type Call.");
+                       return;
+               }
+
+               if (getAudioState() != AudioStateType::BT) {
+                       m_volumeLevelEvent.dispatch(volume);
+               }
+       }
+
+       void SoundManager::onBluetoothVolumeChanged(int volume)
+       {
+               DLOG("Volume [%d]", volume);
+
+               if (getAudioState() == AudioStateType::BT) {
+                       m_volumeLevelEvent.dispatch(volume);
+               }
+       }
+
 }
index b0277444aa50395498baed4a370ad02f74653b43..2e1766aa4e5bddf28cd1faf21689ec6e20fbe408 100644 (file)
@@ -18,6 +18,7 @@
 #define __CALLUI_MODEL_SOUND_MANAGER_H__
 
 #include <call-manager-ext.h>
+#include <sound_manager.h>
 
 #include "model/ISoundManager.h"
 
 
 namespace callui {
 
-       class SoundManager final : public ISoundManager {
+       class SoundManager final :
+               public ucl::RefCountAware,
+               public ISoundManager {
        public:
-               static SoundManagerSRef newInstance(const CallClientSRef &client);
+               static SoundManagerSRef newInstance(const CallClientSRef &client,
+                               const BluetoothManagerSRef &btManager);
                virtual ~SoundManager();
 
                // ISoundManager
@@ -39,23 +43,38 @@ namespace callui {
                virtual bool getMuteState() const override final;
                virtual ucl::Result startDtmf(const unsigned char dtmfDigit) override final;
                virtual ucl::Result stopDtmf() override final;
-               virtual void addAudioStateChangeHandler(AudioStateHandler handler) override final;
-               virtual void removeAudioStateChangeHandler(AudioStateHandler handler) override final;
-               virtual void addMuteStateChangeHandler(MuteStateHandler handler) override final;
-               virtual void removeMuteStateChangeHandler(MuteStateHandler handler) override final;
+               virtual void addAudioStateHandler(AudioStateHandler handler) override final;
+               virtual void removeAudioStateHandler(AudioStateHandler handler) override final;
+               virtual void addMuteStateHandler(MuteStateHandler handler) override final;
+               virtual void removeMuteStateHandler(MuteStateHandler handler) override final;
+               virtual void addVolumeStateHandler(VolumeLevelHandler handler) override final;
+               virtual void removeVolumeStateHandler(VolumeLevelHandler handler) override final;
+               virtual int getMaxVolume() const override final;
+               virtual int getVolume() const override final;
+               virtual ucl::Result setVolume(int value) override final;
 
        private:
                friend class ucl::RefCountObj<SoundManager>;
-               SoundManager(const CallClientSRef &client);
+               SoundManager(ucl::RefCountObjBase &rc,
+                               const CallClientSRef &client,
+                               const BluetoothManagerSRef &btManager);
 
                ucl::Result prepare();
+               ucl::Result registerVolumeCallbacks();
+
                void audioStateChangedCb(cm_audio_state_type_e state);
                void muteStateChangedCb(cm_mute_status_e status);
 
+               void onBluetoothVolumeChanged(int volume);
+               void onDeviceVolumeChanged(sound_type_e type, unsigned int volume);
+
        private:
                CallClientSRef m_client;
+               BluetoothManagerSRef m_btManager;
                AudioStateEvent m_audioStateEvent;
                MuteStateEvent m_muteStateEvent;
+               VolumeLevelEvent m_volumeLevelEvent;
+               int m_deviceVolumeCbID;
        };
 
 }
index 952af96f18240a23e830df7309adcd62ae1b60d4..ad3e1efc8413232c11f9cf5eaaa8ad1bd762d39f 100644 (file)
@@ -67,10 +67,15 @@ namespace callui {
        UCL_DECLARE_REF_ALIASES(SimSlotStateSource);
        UCL_DECLARE_REF_ALIASES(HdVoiceStateSource);
 
+       UCL_DECLARE_REF_ALIASES(BluetoothManager);
+
        using AudioStateEvent = ucl::Event<AudioStateHandler>;
        using MuteStateEvent = ucl::Event<MuteStateHandler>;
+       using VolumeLevelEvent = ucl::Event<VolumeLevelHandler>;
 
        using StateChangeHandler = ucl::WeakDelegate<void()>;
+
+       using BluetoothVolumeHandler = ucl::WeakDelegate<void(int)>;
 }
 
 #endif // __CALLUI_MODEL_IMPL_TYPES_H__
index 93c18faa3f9d5b6f7923983aa8d4b09fdc611eeb..318b8976766d915ffafa81a6e7c84e53e79681a5 100644 (file)
@@ -57,7 +57,7 @@ namespace callui {
        // IncomingCallPresenter::Builder
 
        AcceptRejectPresenter::Builder::Builder():
-                       m_callMask(0)
+                       m_callMask(CALL_FLAG_NONE)
        {
        }
 
@@ -101,8 +101,8 @@ namespace callui {
                        m_popup->dispose();
                }
 
-               delRotaryEventHandler(CALLBACK_A(
-                               AcceptRejectPresenter::onRotaryEvent), this);
+               delRotaryEventHandler(
+                               CALLBACK_A(AcceptRejectPresenter::onRotaryEvent), this);
        }
 
        Result AcceptRejectPresenter::prepare(ElmWidget &parent)
diff --git a/src/presenters/AccessoryPresenter.cpp b/src/presenters/AccessoryPresenter.cpp
new file mode 100644 (file)
index 0000000..8865444
--- /dev/null
@@ -0,0 +1,282 @@
+/*
+ * 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 "presenters/AccessoryPresenter.h"
+
+#include "model/ISoundManager.h"
+#include "view/VolumeControl.h"
+#include "resources.h"
+#include "common.h"
+
+namespace callui { namespace { namespace impl {
+
+       using namespace ucl;
+
+       constexpr auto CALL_VC_TIMER_INTERVAL = 1.5;
+       constexpr auto VOLUME_LEVEL_MIN = 1;
+
+       constexpr LayoutTheme LAYOUT_ACCESSORY_WIDGET
+               {"layout", "callui", "accessory"};
+
+       constexpr EdjePart PART_SWL_VOLUME_CONTROL {"swl.volume_control"};
+
+}}}
+
+namespace callui {
+
+       using namespace ucl;
+
+       AccessoryPresenter::Builder::Builder()
+       {
+       }
+
+       AccessoryPresenter::Builder &AccessoryPresenter::Builder::setSoundManager(const ISoundManagerSRef &sm)
+       {
+               m_sm = sm;
+               return *this;
+       }
+
+       AccessoryPresenterSRef AccessoryPresenter::Builder::build(ElmWidget &parent) const
+       {
+               if (!m_sm) {
+                       LOG_RETURN_VALUE(RES_FAIL, {}, "Sound manager is NULL");
+               }
+
+               auto result = makeShared<AccessoryPresenter>(m_sm);
+               FAIL_RETURN_VALUE(result->prepare(parent), {}, "result->prepare() failed!");
+               return result;
+       }
+
+       AccessoryPresenter::AccessoryPresenter(RefCountObjBase &rc,
+                       const ISoundManagerSRef &sm):
+                       Presenter(rc),
+                       m_sm(sm),
+                       m_vcTimer(nullptr),
+                       m_audioState(m_sm->getAudioState())
+       {
+
+       }
+
+       AccessoryPresenter::~AccessoryPresenter()
+       {
+               stopVCTimer();
+               unregisterCallbacks();
+       }
+
+       Result AccessoryPresenter::prepare(ElmWidget &parent)
+       {
+               FAIL_RETURN(Presenter::prepare(parent), "Presenter::prepare() failed");
+
+               FAIL_RETURN(createWidget(parent), "createWidget() failed");
+
+               FAIL_RETURN(createVolumeControl(), "createVolumeControl() failed");
+
+               registerCallbacks();
+
+               return RES_OK;
+       }
+
+       Widget &AccessoryPresenter::getWidget()
+       {
+               return *m_widget;
+       }
+
+       void AccessoryPresenter::hideVolumeControls()
+       {
+               stopVCTimer();
+               m_vc->hideControls();
+       }
+
+       Result AccessoryPresenter::createWidget(ElmWidget &parent)
+       {
+               m_widget = Layout::Builder().
+                               setTheme(impl::LAYOUT_ACCESSORY_WIDGET).
+                               setIsOwner(true).
+                               build(parent);
+               if (!m_widget) {
+                       LOG_RETURN(RES_FAIL, "Layout::build() failed!");
+               }
+
+               return RES_OK;
+       }
+
+       Result AccessoryPresenter::createVolumeControl()
+       {
+               m_vc = VolumeControl::Builder().
+                               setInfoText(STR_VOLUME).
+                               setMaxSliderValue(m_sm->getMaxVolume()).
+                               setShowControls(false).
+                               setEventHandler(WEAK_DELEGATE(
+                                                               AccessoryPresenter::onVolumeControlEventCb,
+                                                               asWeak(*this))).
+                               build(*m_widget);
+               if (!m_vc) {
+                       LOG_RETURN(RES_FAIL, "VolumeControl::build() failed");
+               }
+               updateVolume(m_sm->getVolume());
+
+               m_widget->setContent(*m_vc, impl::PART_SWL_VOLUME_CONTROL);
+
+               return RES_OK;
+       }
+
+       void AccessoryPresenter::registerCallbacks()
+       {
+               addRotaryEventHandler(CALLBACK_A(
+                               AccessoryPresenter::onRotaryEvent), this);
+
+               m_sm->addAudioStateHandler(DELEGATE(
+                               AccessoryPresenter::onAudioStateChanged, this));
+
+               m_sm->addVolumeStateHandler(DELEGATE(
+                               AccessoryPresenter::onVolumeLevelChanged, this));
+       }
+
+       void AccessoryPresenter::unregisterCallbacks()
+       {
+               delRotaryEventHandler(
+                               CALLBACK_A(AccessoryPresenter::onRotaryEvent), this);
+
+               m_sm->removeAudioStateHandler(DELEGATE(
+                               AccessoryPresenter::onAudioStateChanged, this));
+
+               m_sm->removeVolumeStateHandler(DELEGATE(
+                               AccessoryPresenter::onVolumeLevelChanged, this));
+       }
+
+       Eina_Bool AccessoryPresenter::onVCTimerCb()
+       {
+               m_vc->hideControls();
+               m_vcTimer = nullptr;
+
+               return ECORE_CALLBACK_CANCEL;
+       }
+
+       void AccessoryPresenter::startVCTimer()
+       {
+               stopVCTimer();
+
+               m_vcTimer = ecore_timer_add(impl::CALL_VC_TIMER_INTERVAL,
+                               CALLBACK_B(AccessoryPresenter::onVCTimerCb),
+                               this);
+       }
+
+       void AccessoryPresenter::restartVCTimer()
+       {
+               if (m_vcTimer) {
+                       ecore_timer_reset(m_vcTimer);
+               }
+       }
+
+       void AccessoryPresenter::stopVCTimer()
+       {
+               if (m_vcTimer) {
+                       ecore_timer_del(m_vcTimer);
+                       m_vcTimer = nullptr;
+               }
+       }
+
+       Eina_Bool AccessoryPresenter::onRotaryEvent(Eext_Rotary_Event_Info *info)
+       {
+               if (m_vcTimer) {
+                       restartVCTimer();
+               } else {
+                       m_vc->showControls();
+                       startVCTimer();
+               }
+
+               if (info->direction == EEXT_ROTARY_DIRECTION_CLOCKWISE) {
+                       tryIncreaseVolume();
+               } else {
+                       tryDecreaseVolume();
+               }
+
+               return EINA_TRUE;
+       }
+
+       void AccessoryPresenter::onVolumeControlEventCb(VolumeControlEvent event)
+       {
+               restartVCTimer();
+
+               switch (event) {
+               case VolumeControlEvent::INCREASE:
+                       tryIncreaseVolume();
+                       break;
+               case VolumeControlEvent::DECREASE:
+                       tryDecreaseVolume();
+                       break;
+               default:
+                       break;
+               }
+       }
+
+       void AccessoryPresenter::tryIncreaseVolume()
+       {
+               auto max = m_sm->getMaxVolume();
+               auto cur = m_sm->getVolume();
+
+               if (max != cur) {
+                       m_sm->setVolume(cur + 1);
+               }
+       }
+
+       void AccessoryPresenter::tryDecreaseVolume()
+       {
+               auto cur = m_sm->getVolume();
+
+               if (cur - 1 >= impl::VOLUME_LEVEL_MIN) {
+                       m_sm->setVolume(cur - 1);
+               }
+       }
+
+       void AccessoryPresenter::onAudioStateChanged(AudioStateType state)
+       {
+               if ((m_audioState != AudioStateType::BT &&
+                               state == AudioStateType::BT) ||
+                               (m_audioState == AudioStateType::BT &&
+                                               state != AudioStateType::BT)) {
+                       m_audioState = state;
+                       m_vc->setSliderValue(0);
+                       m_vc->setMaxSliderValue(m_sm->getMaxVolume());
+                       updateVolume(m_sm->getVolume());
+               }
+       }
+
+       void AccessoryPresenter::updateVolume(int value)
+       {
+               m_vc->setSliderValue(value);
+
+               auto max = m_sm->getMaxVolume();
+               auto cur = m_sm->getVolume();
+
+               if (cur == max) {
+                       m_vc->setIncreaseBtnEnable(false);
+                       m_vc->setDecreaseBtnEnable(true);
+               } else if (cur <= impl::VOLUME_LEVEL_MIN) {
+                       m_vc->setIncreaseBtnEnable(true);
+                       m_vc->setDecreaseBtnEnable(false);
+               } else {
+                       m_vc->setIncreaseBtnEnable(true);
+                       m_vc->setDecreaseBtnEnable(true);
+               }
+       }
+
+       void AccessoryPresenter::onVolumeLevelChanged(int value)
+       {
+               updateVolume(value);
+       }
+}
+
index fc1b84804fdcdbbda3054c3fa350af963680f9ea..97973ac0cc5adcf13a84e054dca02be723201756 100644 (file)
@@ -34,6 +34,7 @@
 #include "presenters/AcceptRejectPresenter.h"
 #include "presenters/CallInfoPresenter.h"
 #include "presenters/RejectMsgPresenter.h"
+#include "presenters/AccessoryPresenter.h"
 
 #include "resources.h"
 #include "common.h"
@@ -62,8 +63,6 @@ namespace callui { namespace { namespace impl {
 
        constexpr ElmStyle STYLE_BB_END_CALL {"callui/end_call"};
        constexpr ElmStyle STYLE_BB_RECALL {"callui/call_back"};
-
-       constexpr SmartEvent EVENT_CLICKED {"clicked"};
 }}}
 
 namespace callui {
@@ -217,6 +216,9 @@ namespace callui {
                        requestExit();
                        break;
                default:
+                       if (m_accessoryPrs) {
+                               m_accessoryPrs->hideVolumeControls();
+                       }
                        break;
                }
        }
@@ -351,7 +353,7 @@ namespace callui {
                                elm_button_add(*m_widget), true);
                m_bottomBtn->setStyle(style);
 
-               m_bottomBtn->addEventHandler(impl::EVENT_CLICKED,
+               m_bottomBtn->addEventHandler(BTN_CLICKED,
                                WEAK_DELEGATE(MainPage::onBottomBtnClicked,
                                                asWeak(*this)));
 
@@ -406,6 +408,7 @@ namespace callui {
                m_bottomBtn.reset();
 
                if (m_mode == CallMode::INCOMING) {
+                       m_accessoryPrs.reset();
                        FAIL_RETURN_VOID(processIncomingCall(),
                                        "processIncomingCall() failed!");
                } else {
@@ -414,8 +417,10 @@ namespace callui {
                        m_rmLy.reset();
 
                        if (m_mode == CallMode::END) {
+                               m_accessoryPrs.reset();
                                startEndCallTimer();
                        } else {
+                               createAccessoryPresenter();
                                createBottomBtn(impl::STYLE_BB_END_CALL);
                        }
                }
@@ -424,6 +429,27 @@ namespace callui {
                                "createCallInfoPresenter() failed!");
        }
 
+       Result MainPage::createAccessoryPresenter()
+       {
+               if (m_accessoryPrs) {
+                       return RES_OK;
+               }
+
+               m_accessoryPrs = AccessoryPresenter::Builder().
+                               setSoundManager(m_call->getSoundManager()).
+                               build(*m_widget);
+
+               if (!m_accessoryPrs) {
+                       LOG_RETURN(RES_FAIL,
+                                       "AccessoryPresenter::build() failed!");
+               }
+
+               m_widget->setContent(m_accessoryPrs->getWidget().getEo(),
+                               impl::PART_SWL_OVERLAY);
+
+               return RES_OK;
+       }
+
        Result MainPage::createAcceptRejectPresenter()
        {
                if (m_acceptRejectPrs) {
@@ -438,7 +464,7 @@ namespace callui {
 
                if (!m_acceptRejectPrs) {
                        LOG_RETURN(RES_FAIL,
-                                       "AcceptRejectPresenter::Builder().build() failed!");
+                                       "AcceptRejectPresenter::build() failed!");
                }
 
                m_widget->setContent(m_acceptRejectPrs->getWidget().getEo(),
index 2a1717136f078457e5cecd79b6d8215733e4d251..18bd36fc28a5c1d88ed8e5656c0e75ef6b8937cf 100644 (file)
@@ -23,4 +23,6 @@
 
 #include "../common.h"
 
+#include "../view/common.h"
+
 #endif // __CALLUI_PRESENTERS_COMMON_H__
index 285e48ac7b61ee2ad71c3ea8178fc902b2b7f0ff..6b666d9b91a4adca9c2213925a6f1c4baf75bc19 100644 (file)
@@ -37,4 +37,6 @@ namespace callui {
        const ucl::TString STR_CALL_ENDED {"Call ended"};
 
        const ucl::TString STR_DECLINE_MESSAGES {"Decline messages"};
+
+       const ucl::TString STR_VOLUME {"Volume"};
 }
index bc05de34fd675dc1497ee81cc207734741df5e0e..68cc4c430530b49ff0aa8f5f5160c8a19d483b76 100644 (file)
@@ -27,7 +27,6 @@
 namespace callui {
 
        constexpr ucl::SmartEvent BTN_CLICKED {"clicked"};
-       constexpr ucl::SmartEvent POPUP_DELETE {"delete"};
 }
 
 #endif // __CALLUI_VIEW_COMMON_H__
index b972fd792248d296e08dd9b61607e60cb1a478b8..d8c27cb156bc24741ecee3738d7cd570644e58b8 100644 (file)
     <privileges>
         <privilege>http://tizen.org/privilege/telephony</privilege>
         <privilege>http://tizen.org/privilege/telephony.admin</privilege>
-        <privilege>http://tizen.org/privilege/keygrab</privilege>
         <privilege>http://tizen.org/privilege/appmanager.launch</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/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>