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