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 )
mPermanentDelete( false ),
mWatcherHandle( NULL ),
mRemoteSurface( NULL ),
- mBuffer( NULL )
+ mBuffer( NULL ),
+ mReloadFlag( false )
{
}
mPermanentDelete( false ),
mWatcherHandle( NULL ),
mRemoteSurface( NULL ),
- mBuffer( NULL )
+ mBuffer( NULL ),
+ mReloadFlag( false )
{
}
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 );
}
}
case WIDGET_INSTANCE_EVENT_FAULT:
{
mWidgetFaultedSignal.Emit( handle );
- CloseRemoteSurface();
- RemoveWidgetRenderer();
+ if( mReloadFlag == false )
+ {
+ CloseRemoteSurface();
+ RemoveWidgetRenderer();
+ }
break;
}
case WIDGET_INSTANCE_EVENT_CREATE_ABORTED:
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 )
}
}
+void WidgetView::SetReloadFlag( bool reload)
+{
+ mReloadFlag = reload;
+}
+
void WidgetView::ShowLoadingState( bool show )
{
if( mPreviewImage && mPreviewVisible )
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";