4f9ef782a4bce424bd9591a9d9971e3b826274e1
[platform/core/uifw/widget-viewer-dali.git] / internal / widget_view_manager / widget_view_manager_impl.cpp
1 /*
2  * Copyright (c) 2016 Samsung Electronics Co., Ltd.
3  *
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
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
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.
15  *
16  */
17
18 // CLASS HEADER
19 #include <internal/widget_view_manager/widget_view_manager_impl.h>
20
21 // INTERNAL INCLUDES
22 #include <internal/widget_view/widget_view_impl.h>
23
24 // EXTERNAL INCLUDES
25 #include <dali/integration-api/debug.h>
26 #include <system_info.h>
27 #include <widget_errno.h>
28 #include <widget_instance.h>
29
30 namespace Dali
31 {
32
33 namespace WidgetView
34 {
35
36 namespace Internal
37 {
38
39 namespace
40 {
41
42 #if defined(DEBUG_ENABLED)
43 Integration::Log::Filter* gWidgetViewManagerLogging  = Integration::Log::Filter::New( Debug::Verbose, false, "LOG_WIDGET_VIEW_MANAGER" );
44 #endif
45
46 static inline bool IsWidgetFeatureEnabled()
47 {
48   static bool feature = false;
49   static bool retrieved = false;
50   int ret;
51
52   if( retrieved == true )
53     return feature;
54
55   ret = system_info_get_platform_bool( "http://tizen.org/feature/shell.appwidget", &feature );
56   if( ret != SYSTEM_INFO_ERROR_NONE )
57   {
58     return false;
59   }
60
61   retrieved = true;
62
63   return feature;
64 }
65
66 } // unnamed namespace
67
68 WidgetViewManagerPtr WidgetViewManager::New( Application application, const std::string& name )
69 {
70   WidgetViewManagerPtr impl = new WidgetViewManager();
71
72   // Second-phase init of the implementation
73   if( impl->Initialize( application, name ) != WIDGET_ERROR_NONE )
74   {
75     DALI_LOG_INFO( gWidgetViewManagerLogging, Debug::Verbose, "WidgetViewManager::New: Fail to create WidgetViewManager.\n" );
76     return NULL;
77   }
78
79   return impl;
80 }
81
82 WidgetViewManager::WidgetViewManager()
83 {
84 }
85
86 WidgetViewManager::~WidgetViewManager()
87 {
88   widget_instance_unlisten_event( WidgetViewManager::WidgetEventCallback );
89   widget_instance_fini();
90 }
91
92 int WidgetViewManager::Initialize( Application application, const std::string& name )
93 {
94   if( !IsWidgetFeatureEnabled() )
95   {
96     DALI_LOG_INFO( gWidgetViewManagerLogging, Debug::Verbose, "WidgetViewManager::Initialize: Widget feature is not enabled.\n" );
97     return WIDGET_ERROR_NOT_SUPPORTED;
98   }
99
100   // create compositor
101   mCompositor = Pepper::Compositor::New( application, name );
102
103   mCompositor.ObjectViewAddedSignal().Connect( this, &WidgetViewManager::OnObjectViewAdded );
104   mCompositor.ObjectViewDeletedSignal().Connect( this, &WidgetViewManager::OnObjectViewDeleted );
105
106   // init widget service
107   widget_instance_init( name.c_str() );
108   widget_instance_listen_event( WidgetViewManager::WidgetEventCallback, this );
109
110   DALI_LOG_INFO( gWidgetViewManagerLogging, Debug::Verbose, "WidgetViewManager::Initialize: success.\n" );
111
112   setenv("WAYLAND_DISPLAY", mCompositor.GetName().c_str(), 1);
113
114   return WIDGET_ERROR_NONE;
115 }
116
117 Dali::WidgetView::WidgetView WidgetViewManager::AddWidget( const std::string& widgetId, const std::string& contentInfo, int width, int height, double updatePeriod )
118 {
119   // Add a new widget view
120   Dali::WidgetView::WidgetView widgetView = Dali::WidgetView::WidgetView::New( widgetId, contentInfo, width, height, updatePeriod );
121
122   std::string instanceId = widgetView.GetInstanceId();
123
124   if( !instanceId.empty() )
125   {
126     // Add to map
127     mWidgetViewContainer.insert( std::pair<std::string, Dali::WidgetView::WidgetView>( instanceId, widgetView ) );
128   }
129
130   DALI_LOG_INFO( gWidgetViewManagerLogging, Debug::Verbose, "WidgetViewManager::AddWidget: success [%s]\n", widgetId.c_str() );
131
132   return widgetView;
133 }
134
135 void WidgetViewManager::OnObjectViewAdded( Pepper::Compositor compositor, Pepper::ObjectView objectView )
136 {
137   std::string appId = objectView.GetAppId();  // widget instance id
138
139   if( mWidgetViewContainer.size() > 0)
140   {
141     WidgetViewIter iter = mWidgetViewContainer.find( appId );
142     if( iter != mWidgetViewContainer.end() )
143     {
144       Dali::WidgetView::WidgetView widgetView = iter->second;
145
146       Dali::WidgetView::GetImplementation( widgetView ).AddObjectView( objectView );
147     }
148   }
149
150   DALI_LOG_INFO( gWidgetViewManagerLogging, Debug::Verbose, "WidgetViewManager::OnObjectViewAdded: ObjectView is added!\n" );
151 }
152
153 void WidgetViewManager::OnObjectViewDeleted( Pepper::Compositor compositor, Pepper::ObjectView objectView )
154 {
155   std::string appId = objectView.GetAppId();  // widget instance id
156
157   // Remove from map
158   if( mWidgetViewContainer.size() > 0)
159   {
160     WidgetViewIter iter = mWidgetViewContainer.find( appId );
161     if( iter != mWidgetViewContainer.end() )
162     {
163       Dali::WidgetView::WidgetView widgetView = iter->second;
164
165       Dali::WidgetView::GetImplementation( widgetView ).RemoveObjectView();
166
167       mWidgetViewContainer.erase( iter );
168     }
169   }
170
171   DALI_LOG_INFO( gWidgetViewManagerLogging, Debug::Verbose, "WidgetViewManager::OnObjectViewDeleted: ObjectView is deleted!\n" );
172 }
173
174 int WidgetViewManager::WidgetEventCallback( const char* widgetId, const char* instanceId, int event, void* data )
175 {
176   WidgetViewManager* widgetViewManager = static_cast< WidgetViewManager* >( data );
177
178   if( widgetViewManager->mWidgetViewContainer.size() > 0)
179   {
180     WidgetViewIter iter = widgetViewManager->mWidgetViewContainer.find( std::string( instanceId ) );
181     if( iter != widgetViewManager->mWidgetViewContainer.end() )
182     {
183       Dali::WidgetView::WidgetView widgetView = iter->second;
184
185       Dali::WidgetView::GetImplementation( widgetView ).SendWidgetEvent( event );
186
187       return 0;
188     }
189   }
190
191   DALI_LOG_INFO( gWidgetViewManagerLogging, Debug::Verbose, "WidgetViewManager::WidgetEventCallback: WidgetView is not found! [%s, %s]\n", widgetId, instanceId );
192
193   return 0;
194 }
195
196 } // namespace Internal
197
198 } // namespace WidgetView
199
200 } // namespace Dali