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