RDKTV-15735: rework closure policy to avoid overriding 'stop' request handler Change-Id: I396ec2fbc1459e40e5b25004d4619afc79a53ef1 Signed-off-by: Eugene Mutavchi <Ievgen_Mutavchi@comcast.com>
diff --git a/plugin/CobaltImplementation.cpp b/plugin/CobaltImplementation.cpp index 40f7a6d..5bb63b2 100644 --- a/plugin/CobaltImplementation.cpp +++ b/plugin/CobaltImplementation.cpp
@@ -36,10 +36,8 @@ int SbRdkGetSetting(const char* key, char** out_json); typedef int (*SbRdkCallbackFunc)(void *user_data); -void SbRdkSetStopRequestHandler(SbRdkCallbackFunc cb, void* user_data); -void SbRdkRequestStop(); void SbRdkSetConcealRequestHandler(SbRdkCallbackFunc cb, void* user_data); -void SbRdkRequestConceal(); +void SbRdkSetCobaltExitStrategy(const char* strategy); } // extern "C" @@ -316,19 +314,17 @@ SYSLOG(Logging::Notification, (_T("Preload is set to: %s\n"), _preloadEnabled ? "true" : "false")); if (config.ClosurePolicy.IsSet() == true) { - _parent._shouldSuspendOnClose = config.ClosurePolicy.Value().compare("suspend") == 0; +#if defined(PLUGIN_COBALT_ENABLE_CLOSUREPOLICY) && PLUGIN_COBALT_ENABLE_CLOSUREPOLICY + SbRdkSetCobaltExitStrategy(config.ClosurePolicy.Value().data()); +#else + SYSLOG(Logging::Notification, (_T("Ignore 'closurepolicy' configuration, support is disabled\n"))); +#endif } - SbRdkSetStopRequestHandler([](void* data)-> int { - CobaltWindow* window = reinterpret_cast<CobaltWindow*>(data); - window->_parent.OnWindowCloseRequest(); - return 0; - }, this); - SbRdkSetConcealRequestHandler([](void* data)-> int { CobaltWindow* window = reinterpret_cast<CobaltWindow*>(data); window->_parent.OnConcealRequest(); - return 1; // proceed with default + return 0; }, this); Run(); @@ -423,8 +419,7 @@ _cobaltClients(), _stateControlClients(), _sink(*this), - _delayedSuspend(*this), - _shouldSuspendOnClose(false) { + _delayedSuspend(*this) { } virtual ~CobaltImplementation() { @@ -574,7 +569,6 @@ if (_state != PluginHost::IStateControl::RESUMED) { StateChange(PluginHost::IStateControl::RESUMED); - NotifyVisibilityChange(false); } _adminLock.Unlock(); @@ -584,7 +578,6 @@ _adminLock.Lock(); if (_state != PluginHost::IStateControl::SUSPENDED) { - NotifyVisibilityChange(true); StateChange(PluginHost::IStateControl::SUSPENDED); } @@ -652,22 +645,11 @@ } void OnConcealRequest() { - NotifyVisibilityChange(true); - // Device lifecycle tests from YTS expect 'suspend' behavior on 'conceal', - // so we reuse 'closure' notification and let app manager to trigger 'suspended' state. - // Ideally we would just emit 'visibilitychange'. + // Device lifecycle tests from YTS expect 'suspend' behavior on 'conceal' + Request(PluginHost::IStateControl::SUSPEND); NotifyClosure(); } - void OnWindowCloseRequest() { - if (_shouldSuspendOnClose) { - Request(PluginHost::IStateControl::SUSPEND); - NotifyClosure(); - } else { - SbRdkQuit(); - } - } - BEGIN_INTERFACE_MAP (CobaltImplementation) INTERFACE_ENTRY (Exchange::IBrowser) INTERFACE_ENTRY (PluginHost::IStateControl) @@ -753,17 +735,6 @@ _adminLock.Unlock(); } - void NotifyVisibilityChange(bool hidden) - { - _adminLock.Lock(); - std::list<Exchange::IBrowser::INotification*>::iterator index(_cobaltClients.begin()); - while (index != _cobaltClients.end()) { - (*index)->Hidden(hidden); - index++; - } - _adminLock.Unlock(); - } - private: CobaltWindow _window; mutable Core::CriticalSection _adminLock; @@ -773,7 +744,6 @@ std::list<PluginHost::IStateControl::INotification*> _stateControlClients; NotificationSink _sink; DelayedSuspend _delayedSuspend; - bool _shouldSuspendOnClose; }; SERVICE_REGISTRATION(CobaltImplementation, 1, 0);
diff --git a/src/third_party/starboard/rdk/shared/configuration.cc b/src/third_party/starboard/rdk/shared/configuration.cc index aedeb45..46edac4 100644 --- a/src/third_party/starboard/rdk/shared/configuration.cc +++ b/src/third_party/starboard/rdk/shared/configuration.cc
@@ -33,6 +33,8 @@ #include "cobalt/extension/configuration.h" #include "starboard/common/configuration_defaults.h" +#include "third_party/starboard/rdk/shared/libcobalt.h" + namespace third_party { namespace starboard { namespace rdk { @@ -44,10 +46,14 @@ return false; } +const char* CobaltUserOnExitStrategy() { + return SbRdkGetCobaltExitStrategy(); +} + const CobaltExtensionConfigurationApi kConfigurationApi = { kCobaltExtensionConfigurationName, 2, - &::starboard::common::CobaltUserOnExitStrategyDefault, + &CobaltUserOnExitStrategy, &::starboard::common::CobaltRenderDirtyRegionOnlyDefault, &::starboard::common::CobaltEglSwapIntervalDefault, &::starboard::common::CobaltFallbackSplashScreenUrlDefault,
diff --git a/src/third_party/starboard/rdk/shared/libcobalt.cc b/src/third_party/starboard/rdk/shared/libcobalt.cc index d5fea8d..633a3a3 100644 --- a/src/third_party/starboard/rdk/shared/libcobalt.cc +++ b/src/third_party/starboard/rdk/shared/libcobalt.cc
@@ -17,6 +17,8 @@ #include "third_party/starboard/rdk/shared/libcobalt.h" +#include <cstring> + #include "starboard/common/condition_variable.h" #include "starboard/common/mutex.h" #include "starboard/common/semaphore.h" @@ -174,6 +176,27 @@ } } + void SetCobaltExitStrategy(const char* strategy) + { + if (running_) { + SB_LOG(WARNING) << "Ignore exit strategy change, app is already running."; + return; + } + + // Supported values(src/cobalt/extension/configuration.h): stop, suspend, noexit. + if (strncmp(strategy, "suspend", 7) == 0) + exit_strategy_ = "suspend"; + else if (strncmp(strategy, "noexit", 6) == 0) + exit_strategy_ = "noexit"; + else + exit_strategy_ = "stop"; + } + + const char* GetCobaltExitStrategy() + { + return exit_strategy_.c_str(); + } + private: void WaitForApp(starboard::ScopedLock &) { @@ -188,6 +211,7 @@ void* stop_request_cb_data_ { nullptr }; SbRdkCallbackFunc conceal_request_cb_ { nullptr }; void* conceal_request_cb_data_ { nullptr }; + std::string exit_strategy_ { "stop" }; }; SB_ONCE_INITIALIZE_FUNCTION(APIContext, GetContext); @@ -295,4 +319,12 @@ GetContext()->RequestConceal(); } +void SbRdkSetCobaltExitStrategy(const char* strategy) { + GetContext()->SetCobaltExitStrategy(strategy); +} + +const char* SbRdkGetCobaltExitStrategy() { + return GetContext()->GetCobaltExitStrategy(); +} + } // extern "C"
diff --git a/src/third_party/starboard/rdk/shared/libcobalt.h b/src/third_party/starboard/rdk/shared/libcobalt.h index 995bd80..e66b89f 100644 --- a/src/third_party/starboard/rdk/shared/libcobalt.h +++ b/src/third_party/starboard/rdk/shared/libcobalt.h
@@ -33,11 +33,14 @@ SB_EXPORT_PLATFORM int SbRdkGetSetting(const char* key, char** out_json); // caller is responsible to free typedef int (*SbRdkCallbackFunc)(void *user_data); -SB_EXPORT_PLATFORM void SbRdkSetStopRequestHandler(SbRdkCallbackFunc cb, void* user_data); -SB_EXPORT_PLATFORM void SbRdkRequestStop(); +SB_DEPRECATED(SB_EXPORT_PLATFORM void SbRdkSetStopRequestHandler(SbRdkCallbackFunc cb, void* user_data)); +SB_DEPRECATED(SB_EXPORT_PLATFORM void SbRdkRequestStop()); SB_EXPORT_PLATFORM void SbRdkSetConcealRequestHandler(SbRdkCallbackFunc cb, void* user_data); SB_EXPORT_PLATFORM void SbRdkRequestConceal(); +SB_EXPORT_PLATFORM void SbRdkSetCobaltExitStrategy(const char* strategy); +SB_EXPORT_PLATFORM const char* SbRdkGetCobaltExitStrategy(); + #ifdef __cplusplus } // extern "C" #endif
diff --git a/src/third_party/starboard/rdk/shared/main_rdk.cc b/src/third_party/starboard/rdk/shared/main_rdk.cc index 5efdd86..f491e80 100644 --- a/src/third_party/starboard/rdk/shared/main_rdk.cc +++ b/src/third_party/starboard/rdk/shared/main_rdk.cc
@@ -77,13 +77,16 @@ gst_init_check(NULL, NULL, &error); g_free(error); -// starboard::shared::signal::InstallCrashSignalHandlers(); starboard::shared::signal::InstallSuspendSignalHandlers(); third_party::starboard::rdk::shared::InstallStopSignalHandlers(); - third_party::starboard::rdk::shared::Application application; - int result = application.Run(argc, argv); + + int result = 0; + { + third_party::starboard::rdk::shared::Application application; + result = application.Run(argc, argv); + } + third_party::starboard::rdk::shared::UninstallStopSignalHandlers(); -// starboard::shared::signal::UninstallCrashSignalHandlers(); starboard::shared::signal::UninstallSuspendSignalHandlers(); gst_deinit();
diff --git a/src/third_party/starboard/rdk/shared/sources.gypi b/src/third_party/starboard/rdk/shared/sources.gypi index aba2f72..2b4f543 100644 --- a/src/third_party/starboard/rdk/shared/sources.gypi +++ b/src/third_party/starboard/rdk/shared/sources.gypi
@@ -310,9 +310,9 @@ '<(DEPTH)/starboard/shared/starboard/system_get_random_uint64.cc', '<(DEPTH)/starboard/shared/starboard/system_request_pause.cc', - '<(DEPTH)/starboard/shared/starboard/system_request_suspend.cc', '<(DEPTH)/starboard/shared/starboard/system_request_unpause.cc', '<(DEPTH)/starboard/shared/starboard/system_supports_resume.cc', + '<(DEPTH)/starboard/shared/starboard/system_request_stop.cc', # STUB '<(DEPTH)/starboard/shared/stub/system_get_total_gpu_memory.cc', @@ -333,7 +333,7 @@ '<(DEPTH)/third_party/starboard/rdk/shared/system/system_has_capability.cc', '<(DEPTH)/third_party/starboard/rdk/shared/system/system_get_extensions.cc', '<(DEPTH)/third_party/starboard/rdk/shared/system/system_sign_with_certification_secret_key.cc', - '<(DEPTH)/third_party/starboard/rdk/shared/system/system_request_stop.cc', + '<(DEPTH)/third_party/starboard/rdk/shared/system/system_request_suspend.cc', ], 'time_sources': [
diff --git a/src/third_party/starboard/rdk/shared/system/system_request_stop.cc b/src/third_party/starboard/rdk/shared/system/system_request_suspend.cc similarity index 84% rename from src/third_party/starboard/rdk/shared/system/system_request_stop.cc rename to src/third_party/starboard/rdk/shared/system/system_request_suspend.cc index feb01d4..bd28584 100644 --- a/src/third_party/starboard/rdk/shared/system/system_request_stop.cc +++ b/src/third_party/starboard/rdk/shared/system/system_request_suspend.cc
@@ -14,7 +14,7 @@ // // SPDX-License-Identifier: Apache-2.0 // -// Copyright 2015 The Cobalt Authors. All Rights Reserved. +// Copyright 2017 The Cobalt Authors. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -32,6 +32,9 @@ #include "third_party/starboard/rdk/shared/libcobalt.h" -void SbSystemRequestStop(int error_level) { - SbRdkRequestStop(); +#if SB_API_VERSION < 13 +void SbSystemRequestSuspend() { + // Route through conceal request. cobalt-plugin will call Suspend. + SbRdkRequestConceal(); } +#endif // SB_API_VERSION < 13