Implement IFocus iface Change-Id: Ifd8418b029d28c189285df5091c18e009abd78b7 Signed-off-by: Eugene Mutavchi <Ievgen_Mutavchi@comcast.com>
diff --git a/plugin/Cobalt.h b/plugin/Cobalt.h index d7b09b0..c9b5188 100644 --- a/plugin/Cobalt.h +++ b/plugin/Cobalt.h
@@ -20,6 +20,7 @@ #include "Module.h" #include <interfaces/IBrowser.h> #include <interfaces/IMemory.h> +#include <interfaces/IFocus.h> #include <interfaces/json/JsonData_Browser.h> #include <interfaces/json/JsonData_StateControl.h> @@ -123,6 +124,7 @@ INTERFACE_AGGREGATE(PluginHost::IStateControl, _cobalt) INTERFACE_AGGREGATE(Exchange::IBrowser, _cobalt) INTERFACE_AGGREGATE(Exchange::IMemory, _memory) + INTERFACE_AGGREGATE(Exchange::IFocus, _cobalt) END_INTERFACE_MAP public:
diff --git a/plugin/CobaltImplementation.cpp b/plugin/CobaltImplementation.cpp index 72c3932..1280d1f 100644 --- a/plugin/CobaltImplementation.cpp +++ b/plugin/CobaltImplementation.cpp
@@ -19,6 +19,7 @@ #include <interfaces/IMemory.h> #include <interfaces/IBrowser.h> #include <interfaces/IDictionary.h> +#include <interfaces/IFocus.h> extern "C" { @@ -26,6 +27,8 @@ void SbRdkHandleDeepLink(const char* link); void SbRdkSuspend(); void SbRdkResume(); +void SbRdkPause(); +void SbRdkUnpause(); void SbRdkQuit(); void SbRdkSetSetting(const char* key, const char* json); int SbRdkGetSetting(const char* key, char** out_json); @@ -63,10 +66,17 @@ file.Close(); } +enum StateChangeCommand : uint16_t { + SUSPEND = PluginHost::IStateControl::SUSPEND, + RESUME = PluginHost::IStateControl::RESUME, + BACKGROUND +}; + class CobaltImplementation: public Exchange::IBrowser, public PluginHost::IStateControl, - public Exchange::IDictionary { + public Exchange::IDictionary, + public Exchange::IFocus { private: class Config: public Core::JSON::Container { private: @@ -113,7 +123,7 @@ public: NotificationSink(CobaltImplementation &parent) : _parent(parent), _command( - PluginHost::IStateControl::SUSPEND) { + StateChangeCommand::SUSPEND) { } virtual ~NotificationSink() { Stop(); @@ -122,7 +132,7 @@ public: void RequestForStateChange( - const PluginHost::IStateControl::command command) { + const StateChangeCommand command) { _lock.Lock(); _command = command; _lock.Unlock(); @@ -134,7 +144,7 @@ bool success = false; _lock.Lock(); - const PluginHost::IStateControl::command command = _command; + const StateChangeCommand command = _command; _lock.Unlock(); if ((IsRunning() == true) && (success == false)) { @@ -157,7 +167,7 @@ private: CobaltImplementation &_parent; - PluginHost::IStateControl::command _command; + StateChangeCommand _command; mutable Core::CriticalSection _lock; }; @@ -307,6 +317,17 @@ return (true); } + bool Pause(const bool paused) + { + if (paused == true) { + SbRdkPause(); + } + else { + SbRdkUnpause(); + } + return (true); + } + string Url() const { return _url; } bool IsPreloadEnabled() const { return _preloadEnabled; } @@ -480,34 +501,28 @@ _adminLock.Lock(); - if (_state == PluginHost::IStateControl::UNINITIALIZED) { - // Seems we are passing state changes before we reached an operational Cobalt. - // Just move the state to what we would like it to be :-) - _state = ( - command == PluginHost::IStateControl::SUSPEND ? - PluginHost::IStateControl::SUSPENDED : - PluginHost::IStateControl::RESUMED); - result = Core::ERROR_NONE; + if (_state == PluginHost::IStateControl::UNINITIALIZED || _state == PluginHost::IStateControl::EXITED) { + ASSERT(false); } else { switch (command) { case PluginHost::IStateControl::SUSPEND: - if (_state == PluginHost::IStateControl::RESUMED || _statePending == PluginHost::IStateControl::RESUMED) { + if (_state != PluginHost::IStateControl::SUSPENDED && _statePending != PluginHost::IStateControl::SUSPENDED) { _statePending = PluginHost::IStateControl::SUSPENDED; _sink.RequestForStateChange( - PluginHost::IStateControl::SUSPEND); - result = Core::ERROR_NONE; + StateChangeCommand::SUSPEND); } + result = Core::ERROR_NONE; break; case PluginHost::IStateControl::RESUME: - if (_state == PluginHost::IStateControl::SUSPENDED || _statePending == PluginHost::IStateControl::SUSPENDED) { + if (_state != PluginHost::IStateControl::RESUMED && _statePending != PluginHost::IStateControl::RESUMED) { _statePending = PluginHost::IStateControl::RESUMED; _sink.RequestForStateChange( - PluginHost::IStateControl::RESUME); - result = Core::ERROR_NONE; + StateChangeCommand::RESUME); } if (_delayedSuspend.IsScheduled()) { _delayedSuspend.Cancel(); } + result = Core::ERROR_NONE; break; default: break; @@ -520,10 +535,10 @@ } void StateChangeCompleted(bool success, - const PluginHost::IStateControl::command request) { + const StateChangeCommand request) { if (success) { switch (request) { - case PluginHost::IStateControl::RESUME: + case StateChangeCommand::RESUME: _adminLock.Lock(); @@ -533,7 +548,7 @@ _adminLock.Unlock(); break; - case PluginHost::IStateControl::SUSPEND: + case StateChangeCommand::SUSPEND: _adminLock.Lock(); @@ -543,6 +558,8 @@ _adminLock.Unlock(); break; + case StateChangeCommand::BACKGROUND: + break; default: ASSERT(false); break; @@ -555,11 +572,24 @@ void RequestDelayedSuspend() { _adminLock.Lock(); if (_state == PluginHost::IStateControl::SUSPENDED && _statePending == PluginHost::IStateControl::SUSPENDED) { - _sink.RequestForStateChange(PluginHost::IStateControl::SUSPEND); + _sink.RequestForStateChange(StateChangeCommand::SUSPEND); } _adminLock.Unlock(); } + // IFocus + uint32_t Focused(const bool focused) override { + _adminLock.Lock(); + if (_state == PluginHost::IStateControl::RESUMED || _statePending == PluginHost::IStateControl::RESUMED) { + if (focused) + _sink.RequestForStateChange(StateChangeCommand::RESUMED); + else + _sink.RequestForStateChange(StateChangeCommand::BACKGROUND); + } + _adminLock.Unlock(); + return Core::ERROR_NONE; + }; + // IDictionary iface void Register(const string& nameSpace, struct IDictionary::INotification* sink) override { } void Unregister(const string& nameSpace, struct IDictionary::INotification* sink) override { } @@ -591,28 +621,50 @@ INTERFACE_ENTRY (Exchange::IBrowser) INTERFACE_ENTRY (PluginHost::IStateControl) INTERFACE_ENTRY (Exchange::IDictionary) + INTERFACE_ENTRY (Exchange::IFocus) END_INTERFACE_MAP private: + static const char* ToString(const StateChangeCommand command) { + switch(command) { + case StateChangeCommand::SUSPEND: + return "suspend"; + case StateChangeCommand::RESUME: + return "resume"; + case StateChangeCommand::BACKGROUND: + return "background"; + default: + break; + } + return "unknown"; + } + inline bool RequestForStateChange( - const PluginHost::IStateControl::command command) { + const StateChangeCommand command) { bool result = false; - SYSLOG(Logging::Notification, (_T("Cobalt request state change -> %s\n"), command == PluginHost::IStateControl::SUSPEND ? "suspend" : "resume")); + SYSLOG(Logging::Notification, (_T("Cobalt request state change -> %s\n"), ToString(command))); switch (command) { - case PluginHost::IStateControl::SUSPEND: { + case StateChangeCommand::SUSPEND: { if (_window.Suspend(true) == true) { result = true; } break; } - case PluginHost::IStateControl::RESUME: { + case StateChangeCommand::RESUME: { + // implies unpause if (_window.Suspend(false) == true) { result = true; } break; } + case StateChangeCommand::BACKGROUND: { + if (_window.Pause(true) == true) { + result = true; + } + break; + } default: ASSERT(false); break;
diff --git a/plugin/CobaltJsonRpc.cpp b/plugin/CobaltJsonRpc.cpp index 01fd14a..b9466a4 100644 --- a/plugin/CobaltJsonRpc.cpp +++ b/plugin/CobaltJsonRpc.cpp
@@ -18,6 +18,7 @@ #include <interfaces/json/JsonData_Browser.h> #include <interfaces/json/JsonData_StateControl.h> #include <interfaces/IDictionary.h> +#include <core/Optional.h> #include "Cobalt.h" #include "Module.h" @@ -134,16 +135,26 @@ uint32_t Cobalt::get_state(Core::JSON::EnumType<StateType> &response) const /* StateControl */ { ASSERT(_cobalt != nullptr); + + response.Clear(); + PluginHost::IStateControl *stateControl(_cobalt->QueryInterface<PluginHost::IStateControl>()); if (stateControl != nullptr) { PluginHost::IStateControl::state currentState = stateControl->State(); - response = ( - currentState == PluginHost::IStateControl::SUSPENDED ? - StateType::SUSPENDED : StateType::RESUMED); + switch (currentState) { + case PluginHost::IStateControl::SUSPENDED: + response = StateType::SUSPENDED; + break; + case PluginHost::IStateControl::RESUMED: + response = StateType::RESUMED; + break; + default: + break; + }; stateControl->Release(); } - return Core::ERROR_NONE; + return response.IsSet() ? Core::ERROR_NONE : Core::ERROR_ILLEGAL_STATE; } // Property: state - Running state of the service @@ -158,14 +169,27 @@ PluginHost::IStateControl *stateControl( _cobalt->QueryInterface<PluginHost::IStateControl>()); if (stateControl != nullptr) { - stateControl->Request( - param == StateType::SUSPENDED ? - PluginHost::IStateControl::SUSPEND : - PluginHost::IStateControl::RESUME); + Core::OptionalType<PluginHost::IStateControl::command> cmd; + + switch(param.Value()) { + case StateType::SUSPENDED: + cmd = PluginHost::IStateControl::SUSPEND; + break; + case StateType::RESUMED: + cmd = PluginHost::IStateControl::RESUME; + break; + default: + break; + } + + if (cmd.IsSet()) + result = stateControl->Request(cmd.Value()); stateControl->Release(); } - result = Core::ERROR_NONE; + else { + result = Core::ERROR_ILLEGAL_STATE; + } } return result; }