2 * Copyright (c) 2016 Samsung Electronics Co., Ltd.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
19 #include <internal/widget_view_manager/widget_view_manager_impl.h>
22 #include <internal/widget_view/widget_view_impl.h>
25 #include <dali/integration-api/debug.h>
26 #include <system_info.h>
27 #include <widget_errno.h>
28 #include <widget_instance.h>
42 #if defined(DEBUG_ENABLED)
43 Integration::Log::Filter* gWidgetViewManagerLogging = Integration::Log::Filter::New( Debug::Verbose, false, "LOG_WIDGET_VIEW_MANAGER" );
46 static inline bool IsWidgetFeatureEnabled()
48 static bool feature = false;
49 static bool retrieved = false;
52 if( retrieved == true )
55 ret = system_info_get_platform_bool( "http://tizen.org/feature/shell.appwidget", &feature );
56 if( ret != SYSTEM_INFO_ERROR_NONE )
66 } // unnamed namespace
68 WidgetViewManagerPtr WidgetViewManager::New( Application application, const std::string& name )
70 WidgetViewManagerPtr impl = new WidgetViewManager();
72 // Second-phase init of the implementation
73 if( impl->Initialize( application, name ) != WIDGET_ERROR_NONE )
75 DALI_LOG_INFO( gWidgetViewManagerLogging, Debug::Verbose, "WidgetViewManager::New: Fail to create WidgetViewManager.\n" );
82 WidgetViewManager::WidgetViewManager()
86 WidgetViewManager::~WidgetViewManager()
88 widget_instance_unlisten_event( WidgetViewManager::WidgetEventCallback );
89 widget_instance_fini();
92 int WidgetViewManager::Initialize( Application application, const std::string& name )
94 if( !IsWidgetFeatureEnabled() )
96 DALI_LOG_INFO( gWidgetViewManagerLogging, Debug::Verbose, "WidgetViewManager::Initialize: Widget feature is not enabled.\n" );
97 return WIDGET_ERROR_NOT_SUPPORTED;
101 mCompositor = Pepper::Compositor::New( application, name );
103 mCompositor.ObjectViewAddedSignal().Connect( this, &WidgetViewManager::OnObjectViewAdded );
104 mCompositor.ObjectViewDeletedSignal().Connect( this, &WidgetViewManager::OnObjectViewDeleted );
106 // init widget service
107 widget_instance_init( name.c_str() );
108 widget_instance_listen_event( WidgetViewManager::WidgetEventCallback, this );
110 DALI_LOG_INFO( gWidgetViewManagerLogging, Debug::Verbose, "WidgetViewManager::Initialize: success.\n" );
112 setenv("WAYLAND_DISPLAY", mCompositor.GetName().c_str(), 1);
114 return WIDGET_ERROR_NONE;
117 Dali::WidgetView::WidgetView WidgetViewManager::AddWidget( const std::string& widgetId, const std::string& contentInfo, int width, int height, double updatePeriod )
119 // Add a new widget view
120 Dali::WidgetView::WidgetView widgetView = Dali::WidgetView::WidgetView::New( widgetId, contentInfo, width, height, updatePeriod );
122 std::string instanceId = widgetView.GetInstanceId();
124 if( !instanceId.empty() )
127 mWidgetViewContainer.insert( std::pair<std::string, Dali::WidgetView::WidgetView>( instanceId, widgetView ) );
130 DALI_LOG_INFO( gWidgetViewManagerLogging, Debug::Verbose, "WidgetViewManager::AddWidget: success [%s]\n", widgetId.c_str() );
135 void WidgetViewManager::OnObjectViewAdded( Pepper::Compositor compositor, Pepper::ObjectView objectView )
137 std::string appId = objectView.GetAppId(); // widget instance id
139 if( mWidgetViewContainer.size() > 0)
141 WidgetViewIter iter = mWidgetViewContainer.find( appId );
142 if( iter != mWidgetViewContainer.end() )
144 Dali::WidgetView::WidgetView widgetView = iter->second;
146 Dali::WidgetView::GetImplementation( widgetView ).AddObjectView( objectView );
150 DALI_LOG_INFO( gWidgetViewManagerLogging, Debug::Verbose, "WidgetViewManager::OnObjectViewAdded: ObjectView is added!\n" );
153 void WidgetViewManager::OnObjectViewDeleted( Pepper::Compositor compositor, Pepper::ObjectView objectView )
155 std::string appId = objectView.GetAppId(); // widget instance id
158 if( mWidgetViewContainer.size() > 0)
160 WidgetViewIter iter = mWidgetViewContainer.find( appId );
161 if( iter != mWidgetViewContainer.end() )
163 Dali::WidgetView::WidgetView widgetView = iter->second;
165 Dali::WidgetView::GetImplementation( widgetView ).RemoveObjectView();
167 mWidgetViewContainer.erase( iter );
171 DALI_LOG_INFO( gWidgetViewManagerLogging, Debug::Verbose, "WidgetViewManager::OnObjectViewDeleted: ObjectView is deleted!\n" );
174 int WidgetViewManager::WidgetEventCallback( const char* widgetId, const char* instanceId, int event, void* data )
176 WidgetViewManager* widgetViewManager = static_cast< WidgetViewManager* >( data );
178 if( widgetViewManager->mWidgetViewContainer.size() > 0)
180 WidgetViewIter iter = widgetViewManager->mWidgetViewContainer.find( std::string( instanceId ) );
181 if( iter != widgetViewManager->mWidgetViewContainer.end() )
183 Dali::WidgetView::WidgetView widgetView = iter->second;
185 Dali::WidgetView::GetImplementation( widgetView ).SendWidgetEvent( event );
191 DALI_LOG_INFO( gWidgetViewManagerLogging, Debug::Verbose, "WidgetViewManager::WidgetEventCallback: WidgetView is not found! [%s, %s]\n", widgetId, instanceId );
196 } // namespace Internal
198 } // namespace WidgetView