TizenRefApp-8780 Implement Send As Audio menu item in Settings 54/136454/1
authorDenis Dolzhenko <d.dolzhenko@samsung.com>
Thu, 29 Jun 2017 16:08:18 +0000 (19:08 +0300)
committerDenis Dolzhenko <d.dolzhenko@samsung.com>
Thu, 29 Jun 2017 16:08:18 +0000 (19:08 +0300)
Change-Id: I91601a07bf8f0f70ae93bd78849844d82707810d
Signed-off-by: Denis Dolzhenko <d.dolzhenko@samsung.com>
src/Common/MsgEngine/inc/MsgSettings.h
src/Common/MsgEngine/src/MsgSettings.cpp
src/Common/View/inc/ListItem.h
src/Common/View/src/ListItem.cpp
src/Settings/Controller/inc/SettingsFrame.h
src/Settings/Controller/src/SettingsFrame.cpp
src/Settings/View/inc/SettingsMenuListItem.h
src/Settings/View/src/SettingsMenuListItem.cpp

index 32d9873fd48ee32b4068bda7bac20d5d944cdd7f..2f75e6a19d505a3079893b33c663f517143776c3 100644 (file)
@@ -86,6 +86,9 @@ namespace Msg {
             virtual void setActiveNotifPolicy(ActiveNotifPolicy type) = 0;
             virtual void setActiveNotifPolicy(ThreadId id) = 0;
 
+            void setSendAsAudio(bool value);
+            bool getSendAsAudio() const;
+
         protected:
             typedef std::vector<IMsgSettingsListener *> MsgSettingsListeners;
 
@@ -95,12 +98,16 @@ namespace Msg {
         private:
             MsgSettings(MsgSettings&) = delete;
             MsgSettings& operator=(MsgSettings&) = delete;
+
+            void onSendAsAudioChanged(const char *key);
+            void prepareSendAsAudio();
     };
 
     class IMsgSettingsListener {
         public:
             virtual ~IMsgSettingsListener() {}
             virtual void onRingtoneChanged(MsgSettings &msgSetting) {};
+            virtual void onSendAsAudioChanged(MsgSettings &msgSetting) {};
     };
 }
 
index 47ea37d42b4183e2879d9b11b386f0452173e249..f4a85fd77b82a4e83276fa7a79107cf78e6f3fb1 100644 (file)
  * limitations under the License.
  */
 
-#include "Config.h"
 #include "MsgSettings.h"
+#include "Config.h"
+#include "Callback.h"
 #include <algorithm>
+#include <app_preference.h>
 
 using namespace Msg;
 
@@ -24,14 +26,26 @@ const int defaultSmsGsm7MaxLen = 160;
 const int defaultSmsMaxPage = 3;
 const int defaultMaxAttachmentsCount = 10;
 
+#define SEND_AS_AUDIO_KEY PREF_PREFX"/send_as_audio"
+
 MsgSettings::MsgSettings()
 {
+    prepareSendAsAudio();
 }
 
 MsgSettings::~MsgSettings()
 {
 }
 
