From: Sunghyun Kim Date: Wed, 22 Jul 2020 05:04:40 +0000 (+0900) Subject: Add restart logic when widget application is dead X-Git-Tag: submit/tizen/20200724.023239^0 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=2f673633d636f31259d0ebb2e2a68012ce3cb0ff;p=platform%2Fcore%2Fuifw%2Fwidget-viewer-dali.git Add restart logic when widget application is dead When widget application is dead, WidgetView need to restart widget. Change-Id: I6a4e909eb2d9ed77b013ecb323499863110b249a --- diff --git a/widget_viewer_dali/internal/widget_view/widget_view_impl.cpp b/widget_viewer_dali/internal/widget_view/widget_view_impl.cpp index 7fa02b7..9e40132 100644 --- a/widget_viewer_dali/internal/widget_view/widget_view_impl.cpp +++ b/widget_viewer_dali/internal/widget_view/widget_view_impl.cpp @@ -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"; diff --git a/widget_viewer_dali/internal/widget_view/widget_view_impl.h b/widget_viewer_dali/internal/widget_view/widget_view_impl.h index 0911ca0..bb5b310 100644 --- a/widget_viewer_dali/internal/widget_view/widget_view_impl.h +++ b/widget_viewer_dali/internal/widget_view/widget_view_impl.h @@ -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;