apply widget_instance API changes
[platform/core/uifw/widget-viewer-dali.git] / internal / widget_view / widget_view_impl.cpp
1 /*
2  * Samsung API
3  * Copyright (c) 2016 Samsung Electronics Co., Ltd.
4  *
5  * Licensed under the Flora License, Version 1.1 (the License);
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  * http://floralicense.org/license/
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an AS IS BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  */
17
18 // CLASS HEADER
19 #include <internal/widget_view/widget_view_impl.h>
20
21 // INTERNAL INCLUDES
22
23 // EXTERNAL INCLUDES
24 #include <dali/integration-api/debug.h>
25 #include <string.h>
26 #include <widget_service.h>
27 #include <widget_instance.h>
28 #include <tzplatform_config.h>
29
30 namespace Dali
31 {
32
33 namespace WidgetView
34 {
35
36 namespace Internal
37 {
38
39 namespace
40 {
41
42 #define WIDGET_VIEW_RESOURCE_DEFAULT_IMG "/widget_viewer_dali/images/unknown.png"
43
44 #if defined(DEBUG_ENABLED)
45 Integration::Log::Filter* gWidgetViewLogging  = Integration::Log::Filter::New( Debug::Verbose, false, "LOG_WIDGET_VIEW" );
46 #endif
47
48 } // unnamed namespace
49
50 Dali::WidgetView::WidgetView WidgetView::New( const std::string& widgetId, const std::string& contentInfo, int width, int height, double updatePeriod )
51 {
52   // Create the implementation, temporarily owned on stack
53   IntrusivePtr< WidgetView > internalWidgetView = new WidgetView( widgetId, contentInfo, width, height, updatePeriod );
54
55   // Pass ownership to CustomActor
56   Dali::WidgetView::WidgetView widgetView( *internalWidgetView );
57
58   // Second-phase init of the implementation
59   // This can only be done after the CustomActor connection has been made...
60   internalWidgetView->Initialize();
61
62   return widgetView;
63 }
64
65 WidgetView::WidgetView()
66 : Control( ControlBehaviour( REQUIRES_TOUCH_EVENTS ) ),
67   mWidgetId(),
68   mInstanceId(),
69   mContentInfo(),
70   mTitle(),
71   mBundle( NULL ),
72   mWidth( 0 ),
73   mHeight( 0 ),
74   mPid( 0 ),
75   mUpdatePeriod( 0.0 ),
76   mPreviewEnabled( true ),
77   mStateTextEnabled( true ),
78   mPermanentDelete( true )
79 {
80 }
81
82 WidgetView::WidgetView( const std::string& widgetId, const std::string& contentInfo, int width, int height, double updatePeriod )
83 : Control( ControlBehaviour( REQUIRES_TOUCH_EVENTS ) ),
84   mWidgetId( widgetId ),
85   mInstanceId(),
86   mContentInfo( contentInfo ),
87   mTitle(),
88   mBundle( NULL ),
89   mWidth( width ),
90   mHeight( height ),
91   mPid( 0 ),
92   mUpdatePeriod( updatePeriod ),
93   mPreviewEnabled( true ),
94   mStateTextEnabled( true ),
95   mPermanentDelete( true )
96 {
97 }
98
99 WidgetView::~WidgetView()
100 {
101   if( !mWidgetId.empty() && !mInstanceId.empty() )
102   {
103     widget_instance_terminate( mInstanceId.c_str() );
104
105     if( mPermanentDelete )
106     {
107       widget_instance_destroy( mInstanceId.c_str() );
108     }
109   }
110
111   if( mBundle )
112   {
113     bundle_free( mBundle );
114   }
115 }
116
117 bool WidgetView::PauseWidget()
118 {
119   int ret = widget_instance_pause( mInstanceId.c_str() );
120   if( ret < 0 )
121   {
122     DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::PauseWidget: Fail to pause widget(%s, %s) [%d]\n", mWidgetId.c_str(), mInstanceId.c_str(), ret );
123     return false;
124   }
125
126   DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::PauseWidget: Widget is paused (%s, %s)\n", mWidgetId.c_str(), mInstanceId.c_str() );
127
128   return true;
129 }
130
131 bool WidgetView::ResumeWidget()
132 {
133   int ret = widget_instance_resume( mInstanceId.c_str() );
134   if( ret < 0 )
135   {
136     DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::ResumeWidget: Fail to resume widget(%s, %s) [%d]\n", mWidgetId.c_str(), mInstanceId.c_str(), ret );
137     return false;
138   }
139
140   DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::ResumeWidget: Widget is resumed (%s, %s)\n", mWidgetId.c_str(), mInstanceId.c_str() );
141
142   return true;
143 }
144
145 const std::string& WidgetView::GetWidgetId() const
146 {
147   return mWidgetId;
148 }
149
150 const std::string& WidgetView::GetInstanceId() const
151 {
152   return mInstanceId;
153 }
154
155 const std::string& WidgetView::GetContentInfo()
156 {
157   widget_instance_h instance;
158   char* contentInfo = NULL;
159
160   mContentInfo.clear();
161
162   if( mWidgetId.empty() || mInstanceId.empty() )
163   {
164     DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::GetContentInfo: Widget id (%s) or instance id (%s) is invalid.\n", mWidgetId.c_str(), mInstanceId.c_str() );
165     return mContentInfo;
166   }
167
168   instance = widget_instance_get_instance( mWidgetId.c_str(), mInstanceId.c_str() );
169   if( !instance )
170   {
171     DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::GetContentInfo: widget_instance_get_instance is failed. [%s]\n", mInstanceId.c_str() );
172     return mContentInfo;
173   }
174
175   if( widget_instance_get_content( instance, &contentInfo ) < 0 )
176   {
177     DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::GetContentInfo: Failed to get content of widget. [%s]\n", mInstanceId.c_str() );
178     return mContentInfo;
179   }
180
181   mContentInfo = reinterpret_cast< char* >( contentInfo );
182
183   return mContentInfo;
184 }
185
186 const std::string& WidgetView::GetTitle()
187 {
188   if( mObjectView )
189   {
190     mTitle = mObjectView.GetTitle();
191     if( mTitle.empty() )
192     {
193       mTitle = widget_service_get_name( mWidgetId.c_str(), NULL );
194     }
195   }
196
197   DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::GetTitle: title = %s\n", mTitle.c_str() );
198
199   return mTitle;
200 }
201
202 double WidgetView::GetUpdatePeriod() const
203 {
204   return mUpdatePeriod;
205 }
206
207 void WidgetView::Show()
208 {
209   if( mObjectView )
210   {
211     mObjectView.Show();
212   }
213 }
214
215 void WidgetView::Hide()
216 {
217   if( mObjectView )
218   {
219     mObjectView.Hide();
220   }
221 }
222
223 bool WidgetView::CancelTouchEvent()
224 {
225   if( mObjectView )
226   {
227     return mObjectView.CancelTouchEvent();
228   }
229
230   return false;
231 }
232
233 void WidgetView::SetPreviewEnabled( bool enabled )
234 {
235   mPreviewEnabled = enabled;
236
237   if( mPreviewImage )
238   {
239     mPreviewImage.SetVisible( enabled );
240   }
241 }
242
243 bool WidgetView::GetPreviewEnabled() const
244 {
245   return mPreviewEnabled;
246 }
247
248 void WidgetView::SetStateTextEnabled( bool enabled )
249 {
250   mStateTextEnabled = enabled;
251
252   if( mStateText )
253   {
254     mStateText.SetVisible( enabled );
255   }
256 }
257
258 bool WidgetView::GetStateTextEnabled() const
259 {
260   return mStateTextEnabled;
261 }
262
263 void WidgetView::ActivateFaultedWidget()
264 {
265   if( mPid < 0 )
266   {
267     // Esable preview and text
268     if( mPreviewEnabled )
269     {
270       mPreviewImage.SetVisible( true );
271     }
272
273     if( mStateTextEnabled )
274     {
275       mStateText.SetVisible( true );
276     }
277
278     // launch widget again
279     mPid = widget_instance_launch( mInstanceId.c_str(), (char *)mContentInfo.c_str(), mWidth, mHeight );
280     if( mPid < 0)
281     {
282       DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::ActivateFaultedWidget: widget_instance_launch is failed. [%s]\n", mWidgetId.c_str() );
283
284       // Emit signal
285       Dali::WidgetView::WidgetView handle( GetOwner() );
286       mWidgetCreationAbortedSignal.Emit( handle );
287
288       return;
289     }
290
291     DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::ActivateFaultedWidget: widget_instance_launch is called. [%s, mPid = %d]\n", mWidgetId.c_str(), mPid );
292   }
293 }
294
295 bool WidgetView::IsWidgetFaulted()
296 {
297   return mPid < 0 ? true : false;
298 }
299
300 void WidgetView::SetPermanentDelete( bool permanentDelete )
301 {
302   mPermanentDelete = permanentDelete;
303 }
304
305 void WidgetView::AddObjectView( Pepper::ObjectView objectView )
306 {
307   mObjectView = objectView;
308
309   mObjectView.SetParentOrigin( ParentOrigin::CENTER );
310   mObjectView.SetAnchorPoint( AnchorPoint::CENTER );
311
312   Self().Add( mObjectView );
313
314   // Disable preview and text
315   if( mPreviewEnabled )
316   {
317     mPreviewImage.SetVisible( false );
318   }
319
320   if( mStateTextEnabled )
321   {
322     mStateText.SetVisible( false );
323   }
324
325   // Emit signal
326   Dali::WidgetView::WidgetView handle( GetOwner() );
327   mWidgetAddedSignal.Emit( handle );
328
329   DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::AddObjectView: ObjectView is added.\n" );
330 }
331
332 void WidgetView::RemoveObjectView()
333 {
334   // Enable preview and text
335   if( mPreviewEnabled )
336   {
337     mPreviewImage.SetVisible( true );
338   }
339
340   if( mStateTextEnabled )
341   {
342     mStateText.SetVisible( true );
343   }
344
345   // Emit signal
346   Dali::WidgetView::WidgetView handle( GetOwner() );
347   mWidgetDeletedSignal.Emit( handle );
348
349   mObjectView.Reset();
350
351   DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::RemoveObjectView: ObjectView is removed.\n" );
352 }
353
354 void WidgetView::SendWidgetEvent( int event )
355 {
356   Dali::WidgetView::WidgetView handle( GetOwner() );
357
358   DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::SendWidgetEvent: event = %d widget = %s\n", event,  mWidgetId.c_str() );
359
360   // Emit signal
361   switch( event )
362   {
363     case WIDGET_INSTANCE_EVENT_UPDATE:
364     {
365       mWidgetContentUpdatedSignal.Emit( handle );
366       break;
367     }
368     case WIDGET_INSTANCE_EVENT_PERIOD_CHANGED:
369     {
370       mWidgetUpdatePeriodChangedSignal.Emit( handle );
371       break;
372     }
373     case WIDGET_INSTANCE_EVENT_SIZE_CHANGED:
374     {
375       mWidgetResizedSignal.Emit( handle );
376       break;
377     }
378     case WIDGET_INSTANCE_EVENT_EXTRA_UPDATED:
379     {
380       mWidgetExtraInfoUpdatedSignal.Emit( handle );
381       break;
382     }
383     case WIDGET_INSTANCE_EVENT_FAULT:
384     {
385       mWidgetFaultedSignal.Emit( handle );
386       break;
387     }
388     default:
389     {
390       break;
391     }
392   }
393 }
394
395 Dali::WidgetView::WidgetView::WidgetViewSignalType& WidgetView::WidgetAddedSignal()
396 {
397   return mWidgetAddedSignal;
398 }
399
400 Dali::WidgetView::WidgetView::WidgetViewSignalType& WidgetView::WidgetDeletedSignal()
401 {
402   return mWidgetDeletedSignal;
403 }
404
405 Dali::WidgetView::WidgetView::WidgetViewSignalType& WidgetView::WidgetCreationAbortedSignal()
406 {
407   return mWidgetCreationAbortedSignal;
408 }
409
410 Dali::WidgetView::WidgetView::WidgetViewSignalType& WidgetView::WidgetResizedSignal()
411 {
412   return mWidgetResizedSignal;
413 }
414
415 Dali::WidgetView::WidgetView::WidgetViewSignalType& WidgetView::WidgetContentUpdatedSignal()
416 {
417   return mWidgetContentUpdatedSignal;
418 }
419
420 Dali::WidgetView::WidgetView::WidgetViewSignalType& WidgetView::WidgetExtraInfoUpdatedSignal()
421 {
422   return mWidgetExtraInfoUpdatedSignal;
423 }
424
425 Dali::WidgetView::WidgetView::WidgetViewSignalType& WidgetView::WidgetUpdatePeriodChangedSignal()
426 {
427   return mWidgetUpdatePeriodChangedSignal;
428 }
429
430 Dali::WidgetView::WidgetView::WidgetViewSignalType& WidgetView::WidgetFaultedSignal()
431 {
432   return mWidgetFaultedSignal;
433 }
434
435 void WidgetView::OnInitialize()
436 {
437   char* instanceId = NULL;
438   char* previewPath = NULL;
439   std::string previewImage;
440   widget_size_type_e sizeType;
441
442   int ret = widget_instance_create( mWidgetId.c_str(), &instanceId );
443   if( ret < 0 || !instanceId )
444   {
445     DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::OnInitialize: widget_instance_create is failed [%s].\n", mWidgetId.c_str() );
446     return;
447   }
448
449   DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::OnInitialize: widget_instance_create is called. [widget id = %s, instance id = %s]\n",
450                  mWidgetId.c_str(), instanceId );
451
452   mInstanceId = instanceId;
453
454   // Preview image
455   widget_service_get_size_type( mWidth, mHeight, &sizeType );
456
457   previewPath = widget_service_get_preview_image_path( mWidgetId.c_str(), sizeType );
458   if( previewPath )
459   {
460     previewImage = previewPath;
461     free( previewPath );
462   }
463   else
464   {
465     previewImage = tzplatform_getenv( TZ_SYS_SHARE );
466     previewImage.append( WIDGET_VIEW_RESOURCE_DEFAULT_IMG );
467   }
468
469   DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::OnInitialize: preview image path = %s\n", previewImage.c_str() );
470
471   mPreviewImage = Toolkit::ImageView::New( previewImage );
472
473   mPreviewImage.SetParentOrigin( ParentOrigin::CENTER );
474   mPreviewImage.SetAnchorPoint( AnchorPoint::CENTER );
475
476   if( !previewPath )
477   {
478     mPreviewImage.SetSize( mWidth, mHeight );
479   }
480
481   Self().SetResizePolicy( ResizePolicy::FIT_TO_CHILDREN, Dimension::ALL_DIMENSIONS );
482   Self().Add( mPreviewImage );
483
484   // State text
485   // TODO: use po files
486   mStateText = Toolkit::TextLabel::New( "Loading..." );
487
488   mStateText.SetParentOrigin( ParentOrigin::CENTER );
489   mStateText.SetAnchorPoint( AnchorPoint::CENTER );
490   mStateText.SetProperty( Toolkit::TextLabel::Property::HORIZONTAL_ALIGNMENT, "CENTER" );
491   mStateText.SetProperty( Toolkit::TextLabel::Property::VERTICAL_ALIGNMENT, "CENTER" );
492
493   mPreviewImage.Add( mStateText );
494
495   // launch widget
496   mPid = widget_instance_launch( instanceId, (char *)mContentInfo.c_str(), mWidth, mHeight );
497   if( mPid < 0)
498   {
499     DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::OnInitialize: widget_instance_launch is failed. [%s]\n", mWidgetId.c_str() );
500
501     // Emit signal
502     Dali::WidgetView::WidgetView handle( GetOwner() );
503     mWidgetCreationAbortedSignal.Emit( handle );
504
505     return;
506   }
507
508   DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::OnInitialize: widget_instance_launch is called. [%s, mPid = %d]\n", mWidgetId.c_str(), mPid );
509 }
510
511 void WidgetView::OnSizeSet( const Vector3& targetSize )
512 {
513   if( mObjectView )
514   {
515     mObjectView.SetSize( targetSize );
516   }
517 }
518
519 } // namespace Internal
520
521 } // namespace WidgetView
522
523 } // namespace Dali