+void MsgSettings::prepareSendAsAudio()
+{
+    bool existing = false;
+    preference_is_existing(SEND_AS_AUDIO_KEY, &existing);
+    if (!existing)
+        setSendAsAudio(false);
+    preference_set_changed_cb(SEND_AS_AUDIO_KEY, makeCbLast(&MsgSettings::onSendAsAudioChanged), this);
+}
+
 int MsgSettings::getMessageTextMaxChar() const
 {
     return defaultSmsGsm7MaxLen;
@@ -50,8 +64,7 @@ int MsgSettings::getAttachmentsMaxCount() const
 void MsgSettings::addListener(IMsgSettingsListener &listener)
 {
     auto itr = std::find(m_Listeners.begin(), m_Listeners.end(), &listener);
-    if (itr == m_Listeners.end())
-    {
+    if (itr == m_Listeners.end()) {
         m_Listeners.push_back(&listener);
     }
 }
@@ -59,9 +72,26 @@ void MsgSettings::addListener(IMsgSettingsListener &listener)
 void MsgSettings::removeListener(IMsgSettingsListener &listener)
 {
     auto itr = std::find(m_Listeners.begin(), m_Listeners.end(), &listener);
-    if (itr != m_Listeners.end())
-    {
+    if (itr != m_Listeners.end()) {
         m_Listeners.erase(itr);
     }
 }
 
+void MsgSettings::setSendAsAudio(bool value)
+{
+    preference_set_boolean(SEND_AS_AUDIO_KEY, value);
+}
+
+bool MsgSettings::getSendAsAudio() const
+{
+    bool value = false;
+    preference_get_boolean(SEND_AS_AUDIO_KEY, &value);
+    return value;
+}
+
+void MsgSettings::onSendAsAudioChanged(const char *key)
+{
+    for (auto listener: m_Listeners)
+        listener->onSendAsAudioChanged(*this);
+}
+
index 625224125cbc6f362c43bc50aee012058c877717..2c179e4ca824ffb1df88c75130027bd2bc671114 100644 (file)
@@ -199,6 +199,8 @@ namespace Msg
             virtual void onRealized(ListItem &item) {};
             virtual void onUnrealized(ListItem &item) {};
 
+            OnSelectedCb &getOnSelectedCb();
+
         private:
             virtual void onViewDestroyed();
             Evas_Object *addCheck();
index 355f89e429c696808ef50335559dfeb8ad00be0f..9228470bfc14281b9397c5c61b5fbe7b25d2ebfa 100644 (file)
@@ -204,6 +204,11 @@ void ListItem::setOnSelectedCb(OnSelectedCb cb)
     m_OnSelectedCb = cb;
 }
 
+ListItem::OnSelectedCb &ListItem::getOnSelectedCb()
+{
+    return m_OnSelectedCb;
+}
+
 void ListItem::onCheckChanged(Evas_Object *obj, void *eventInfo)
 {
     m_Checked = elm_check_state_get(obj);
index 48b37500bf894b618c57413f6f1eb2475f7966c4..59fea87e8f8d03148a7cf731ca7b99b1a84c3d26 100644 (file)
 #define SettingsFrame_h_
 
 #include "FrameController.h"
-#include "SettingsMenuBlockListFrame.h"
+#include "ListView.h"
+#include "MsgSettings.h"
 
 namespace Msg {
+
+    class SettingsMenuListItem;
+
     /**
      * @brief A core-class responsible for a whole lifecycle of settings-module and for managing
      *        sub-components of message settings.
      */
     class SettingsFrame
-        : public SettingsMenuBlockListFrame {
+        : public FrameController
+        , private IListViewListener
+        , private IMsgSettingsListener {
+
         public:
             /**
              * @brief A constructor of Settings object based on outside parent object.
@@ -38,6 +45,27 @@ namespace Msg {
         private:
             // NaviFrameItem:
             void onAttached(ViewItem &item) override;
+
+            // ListView:
+            void onSountItemSelected(ListItem &item);
+            void onSountItemChecked(SettingsMenuListItem &item);
+            void onBlockListSelected(ListItem &item);
+
+            // IMsgSettingsListener:
+            void onSendAsAudioChanged(MsgSettings &msgSetting) override;
+
+        private:
+            void preapareList();
+            void fillList();
+
+            void updateItems();
+            void updateAudioItem();
+            void updateBlockListItem();
+
+        private:
+            ListView *m_pList;
+            SettingsMenuListItem *m_pAudioItem;
+            SettingsMenuListItem *m_pBlockListItem;
     };
 }
 
index 85eb4627183131ded7ded2af9883e48483e11ae2..45b7766a00a64d70a501397ad5fc9acca4e2a0d4 100644 (file)
  */
 
 #include "SettingsFrame.h"
+#include "PaddingListViewItem.h"
+#include "SettingsMenuListItem.h"
+#include "TitleListItem.h"
+#include "SettingsMenuBlockListFrame.h"
+#include "App.h"
+#include "MsgEngine.h"
+#include "Window.h"
 #include "Logger.h"
+#include "LangUtils.h"
+#include <functional>
 
 using namespace Msg;
 
 SettingsFrame::SettingsFrame(NaviFrameController &parent)
-    : SettingsMenuBlockListFrame(parent)
+    : FrameController(parent)
+    , m_pList(nullptr)
+    , m_pAudioItem(nullptr)
+    , m_pBlockListItem(nullptr)
 {
+    preapareList();
+    App::getInst().getMsgEngine().getSettings().addListener(*this);
 }
 
 SettingsFrame::~SettingsFrame()
 {
+    App::getInst().getMsgEngine().getSettings().removeListener(*this);
+}
+
+void SettingsFrame::preapareList()
+{
+    if (!m_pList) {
+        m_pList = new ListView(getParent(), App::getInst().getWindow().getCircleSurface());
+        m_pList->setHomogeneous(false);
+        m_pList->setMultiSelection(false);
+        fillList();
+    }
+}
+
+void SettingsFrame::fillList()
+{
+    using namespace std::placeholders;
+
+    // Title:
+    auto *titleItem = new TitleListItem;
+    titleItem->setTitle("WDS_MSG_HEADER_MESSAGES_ABB", true);
+    m_pList->appendItem(*titleItem);
+
+    // Send as audio:
+    m_pAudioItem = new SettingsMenuListItem(SettingsMenuListItem::twoTextIconStyle);
+    m_pAudioItem->setOnSelectedCb(std::bind(&SettingsFrame::onSountItemSelected, this, _1));
+    m_pAudioItem->setOnChangedCb(std::bind(&SettingsFrame::onSountItemChecked, this, _1));
+    updateAudioItem();
+    m_pList->appendItem(*m_pAudioItem);
+
+    // Block list:
+    m_pBlockListItem = new SettingsMenuListItem(SettingsMenuListItem::twoTextStyle);
+    m_pBlockListItem->setOnSelectedCb(std::bind(&SettingsFrame::onBlockListSelected, this, _1));
+    updateBlockListItem();
+    m_pList->appendItem(*m_pBlockListItem);
+
+    // Bottom padding:
+    m_pList->appendItem(*new PaddingListViewItem);
+}
+
+void SettingsFrame::updateItems()
+{
+    updateAudioItem();
+    updateBlockListItem();
+}
+
+void SettingsFrame::updateAudioItem()
+{
+    m_pAudioItem->setText(msg("WDS_MSG_MBODY_SEND_AS_AUDIO_ABB"));
+    m_pAudioItem->setSubText(msg("WDS_MSG_SBODY_USING_VOICE_INPUT_ABB"));
+    m_pAudioItem->setMenuCheckedState(App::getInst().getMsgEngine().getSettings().getSendAsAudio());
+}
+
+void SettingsFrame::updateBlockListItem()
+{
+    m_pBlockListItem->setText(msg("WDS_MSG_MBODY_BLOCK_LIST"));
 }
 
 void SettingsFrame::onAttached(ViewItem &item)
 {
     MSG_LOG("");
-    SettingsMenuBlockListFrame::onAttached(item);
+    FrameController::onAttached(item);
+    preapareList();
+    setContent(*m_pList);
+}
+
+void SettingsFrame::onSountItemSelected(ListItem &item)
+{
+    MSG_LOG("");
+    auto &seetingsItem = static_cast<SettingsMenuListItem&>(item);
+    seetingsItem.changeMenuCheckedState();
+    bool newState = seetingsItem.getMenuCheckedState();
+    App::getInst().getMsgEngine().getSettings().setSendAsAudio(newState);
+}
+
+void SettingsFrame::onSountItemChecked(SettingsMenuListItem &item)
+{
+    MSG_LOG("");
+    bool newState = item.getMenuCheckedState();
+    App::getInst().getMsgEngine().getSettings().setSendAsAudio(newState);
+}
+
+void SettingsFrame::onBlockListSelected(ListItem &item)
+{
+    MSG_LOG("");
+    auto *frame = new SettingsMenuBlockListFrame(getParent());
+    getParent().push(*frame);
+}
+
+void SettingsFrame::onSendAsAudioChanged(MsgSettings &msgSetting)
+{
+    MSG_LOG("");
+    updateAudioItem();
 }
index 5e75bf1811063a84be64dc23c16f7de29b706f33..2ceb0ce6b4d5fd63326bab43525babfd57b95138 100644 (file)
 #define SettingsMenuListItem_h_
 
 #include "ListItem.h"
+#include "LangUtils.h"
 
 namespace Msg {
     class SettingsMenuListItem
         : public ListItem {
 
          public:
+            using OnChangedCb = std::function<void(SettingsMenuListItem &item)>;
+
             static ListItemStyleRef oneTextStyle;
             static ListItemStyleRef twoTextStyle;
+            static ListItemStyleRef twoTextIconStyle;
 
         public:
             SettingsMenuListItem(const ListItemStyleRef &itemStyle);
@@ -34,12 +38,23 @@ namespace Msg {
             void setText(std::string text);
             void setSubText(std::string text);
 
+            void setOnChangedCb(OnChangedCb cb);
+            void setMenuCheckedState(bool state);
+            void changeMenuCheckedState();
+            bool getMenuCheckedState() const;
+
         private:
             std::string getText(ListItem &item, const char *part) override;
+            Evas_Object *getContent(ListItem &item, const char *part) override;
+
+            Evas_Object *createCheck();
+            void onCheckChanged(Evas_Object *obj, void *event_info);
 
         private:
             std::string m_Text;
             std::string m_SubText;
+            Eina_Bool m_CheckedState;
+            OnChangedCb m_OnChangedCb;
     };
 }
 
index edf6d811cb05d3c77cda83882350d10a228e81d6..52608932997cd4f9697c0069615af92fe9ee1220 100644 (file)
@@ -16,6 +16,9 @@
 
 #include "SettingsMenuListItem.h"
 #include "LangUtils.h"
+#include "ListView.h"
+#include "Logger.h"
+#include "Callback.h"
 
 using namespace Msg;
 
@@ -26,9 +29,11 @@ namespace {
 
 ListItemStyleRef SettingsMenuListItem::oneTextStyle = ListItemStyle::create("1text");
 ListItemStyleRef SettingsMenuListItem::twoTextStyle = ListItemStyle::create("2text");
+ListItemStyleRef SettingsMenuListItem::twoTextIconStyle = ListItemStyle::create("2text.1icon.1");
 
 SettingsMenuListItem::SettingsMenuListItem(const ListItemStyleRef &itemStyle)
     : ListItem(itemStyle)
+    , m_CheckedState(false)
 {
 }
 
@@ -46,6 +51,29 @@ void SettingsMenuListItem::setSubText(std::string text)
     m_SubText = std::move(text);
 }
 
+void SettingsMenuListItem::setOnChangedCb(OnChangedCb cb)
+{
+    m_OnChangedCb = std::move(cb);
+}
+
+void SettingsMenuListItem::setMenuCheckedState(bool state)
+{
+    if (m_CheckedState != state) {
+        m_CheckedState = state;
+        update();
+    }
+}
+
+void SettingsMenuListItem::changeMenuCheckedState()
+{
+    setMenuCheckedState(!m_CheckedState);
+}
+
+bool SettingsMenuListItem::getMenuCheckedState() const
+{
+    return m_CheckedState;
+}
+
 std::string SettingsMenuListItem::getText(ListItem &item, const char *part)
 {
     if (strcmp(part, mainTextPart) == 0)
@@ -57,3 +85,31 @@ std::string SettingsMenuListItem::getText(ListItem &item, const char *part)
     return "";
 }
 
+Evas_Object *SettingsMenuListItem::createCheck()
+{
+    Evas_Object *check = nullptr;
+    check = elm_check_add(*getOwner());
+    elm_object_focus_allow_set(check, false);
+    elm_object_style_set(check, "on&off");
+    elm_check_state_set(check, m_CheckedState);
+    elm_check_state_pointer_set(check, &m_CheckedState);
+    evas_object_propagate_events_set(check, false);
+    evas_object_smart_callback_add(check, "changed", makeCbFirst(&SettingsMenuListItem::onCheckChanged), this);
+    View::processSignal(check);
+    return check;
+}
+
+Evas_Object *SettingsMenuListItem::getContent(ListItem &item, const char *part)
+{
+    if (strcmp(part, "elm.icon") == 0)
+        return createCheck();
+    return nullptr;
+}
+
+void SettingsMenuListItem::onCheckChanged(Evas_Object *obj, void *event_info)
+{
+    MSG_LOG("");
+    if (m_OnChangedCb)
+        m_OnChangedCb(*this);
+}
+