[Sound] SoundModeChangeListener
authorKamil Lysik <k.lysik@samsung.com>
Mon, 9 Feb 2015 11:58:27 +0000 (12:58 +0100)
committerPawel Sikorski <p.sikorski@samsung.com>
Wed, 11 Feb 2015 11:07:25 +0000 (20:07 +0900)
[Verification] Build required

Change-Id: I7662d34c1f66a5a6f761e18d9b77187cfdb81067
Signed-off-by: Kamil Lysik <k.lysik@samsung.com>
src/sound/sound_instance.cc
src/sound/sound_instance.h
src/sound/sound_manager.cc
src/sound/sound_manager.h

index 46b669c..8d84240 100644 (file)
@@ -71,30 +71,36 @@ void SoundInstance::SoundManagerGetVolume(const picojson::value& args,
 }
 
 void SoundInstance::SoundManagerSetSoundModeChangeListener(const picojson::value& args, picojson::object& out) {
-  CHECK_EXIST(args, "callbackId", out)
-
-  int callbackId = static_cast<int>(args.get("callbackId").get<double>());
+  LoggerD("enter");
+  bool status = manager_->SetSoundModeChangeListener(this);
 
-  // implement it
-
-  // call ReplyAsync in later (Asynchronously)
-
-  // if success
-  // ReportSuccess(out);
-  // if error
-  // ReportError(out);
+  if (status)
+    ReportSuccess(out);
+  else
+    ReportError(out);
 }
