Add restart logic when widget application is dead 37/239137/2 accepted/tizen/unified/20200727.075559 submit/tizen/20200724.023239
authorSunghyun Kim <scholb.kim@samsung.com>
Wed, 22 Jul 2020 05:04:40 +0000 (14:04 +0900)
committersunghyun kim <scholb.kim@samsung.com>
Wed, 22 Jul 2020 05:18:45 +0000 (05:18 +0000)
When widget application is dead, WidgetView need to restart widget.

Change-Id: I6a4e909eb2d9ed77b013ecb323499863110b249a

widget_viewer_dali/internal/widget_view/widget_view_impl.cpp
widget_viewer_dali/internal/widget_view/widget_view_impl.h

index 7fa02b7c8cf392e1dabd9ac057618dd9cd481486..9e40132373c2a99ccdf61bd57358d99e4a27aedc 100644 (file)
@@ -256,10 +256,20 @@ static void OnSurfaceRemoved( const char *appid, const char *instance_id, const
   if( widgetView && !widgetView->IsWidgetFaulted() )
   {
     widgetView->CloseRemoteSurface();
-    widgetView->RemoveWidgetRenderer();
+    widgetView->SetReloadFlag( true );
   }
 }
 
+static int WidgetLifeCycleCallback(const char *appid, widget_lifecycle_event event, const char *instance_id, void *data)
+{
+  Dali::WidgetView::Internal::WidgetView* widgetView = static_cast< Dali::WidgetView::Internal::WidgetView* >( data );
+  if( event == WIDGET_LIFE_CYCLE_EVENT_APP_DEAD )
+  {
+     widgetView->ReloadWidget();
+  }
+  return 0;
+}
+
 } // unnamed namespace
 
 Dali::WidgetView::WidgetView WidgetView::New( const std::string& widgetId, const std::string& contentInfo, int width, int height, float updatePeriod )
@@ -296,7 +306,8 @@ WidgetView::WidgetView()
   mPermanentDelete( false ),
   mWatcherHandle( NULL ),
   mRemoteSurface( NULL ),
-  mBuffer( NULL )
+  mBuffer( NULL ),
+  mReloadFlag( false )
 {
 }
 
@@ -319,7 +330,8 @@ WidgetView::WidgetView( const std::string& widgetId, const std::string& contentI
   mPermanentDelete( false ),
   mWatcherHandle( NULL ),
   mRemoteSurface( NULL ),
-  mBuffer( NULL )
+  mBuffer( NULL ),
+  mReloadFlag( false )
 {
 }
 
@@ -508,7 +520,6 @@ void WidgetView::ActivateFaultedWidget()
     ops.removed_cb = OnSurfaceRemoved;
     ops.added_cb = OnBufferAdded;
     mWatcherHandle = screen_connector_toolkit_add(&ops, (char *)mInstanceId.c_str(), SCREEN_CONNECTOR_SCREEN_TYPE_WIDGET, this);
-
     DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::ActivateFaultedWidget: widget_instance_launch is called. [%s, mPid = %d]\n", mWidgetId.c_str(), mPid );
   }
 }
@@ -628,8 +639,11 @@ void WidgetView::SendWidgetEvent( int event )
     case WIDGET_INSTANCE_EVENT_FAULT:
     {
       mWidgetFaultedSignal.Emit( handle );
-      CloseRemoteSurface();
-      RemoveWidgetRenderer();
+      if( mReloadFlag == false )
+      {
+        CloseRemoteSurface();
+        RemoveWidgetRenderer();
+      }
       break;
     }
     case WIDGET_INSTANCE_EVENT_CREATE_ABORTED:
@@ -1027,7 +1041,7 @@ void WidgetView::OnInitialize()
   ops.added_cb = OnBufferAdded;
   mWatcherHandle = screen_connector_toolkit_add(&ops, (char *)instanceId, SCREEN_CONNECTOR_SCREEN_TYPE_WIDGET, this);
   DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::OnInitialize: widget_instance_launch is called. [%s, mPid = %d]\n", mWidgetId.c_str(), mPid );
-
+  widget_service_set_lifecycle_event_cb( mWidgetId.c_str(), WidgetLifeCycleCallback, this );
 }
 
 void WidgetView::OnStageConnection( int depth )
@@ -1223,6 +1237,11 @@ void WidgetView::CloseRemoteSurface()
   }
 }
 
+void WidgetView::SetReloadFlag( bool reload)
+{
+  mReloadFlag = reload;
+}
+
 void WidgetView::ShowLoadingState( bool show )
 {
   if( mPreviewImage && mPreviewVisible )
@@ -1564,6 +1583,35 @@ void WidgetView::UpdateBuffer( struct tizen_remote_surface *surface, struct wl_b
   mBuffer = buffer;
 }
 
+void WidgetView::ReloadWidget()
+{
+  // Only try to reload widget when flag is set
+  if( !mReloadFlag )
+  {
+    return;
+  }
+
+  std::string text;
+  text = GetContentInfo();
+  if( text == mContentInfo )
+  {
+    screen_connector_toolkit_ops ops;
+    ops.updated_cb = OnBufferUpdated;
+    ops.removed_cb = OnSurfaceRemoved;
+    ops.added_cb = OnBufferAdded;
+    mWatcherHandle = screen_connector_toolkit_add(&ops, (char *)mInstanceId.c_str(), SCREEN_CONNECTOR_SCREEN_TYPE_WIDGET, this);
+
+    // launch widget again
+    mPid = widget_instance_launch( mInstanceId.c_str(), (char *)mContentInfo.c_str(), mWidth, mHeight );
+    if( mPid < 0)
+    {
+      DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::ActivateFaultedWidget: widget_instance_launch is failed. [%s]\n", mWidgetId.c_str() );
+      ActivateFaultedWidget();
+    }
+    SetReloadFlag( false );
+  }
+}
+
 Dali::Shader WidgetView::CreateShader()
 {
   std::string fragmentShader = "#extension GL_OES_EGL_image_external:require\n";
index 0911ca0218e843106405b76f38176642b05ffb66..bb5b31007defc94a87ec8908843ff773da3a72d4 100644 (file)
@@ -148,6 +148,8 @@ public: // Internal API
 
   void CloseRemoteSurface();
 
+  void SetReloadFlag( bool reload );
+
   void SetLoadingTextPropertyMap( Dali::Property::Map map );
 
   void SetRetryTextPropertyMap( Dali::Property::Map map );
@@ -170,6 +172,8 @@ public: // Internal API
 
   void UpdateBuffer( struct tizen_remote_surface *surface, struct wl_buffer *buffer, int32_t fd);
 
+  void ReloadWidget();
+
 public: //Signals
 
   /**
@@ -323,6 +327,7 @@ private:
   screen_connector_toolkit_h mWatcherHandle;
   tizen_remote_surface* mRemoteSurface;
   wl_buffer* mBuffer;
+  bool mReloadFlag;
 
   Dali::Property::Map mEffectPropertyMap;