Reload Widget from WidgetViewManager 47/243947/2
authorSunghyun Kim <scholb.kim@samsung.com>
Fri, 11 Sep 2020 10:24:52 +0000 (19:24 +0900)
committersunghyun kim <scholb.kim@samsung.com>
Mon, 14 Sep 2020 06:53:21 +0000 (06:53 +0000)
If Widget is deaded, we need to call ReloadWidget from maanger.

Change-Id: I14d1ac0e47556f828579107716a81639af46ce66

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

index b18acdc2c618d0337b3467ce1a50a0f72a85dba2..c3d5a0cc27d475ca859ccfa83e0ebc38412f20ff 100644 (file)
@@ -260,16 +260,6 @@ static void OnSurfaceRemoved( const char *appid, const char *instance_id, const
   }
 }
 
-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 )
@@ -1090,8 +1080,6 @@ 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::OnSceneConnection( int depth )
index fcc761765959f0ad20145cb0e89cf601e99f7fca..01407410a47802e6878a12014b4757adc672e7ee 100644 (file)
@@ -201,8 +201,12 @@ Dali::WidgetView::WidgetView WidgetViewManager::AddWidget( const std::string& wi
 
     // Add to map
     mWidgetViewContainer.insert( std::pair<std::string, Dali::WidgetView::WidgetView>( instanceId, widgetView ) );
+    mInstanceIdContainer.push_back( InstanceIdPair( widgetId, instanceId ) );
   }
 
+  // Add lifecycle callback for reload
+  widget_service_set_lifecycle_event_cb( widgetId.c_str(), WidgetLifeCycleCallback, this );
+
   DALI_LOG_INFO( gWidgetViewManagerLogging, Debug::Verbose, "WidgetViewManager::AddWidget: success [%s]\n", widgetId.c_str() );
 
   return widgetView;
@@ -220,6 +224,17 @@ void WidgetViewManager::OnTerminatedWidget( Dali::WidgetView::WidgetView widgetV
     {
       mWidgetViewContainer.erase( iter );
     }
+
+    // Delete WidgetInstance
+    auto widgetInstance = std::find_if( mInstanceIdContainer.begin(),
+                                        mInstanceIdContainer.end(),
+                                        [instanceId]( InstanceIdPair pair )
+                                        { return (pair.second == instanceId); } );
+
+    if(widgetInstance != mInstanceIdContainer.end())
+    {
+      mInstanceIdContainer.erase(widgetInstance);
+    }
   }
 
   DALI_LOG_INFO( gWidgetViewManagerLogging, Debug::Verbose, "WidgetViewManager::OnTerminatedWidget: Widget is deleted!\n" );
@@ -247,6 +262,26 @@ int WidgetViewManager::WidgetEventCallback( const char* widgetId, const char* in
   return 0;
 }
 
+int WidgetViewManager::WidgetLifeCycleCallback(const char *appid, widget_lifecycle_event event, const char *instance_id, void *data)
+{
+  WidgetViewManager* widgetViewManager = static_cast< WidgetViewManager* >( data );
+
+  if( event == WIDGET_LIFE_CYCLE_EVENT_APP_DEAD )
+  {
+    for( auto&& instanceIter : widgetViewManager->mInstanceIdContainer )
+    {
+      if( ((instanceIter).first).compare(appid) == 0)
+      {
+        DALI_LOG_INFO( gWidgetViewManagerLogging, Debug::Verbose, "WidgetViewManager::WidgetLifeCycleCallback: Call ReloadWidget [%s, %s]\n",appid, instanceIter.second);
+        WidgetViewIter iter = widgetViewManager->mWidgetViewContainer.find( std::string((instanceIter).second ) );
+        Dali::WidgetView::WidgetView widgetView = iter->second;
+        Dali::WidgetView::GetImplementation( widgetView ).ReloadWidget();
+      }
+    }
+  }
+  return 0;
+}
+
 } // namespace Internal
 
 } // namespace WidgetView
index 94a32118e1ad51bb79b8a81fa75e0b3b991b6f0f..aa7b8179f1ea6ca3cbc7df066c8e78af6af383d4 100644 (file)
@@ -25,6 +25,8 @@
 // EXTERNAL INCLUDES
 #include <dali/public-api/object/base-object.h>
 #include <map>
+#include <vector>
+#include <widget_service.h>
 
 namespace Dali
 {
@@ -69,8 +71,16 @@ private:
    */
   int Initialize( Application application, const std::string& name );
 
+  /**
+   * Callback for event
+   */
   static int WidgetEventCallback( const char* widgetId, const char* instanceId, int event, void* data );
 
+  /**
+   * Callback for life-cycle
+   */
+  static int WidgetLifeCycleCallback( const char *widgetId, widget_lifecycle_event event, const char *instance_id, void *data);
+
   /**
    * The widgetView is removed from WidgetViewContainer
    */
@@ -89,7 +99,11 @@ private:
   typedef std::map<std::string, Dali::WidgetView::WidgetView> WidgetViewContainer;
   typedef WidgetViewContainer::iterator WidgetViewIter;
 
+  typedef std::pair< std::string, std::string >  InstanceIdPair;
+  typedef std::vector< InstanceIdPair >          InstanceIdContainer;
+
   WidgetViewContainer mWidgetViewContainer;
+  InstanceIdContainer mInstanceIdContainer;
 };
 
 } // namespace Internal