-void SoundInstance::SoundManagerUnsetSoundModeChangeListener(const picojson::value& args, picojson::object& out) {
-
 
-  // implement it
+void SoundInstance::SoundManagerUnsetSoundModeChangeListener(const picojson::value& args, picojson::object& out) {
+  LoggerD("enter");
+  bool status = manager_->UnsetSoundModeChangeListener();
 
+  if (status)
+    ReportSuccess(out);
+  else
+    ReportError(out);
+}
 
-  // if success
-  // ReportSuccess(out);
-  // if error
-  // ReportError(out);
+void SoundInstance::OnSoundModeChange(const std::string& newmode)
+{
+  picojson::value event = picojson::value(picojson::object());
+  picojson::object& obj = event.get<picojson::object>();
+  picojson::value result = picojson::value(newmode);
+  ReportSuccess(result, obj);
+  obj["listenerId"] = picojson::value("SoundModeChangeListener");
+  LoggerD("Posting: %s", event.serialize().c_str());
+  PostMessage(event.serialize().c_str());
 }
+
 void SoundInstance::SoundManagerSetVolumeChangeListener(const picojson::value& args, picojson::object& out) {
   CHECK_EXIST(args, "callbackId", out)
 
index de5b681..0736c0b 100644 (file)
@@ -11,7 +11,7 @@
 namespace extension {
 namespace sound {
 
-class SoundInstance : public common::ParsedInstance {
+class SoundInstance : public common::ParsedInstance, public SoundManagerSoundModeChangedListener {
  public:
   SoundInstance();
   virtual ~SoundInstance();
@@ -26,6 +26,8 @@ class SoundInstance : public common::ParsedInstance {
   void SoundManagerSetSoundModeChangeListener(const picojson::value& args, picojson::object& out);
   void SoundManagerSetVolumeChangeListener(const picojson::value& args, picojson::object& out);
   void SoundManagerGetSoundMode(const picojson::value& args, picojson::object& out);
+
+  void OnSoundModeChange(const std::string& newmode);
 };
 
 } // namespace sound
index f892416..bc72a0a 100644 (file)
@@ -45,9 +45,19 @@ std::string SoundManager::PlatformEnumToStr(const sound_type_e value) {
   // TODO:  throw InvalidValuesException(message);
 }
 
-SoundManager::SoundManager() { FillMaxVolumeMap(); }
+SoundManager::SoundManager()
+    : soundModeChangeListening(false), soundModeListener(nullptr) {
+  FillMaxVolumeMap();
+}
 
-SoundManager::~SoundManager() {}
+SoundManager::~SoundManager() {
+  if (soundModeChangeListening) {
+    int status = vconf_ignore_key_changed(VCONFKEY_SETAPPL_VIBRATION_STATUS_BOOL, SoundManager::soundModeChangedCb);
+    if (VCONF_OK != status) {
+      LoggerE("Cannot disable listener!");
+    }
+  }
+}
 
 SoundManager* SoundManager::GetInstance() {
   static SoundManager instance;
@@ -162,9 +172,47 @@ double SoundManager::GetVolume(const picojson::object& args) {
   return volume;
 }
 
-void SoundManager::SetSoundModeChangeListener(const picojson::object& args) {}
+void SoundManager::soundModeChangedCb(keynode_t*, void* user_data)
+{
+  LOGD("enter");
+  if (user_data == nullptr) {
+    LoggerE("Invalid callback data!");
+    return;
+  }
+  SoundManager* self = static_cast<SoundManager*>(user_data);
+  std::string soundModeType = self->GetSoundMode();
+  //TODO: ERROR CHECK
+  if (self->soundModeListener) {
+    self->soundModeListener->OnSoundModeChange(soundModeType);
+  } else {
+    LOGE("No SoundModeListener attached");
+  }
+}
 
-void SoundManager::UnsetSoundModeChangeListener() {}
+bool SoundManager::SetSoundModeChangeListener(SoundManagerSoundModeChangedListener* listener) {
+  soundModeListener = listener;
+  if (soundModeChangeListening)
+    return true;
+  int status = vconf_notify_key_changed(VCONFKEY_SETAPPL_VIBRATION_STATUS_BOOL, SoundManager::soundModeChangedCb, this);
+  if (VCONF_OK == status) {
+    soundModeChangeListening = true;
+    return true;
+  }
+  return false;
+}
+
+bool SoundManager::UnsetSoundModeChangeListener() {
+  soundModeListener = nullptr;
+  if (!soundModeChangeListening) {
+    return true;
+  }
+  int status = vconf_ignore_key_changed(VCONFKEY_SETAPPL_VIBRATION_STATUS_BOOL, SoundManager::soundModeChangedCb);
+  if (VCONF_OK == status) {
+    soundModeChangeListening = false;
+    return true;
+  }
+  return false;
+}
 
 void SoundManager::SetVolumeChangeListener(const picojson::object& args) {}
 
index f7d63e7..e17f5ca 100644 (file)
@@ -8,10 +8,17 @@
 #include <sound_manager.h>
 
 #include "common/picojson.h"
+#include <vconf.h>
 
 namespace extension {
 namespace sound {
 
+class SoundManagerSoundModeChangedListener
+{
+public:
+  virtual void OnSoundModeChange(const std::string& newmode) = 0;
+};
+
 class SoundManager {
  public:
   static SoundManager* GetInstance();
@@ -19,8 +26,8 @@ class SoundManager {
   std::string GetSoundMode();
   void SetVolume(const picojson::object& args);
   double GetVolume(const picojson::object& args);
-  void SetSoundModeChangeListener(const picojson::object& args);
-  void UnsetSoundModeChangeListener();
+  bool SetSoundModeChangeListener(SoundManagerSoundModeChangedListener* listener);
+  bool UnsetSoundModeChangeListener();
   void SetVolumeChangeListener(const picojson::object& args);
   void UnsetVolumeChangeListener();
 
@@ -36,6 +43,10 @@ class SoundManager {
 
   static sound_type_e StrToPlatformEnum(const std::string& key);
   static std::string PlatformEnumToStr(const sound_type_e value);
+
+  static void soundModeChangedCb(keynode_t *node, void *user_data);
+  bool soundModeChangeListening;
+  SoundManagerSoundModeChangedListener* soundModeListener;
 };
 
 }  // namespace sound