Replace some APIs to property and clean up
[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/public-api/common/stage.h>
25 #include <dali/public-api/events/touch-data.h>
26 #include <dali/public-api/events/wheel-event.h>
27 #include <dali/public-api/images/native-image.h>
28 #include <dali/public-api/object/type-registry.h>
29 #include <dali/public-api/object/type-registry-helper.h>
30 #include <dali-toolkit/public-api/visuals/visual-properties.h>
31 #include <dali-toolkit/devel-api/visual-factory/visual-factory.h>
32 #include <dali/integration-api/debug.h>
33 #include <string.h>
34 #include <Ecore_Input.h>
35 #include <widget_service.h>
36 #include <widget_instance.h>
37 #include <tzplatform_config.h>
38 #include <wayland-extension/tizen-extension-client-protocol.h>
39 #include <aul_rsm_viewer.h>
40
41 namespace Dali
42 {
43
44 namespace WidgetView
45 {
46
47 namespace Internal
48 {
49
50 namespace
51 {
52
53 #define WIDGET_VIEW_RESOURCE_DEFAULT_IMG "/widget_viewer_dali/images/unknown.png"
54
55 #if defined(DEBUG_ENABLED)
56 Integration::Log::Filter* gWidgetViewLogging  = Integration::Log::Filter::New( Debug::Verbose, false, "LOG_WIDGET_VIEW" );
57 #endif
58
59 BaseHandle Create()
60 {
61   return Dali::BaseHandle();
62 }
63
64 // Setup properties, signals and actions using the type-registry.
65 DALI_TYPE_REGISTRATION_BEGIN( Dali::WidgetView::WidgetView, Toolkit::Control, Create );
66 DALI_PROPERTY_REGISTRATION( Dali::WidgetView, WidgetView, "widgetId", BOOLEAN, WIDGET_ID )
67 DALI_PROPERTY_REGISTRATION( Dali::WidgetView, WidgetView, "instanceId", BOOLEAN, INSTANCE_ID )
68 DALI_PROPERTY_REGISTRATION( Dali::WidgetView, WidgetView, "contentInfo", BOOLEAN, CONTENT_INFO )
69 DALI_PROPERTY_REGISTRATION( Dali::WidgetView, WidgetView, "title", BOOLEAN, TITLE )
70 DALI_PROPERTY_REGISTRATION( Dali::WidgetView, WidgetView, "updatePeriod", BOOLEAN, UPDATE_PERIOD )
71 DALI_PROPERTY_REGISTRATION( Dali::WidgetView, WidgetView, "preview", MAP, PREVIEW )
72 DALI_PROPERTY_REGISTRATION( Dali::WidgetView, WidgetView, "loadingText", MAP, LOADING_TEXT )
73 DALI_PROPERTY_REGISTRATION( Dali::WidgetView, WidgetView, "widgetStateFaulted", BOOLEAN, WIDGET_STATE_FAULTED )
74 DALI_PROPERTY_REGISTRATION( Dali::WidgetView, WidgetView, "permanentDelete", BOOLEAN, PERMANENT_DELETE )
75
76 // Signals
77 DALI_SIGNAL_REGISTRATION( Dali::WidgetView, WidgetView, "widgetAdded", SIGNAL_WIDGET_ADDED )
78 DALI_SIGNAL_REGISTRATION( Dali::WidgetView, WidgetView, "widgetDeleted", SIGNAL_WIDGET_DELETED )
79 DALI_SIGNAL_REGISTRATION( Dali::WidgetView, WidgetView, "widgetCreationAborted", SIGNAL_WIDGET_CREATION_ABORTED )
80 DALI_SIGNAL_REGISTRATION( Dali::WidgetView, WidgetView, "widgetContentUpdated", SIGNAL_WIDGET_CONTENT_UPDATED )
81 DALI_SIGNAL_REGISTRATION( Dali::WidgetView, WidgetView, "widgetUpdatePeriodChanged", SIGNAL_WIDGET_UPDATE_PERIOD_CHANGED )
82 DALI_SIGNAL_REGISTRATION( Dali::WidgetView, WidgetView, "widgetFaulted", SIGNAL_WIDGET_FAULTED )
83
84 // Actions
85 DALI_ACTION_REGISTRATION( Dali::WidgetView, WidgetView, "pauseWidget", ACTION_WIDGETVIEW_PAUSE_WIDGET );
86 DALI_ACTION_REGISTRATION( Dali::WidgetView, WidgetView, "resumeWidget", ACTION_WIDGETVIEW_RESUME_WIDGET );
87 DALI_ACTION_REGISTRATION( Dali::WidgetView, WidgetView, "cancelTouchEvent", ACTION_WIDGETVIEW_CANCEL_TOUCH_EVENT );
88 DALI_ACTION_REGISTRATION( Dali::WidgetView, WidgetView, "activateFaultedWidget", ACTION_WIDGETVIEW_ACTIVATE_FAULTED_WIDGET );
89
90 DALI_TYPE_REGISTRATION_END()
91
92 static Eina_Bool OnKeyDown( void* data, int type, void* eventInfo )
93 {
94   Ecore_Event_Key *event = static_cast< Ecore_Event_Key* >( eventInfo );
95   tizen_remote_surface* surface = static_cast< tizen_remote_surface* >( data );
96
97   tizen_remote_surface_transfer_key_event( surface,
98                                            TIZEN_REMOTE_SURFACE_EVENT_TYPE_KEY_DOWN,
99                                            event->keycode,
100                                            ecore_device_class_get(event->dev),
101                                            ecore_device_subclass_get(event->dev),
102                                            ecore_device_identifier_get(event->dev),
103                                            event->timestamp
104                                          );
105
106   return EINA_TRUE;
107 }
108
109 static Eina_Bool OnKeyUp(void* data, int type, void* eventInfo)
110 {
111   Ecore_Event_Key *event = static_cast< Ecore_Event_Key* >( eventInfo );
112   tizen_remote_surface* surface = static_cast< tizen_remote_surface* >( data );
113
114   tizen_remote_surface_transfer_key_event( surface,
115                                            TIZEN_REMOTE_SURFACE_EVENT_TYPE_KEY_UP,
116                                            event->keycode,
117                                            ecore_device_class_get(event->dev),
118                                            ecore_device_subclass_get(event->dev),
119                                            ecore_device_identifier_get(event->dev),
120                                            event->timestamp
121                                          );
122   return EINA_TRUE;
123 }
124
125 static void OnSurfaceUpdate( struct tizen_remote_surface* surface, wl_buffer* buffer, uint32_t time, void* data )
126 {
127   Dali::WidgetView::Internal::WidgetView* widgetView = static_cast< Dali::WidgetView::Internal::WidgetView* >( data );
128
129   if( widgetView && !widgetView->IsWidgetImageView() )
130   {
131     tizen_remote_surface_transfer_visibility( surface, TIZEN_REMOTE_SURFACE_VISIBILITY_TYPE_VISIBLE);
132
133     widgetView->CreateWidgetImageView();
134     widgetView->ConnectSignal( surface );
135     ecore_event_handler_add( ECORE_EVENT_KEY_DOWN, OnKeyDown, surface );
136     ecore_event_handler_add( ECORE_EVENT_KEY_UP, OnKeyUp, surface );
137
138   }
139
140   //get tbm surface from buffer
141   tbm_surface_h tbmSurface = static_cast< tbm_surface_h >( wl_buffer_get_user_data( buffer ) );
142   widgetView->UpdateImageSource( tbmSurface );
143 }
144
145 static void OnSurfaceMissing( struct tizen_remote_surface* surface, void* data )
146 {
147   //ToDo: WidgetDeletedSignal
148 }
149
150
151 static struct aul_rsm_handler_s remoteSurfaceHandler = {
152   OnSurfaceUpdate,
153   OnSurfaceMissing,
154 };
155
156 } // unnamed namespace
157
158 Dali::WidgetView::WidgetView WidgetView::New( const std::string& widgetId, const std::string& contentInfo, int width, int height, float updatePeriod )
159 {
160   // Create the implementation, temporarily owned on stack
161   IntrusivePtr< WidgetView > internalWidgetView = new WidgetView( widgetId, contentInfo, width, height, updatePeriod );
162
163   // Pass ownership to CustomActor
164   Dali::WidgetView::WidgetView widgetView( *internalWidgetView );
165
166   // Second-phase init of the implementation
167   // This can only be done after the CustomActor connection has been made...
168   internalWidgetView->Initialize();
169
170   return widgetView;
171 }
172
173 WidgetView::WidgetView()
174 : Control( ControlBehaviour( REQUIRES_TOUCH_EVENTS ) ),
175   mWidgetId(),
176   mInstanceId(),
177   mContentInfo(),
178   mTitle(),
179   mBundle( NULL ),
180   mWidth( 0 ),
181   mHeight( 0 ),
182   mPid( 0 ),
183   mUpdatePeriod( 0.0 ),
184   mPreviewVisible( true ),
185   mStateTextVisible( true ),
186   mPermanentDelete( true )
187 {
188 }
189
190 WidgetView::WidgetView( const std::string& widgetId, const std::string& contentInfo, int width, int height, float updatePeriod )
191 : Control( ControlBehaviour( REQUIRES_TOUCH_EVENTS ) ),
192   mWidgetId( widgetId ),
193   mInstanceId(),
194   mContentInfo( contentInfo ),
195   mTitle(),
196   mBundle( NULL ),
197   mWidth( width ),
198   mHeight( height ),
199   mPid( 0 ),
200   mUpdatePeriod( updatePeriod ),
201   mPreviewVisible( true ),
202   mStateTextVisible( true ),
203   mPermanentDelete( true )
204 {
205 }
206
207 WidgetView::~WidgetView()
208 {
209   if( !mWidgetId.empty() && !mInstanceId.empty() )
210   {
211     widget_instance_terminate( mInstanceId.c_str() );
212
213     if( mPermanentDelete )
214     {
215       widget_instance_destroy( mInstanceId.c_str() );
216     }
217   }
218
219   if( mBundle )
220   {
221     bundle_free( mBundle );
222   }
223 }
224
225 bool WidgetView::PauseWidget()
226 {
227   int ret = widget_instance_pause( mInstanceId.c_str() );
228   if( ret < 0 )
229   {
230     DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::PauseWidget: Fail to pause widget(%s, %s) [%d]\n", mWidgetId.c_str(), mInstanceId.c_str(), ret );
231     return false;
232   }
233
234   DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::PauseWidget: Widget is paused (%s, %s)\n", mWidgetId.c_str(), mInstanceId.c_str() );
235
236   return true;
237 }
238
239 bool WidgetView::ResumeWidget()
240 {
241   int ret = widget_instance_resume( mInstanceId.c_str() );
242   if( ret < 0 )
243   {
244     DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::ResumeWidget: Fail to resume widget(%s, %s) [%d]\n", mWidgetId.c_str(), mInstanceId.c_str(), ret );
245     return false;
246   }
247
248   DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::ResumeWidget: Widget is resumed (%s, %s)\n", mWidgetId.c_str(), mInstanceId.c_str() );
249
250   return true;
251 }
252
253 const std::string& WidgetView::GetWidgetId() const
254 {
255   return mWidgetId;
256 }
257
258 const std::string& WidgetView::GetInstanceId() const
259 {
260   return mInstanceId;
261 }
262
263 const std::string& WidgetView::GetContentInfo()
264 {
265   widget_instance_h instance;
266   char* contentInfo = NULL;
267
268   mContentInfo.clear();
269
270   if( mWidgetId.empty() || mInstanceId.empty() )
271   {
272     DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::GetContentInfo: Widget id (%s) or instance id (%s) is invalid.\n", mWidgetId.c_str(), mInstanceId.c_str() );
273     return mContentInfo;
274   }
275
276   instance = widget_instance_get_instance( mWidgetId.c_str(), mInstanceId.c_str() );
277   if( !instance )
278   {
279     DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::GetContentInfo: widget_instance_get_instance is failed. [%s]\n", mInstanceId.c_str() );
280     return mContentInfo;
281   }
282
283   if( widget_instance_get_content( instance, &contentInfo ) < 0 )
284   {
285     DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::GetContentInfo: Failed to get content of widget. [%s]\n", mInstanceId.c_str() );
286     return mContentInfo;
287   }
288
289   mContentInfo = reinterpret_cast< char* >( contentInfo );
290
291   return mContentInfo;
292 }
293
294 const std::string& WidgetView::GetTitle()
295 {
296   //ToDo: We should add some codes by considering widget_viewer_evas
297   if( mTitle.empty() )
298   {
299     mTitle = widget_service_get_name( mWidgetId.c_str(), NULL );
300   }
301
302   DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::GetTitle: title = %s\n", mTitle.c_str() );
303
304   return mTitle;
305 }
306
307 float WidgetView::GetUpdatePeriod() const
308 {
309   return mUpdatePeriod;
310 }
311
312 bool WidgetView::CancelTouchEvent()
313 {
314   if( mRemoteSurface )
315   {
316     tizen_remote_surface_transfer_touch_cancel( mRemoteSurface );
317     return true;
318   }
319
320   return false;
321 }
322
323 void WidgetView::ShowPreview( bool show )
324 {
325   if( mPreviewImage && show != mPreviewVisible )
326   {
327     mPreviewVisible = show;
328     mPreviewImage.SetVisible( show );
329   }
330 }
331
332 bool WidgetView::IsPreviewVisible()
333 {
334   return mPreviewVisible;
335 }
336
337 void WidgetView::ShowStateText( bool show )
338 {
339   if( mStateText && mStateTextVisible != show )
340   {
341     mStateTextVisible = show;
342     mStateText.SetVisible( show );
343   }
344 }
345
346 bool WidgetView::IsStateTextVisible()
347 {
348   return mStateTextVisible;
349 }
350
351 void WidgetView::ActivateFaultedWidget()
352 {
353   if( mPid < 0 )
354   {
355     // Esable preview and text
356     if( mPreviewVisible )
357     {
358       mPreviewImage.SetVisible( true );
359     }
360
361     if( mStateTextVisible )
362     {
363       mStateText.SetVisible( true );
364     }
365
366     // launch widget again
367     mPid = widget_instance_launch( mInstanceId.c_str(), (char *)mContentInfo.c_str(), mWidth, mHeight );
368     if( mPid < 0)
369     {
370       DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::ActivateFaultedWidget: widget_instance_launch is failed. [%s]\n", mWidgetId.c_str() );
371
372       // Emit signal
373       Dali::WidgetView::WidgetView handle( GetOwner() );
374       mWidgetCreationAbortedSignal.Emit( handle );
375
376       return;
377     }
378
379     DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::ActivateFaultedWidget: widget_instance_launch is called. [%s, mPid = %d]\n", mWidgetId.c_str(), mPid );
380   }
381 }
382
383 bool WidgetView::IsWidgetFaulted()
384 {
385   return mPid < 0 ? true : false;
386 }
387
388 void WidgetView::SetPermanentDelete( bool permanentDelete )
389 {
390   mPermanentDelete = permanentDelete;
391 }
392
393 bool WidgetView::IsPermanentDelete()
394 {
395   return mPermanentDelete;
396 }
397
398 void WidgetView::CreateWidgetImageView()
399 {
400   Any source;
401   mImageSource = Dali::NativeImageSource::New( source );
402   Dali::NativeImage image = Dali::NativeImage::New( *mImageSource );
403
404   mWidgetImageView = Dali::Toolkit::ImageView::New( image );
405
406   mWidgetImageView.SetParentOrigin( ParentOrigin::CENTER );
407   mWidgetImageView.SetAnchorPoint( AnchorPoint::CENTER );
408   mWidgetImageView.SetSize( mWidth, mHeight );
409
410   Self().Add( mWidgetImageView );
411
412   // Disable preview and text
413   if( mPreviewVisible )
414   {
415     mPreviewImage.SetVisible( false );
416   }
417
418   if( mStateTextVisible )
419   {
420     mStateText.SetVisible( false );
421   }
422
423   // Emit signal
424   Dali::WidgetView::WidgetView handle( GetOwner() );
425   mWidgetAddedSignal.Emit( handle );
426
427   DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::AddObjectView: ObjectView is added.\n" );
428 }
429
430 void WidgetView::RemoveObjectView()
431 {
432   // Enable preview and text
433   if( mPreviewVisible )
434   {
435     mPreviewImage.SetVisible( true );
436   }
437
438   if( mStateTextVisible )
439   {
440     mStateText.SetVisible( true );
441   }
442
443   // Emit signal
444   Dali::WidgetView::WidgetView handle( GetOwner() );
445   mWidgetDeletedSignal.Emit( handle );
446
447   mWidgetImageView.Reset();
448
449   DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::RemoveObjectView: ObjectView is removed.\n" );
450 }
451
452 void WidgetView::SendWidgetEvent( int event )
453 {
454   Dali::WidgetView::WidgetView handle( GetOwner() );
455
456   DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::SendWidgetEvent: event = %d widget = %s\n", event,  mWidgetId.c_str() );
457
458   // Emit signal
459   switch( event )
460   {
461     case WIDGET_INSTANCE_EVENT_UPDATE:
462     {
463       mWidgetContentUpdatedSignal.Emit( handle );
464       break;
465     }
466     case WIDGET_INSTANCE_EVENT_PERIOD_CHANGED:
467     {
468       mWidgetUpdatePeriodChangedSignal.Emit( handle );
469       break;
470     }
471     case WIDGET_INSTANCE_EVENT_FAULT:
472     {
473       mWidgetFaultedSignal.Emit( handle );
474       break;
475     }
476     default:
477     {
478       break;
479     }
480   }
481 }
482
483 bool WidgetView::DoConnectSignal( BaseObject* object, ConnectionTrackerInterface* tracker, const std::string& signalName, FunctorDelegate* functor )
484 {
485   Dali::BaseHandle handle( object );
486
487   bool connected( true );
488   Dali::WidgetView::WidgetView widgetView = Dali::WidgetView::WidgetView::DownCast( handle );
489
490   if( strcmp( signalName.c_str(), SIGNAL_WIDGET_ADDED ) == 0 )
491   {
492     widgetView.WidgetAddedSignal().Connect( tracker, functor );
493   }
494   else if( strcmp( signalName.c_str(), SIGNAL_WIDGET_DELETED ) == 0 )
495   {
496     widgetView.WidgetDeletedSignal().Connect( tracker, functor );
497   }
498   else if( strcmp( signalName.c_str(), SIGNAL_WIDGET_CREATION_ABORTED ) == 0 )
499   {
500     widgetView.WidgetCreationAbortedSignal().Connect( tracker, functor );
501   }
502   else if( strcmp( signalName.c_str(), SIGNAL_WIDGET_CONTENT_UPDATED ) == 0 )
503   {
504     widgetView.WidgetContentUpdatedSignal().Connect( tracker, functor );
505   }
506   else if( strcmp( signalName.c_str(), SIGNAL_WIDGET_UPDATE_PERIOD_CHANGED ) == 0 )
507   {
508     widgetView.WidgetUpdatePeriodChangedSignal().Connect( tracker, functor );
509   }
510   else if( strcmp( signalName.c_str(), SIGNAL_WIDGET_FAULTED ) == 0 )
511   {
512     widgetView.WidgetFaultedSignal().Connect( tracker, functor );
513   }
514   else
515   {
516     // signalName does not match any signal
517     connected = false;
518   }
519
520   return connected;
521 }
522
523 bool WidgetView::DoAction( BaseObject* object, const std::string& actionName, const Property::Map& attributes )
524 {
525   bool ret = true;
526
527   Dali::BaseHandle handle( object );
528   Dali::WidgetView::WidgetView widgetView = Dali::WidgetView::WidgetView::DownCast( handle );
529
530   if( !widgetView )
531   {
532     return false;
533   }
534
535   WidgetView& impl = GetImplementation( widgetView );
536
537   if( strcmp( actionName.c_str(), ACTION_WIDGETVIEW_PAUSE_WIDGET ) == 0 )
538   {
539     impl.PauseWidget();
540   }
541   else if( strcmp( actionName.c_str(), ACTION_WIDGETVIEW_RESUME_WIDGET ) == 0 )
542   {
543     impl.ResumeWidget();
544   }
545   else if( strcmp( actionName.c_str(), ACTION_WIDGETVIEW_CANCEL_TOUCH_EVENT ) == 0 )
546   {
547     impl.CancelTouchEvent();
548   }
549   else if( strcmp( actionName.c_str(), ACTION_WIDGETVIEW_ACTIVATE_FAULTED_WIDGET ) == 0 )
550   {
551     impl.ActivateFaultedWidget();
552   }
553   else
554   {
555     ret = false;
556   }
557
558   return ret;
559 }
560
561 void WidgetView::SetProperty( BaseObject* object, Property::Index index, const Property::Value& value )
562 {
563   Dali::WidgetView::WidgetView widgetView = Dali::WidgetView::WidgetView::DownCast( Dali::BaseHandle( object ) );
564
565   if( widgetView )
566   {
567     WidgetView& impl = GetImplementation( widgetView );
568
569     switch( index )
570     {
571       case Dali::WidgetView::WidgetView::Property::PREVIEW:
572       {
573         bool previewEnabled;
574         if( value.Get( previewEnabled ) )
575         {
576           impl.ShowPreview( previewEnabled );
577         }
578         break;
579       }
580       case Dali::WidgetView::WidgetView::Property::LOADING_TEXT:
581       {
582         bool textEnabled;
583         if( value.Get( textEnabled ) )
584         {
585           impl.ShowStateText( textEnabled );
586         }
587         break;
588       }
589       case Dali::WidgetView::WidgetView::Property::PERMANENT_DELETE:
590       {
591         bool del;
592         if( value.Get( del ) )
593         {
594           impl.SetPermanentDelete( del );
595         }
596         break;
597       }
598     }
599   }
600 }
601
602 Property::Value WidgetView::GetProperty( BaseObject* object, Property::Index index )
603 {
604   Property::Value value;
605   Dali::WidgetView::WidgetView widgetView = Dali::WidgetView::WidgetView::DownCast( Dali::BaseHandle( object ) );
606
607   if( widgetView )
608   {
609     WidgetView& impl = GetImplementation( widgetView );
610
611     switch( index )
612     {
613       case Dali::WidgetView::WidgetView::Property::WIDGET_ID:
614       {
615         value = impl.GetWidgetId();
616         break;
617       }
618       case Dali::WidgetView::WidgetView::Property::INSTANCE_ID:
619       {
620         value = impl.GetInstanceId();
621         break;
622       }
623       case Dali::WidgetView::WidgetView::Property::CONTENT_INFO:
624       {
625         value = impl.GetContentInfo();
626         break;
627       }
628       case Dali::WidgetView::WidgetView::Property::TITLE:
629       {
630         value = impl.GetTitle();
631         break;
632       }
633       case Dali::WidgetView::WidgetView::Property::UPDATE_PERIOD:
634       {
635         value = impl.GetUpdatePeriod();
636         break;
637       }
638       case Dali::WidgetView::WidgetView::Property::PREVIEW:
639       {
640         value = impl.IsPreviewVisible();
641         break;
642       }
643       case Dali::WidgetView::WidgetView::Property::LOADING_TEXT:
644       {
645         value = impl.IsStateTextVisible();
646         break;
647       }
648       case Dali::WidgetView::WidgetView::Property::WIDGET_STATE_FAULTED:
649       {
650         value = impl.IsWidgetFaulted();
651         break;
652       }
653       case Dali::WidgetView::WidgetView::Property::PERMANENT_DELETE:
654       {
655         value = impl.IsPermanentDelete();
656         break;
657       }
658     }
659   }
660
661   return value;
662 }
663
664 Dali::WidgetView::WidgetView::WidgetViewSignalType& WidgetView::WidgetAddedSignal()
665 {
666   return mWidgetAddedSignal;
667 }
668
669 Dali::WidgetView::WidgetView::WidgetViewSignalType& WidgetView::WidgetDeletedSignal()
670 {
671   return mWidgetDeletedSignal;
672 }
673
674 Dali::WidgetView::WidgetView::WidgetViewSignalType& WidgetView::WidgetCreationAbortedSignal()
675 {
676   return mWidgetCreationAbortedSignal;
677 }
678
679 Dali::WidgetView::WidgetView::WidgetViewSignalType& WidgetView::WidgetContentUpdatedSignal()
680 {
681   return mWidgetContentUpdatedSignal;
682 }
683
684 Dali::WidgetView::WidgetView::WidgetViewSignalType& WidgetView::WidgetUpdatePeriodChangedSignal()
685 {
686   return mWidgetUpdatePeriodChangedSignal;
687 }
688
689 Dali::WidgetView::WidgetView::WidgetViewSignalType& WidgetView::WidgetFaultedSignal()
690 {
691   return mWidgetFaultedSignal;
692 }
693
694 void WidgetView::OnInitialize()
695 {
696   char* instanceId = NULL;
697   char* previewPath = NULL;
698   std::string previewImage;
699   widget_size_type_e sizeType;
700
701   int ret = widget_instance_create( mWidgetId.c_str(), &instanceId );
702   if( ret < 0 || !instanceId )
703   {
704     DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::OnInitialize: widget_instance_create is failed [%s].\n", mWidgetId.c_str() );
705     return;
706   }
707
708   DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::OnInitialize: widget_instance_create is called. [widget id = %s, instance id = %s]\n",
709                  mWidgetId.c_str(), instanceId );
710
711   mInstanceId = instanceId;
712
713   // Preview image
714   widget_service_get_size_type( mWidth, mHeight, &sizeType );
715
716   previewPath = widget_service_get_preview_image_path( mWidgetId.c_str(), sizeType );
717   if( previewPath )
718   {
719     previewImage = previewPath;
720     free( previewPath );
721   }
722   else
723   {
724     previewImage = tzplatform_getenv( TZ_SYS_SHARE );
725     previewImage.append( WIDGET_VIEW_RESOURCE_DEFAULT_IMG );
726   }
727
728   DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::OnInitialize: preview image path = %s\n", previewImage.c_str() );
729
730   mPreviewImage = Toolkit::ImageView::New( previewImage );
731
732   mPreviewImage.SetParentOrigin( ParentOrigin::CENTER );
733   mPreviewImage.SetAnchorPoint( AnchorPoint::CENTER );
734
735   if( !previewPath )
736   {
737     mPreviewImage.SetSize( mWidth, mHeight );
738   }
739
740   Self().SetResizePolicy( ResizePolicy::FIT_TO_CHILDREN, Dimension::ALL_DIMENSIONS );
741   Self().Add( mPreviewImage );
742
743   // State text
744   // TODO: use po files
745   mStateText = Toolkit::TextLabel::New( "Loading..." );
746
747   mStateText.SetParentOrigin( ParentOrigin::CENTER );
748   mStateText.SetAnchorPoint( AnchorPoint::CENTER );
749   mStateText.SetProperty( Toolkit::TextLabel::Property::HORIZONTAL_ALIGNMENT, "CENTER" );
750   mStateText.SetProperty( Toolkit::TextLabel::Property::VERTICAL_ALIGNMENT, "CENTER" );
751
752   mPreviewImage.Add( mStateText );
753
754   // launch widget
755   mPid = widget_instance_launch( instanceId, (char *)mContentInfo.c_str(), mWidth, mHeight );
756   if( mPid < 0)
757   {
758     DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::OnInitialize: widget_instance_launch is failed. [%s]\n", mWidgetId.c_str() );
759
760     // Emit signal
761     Dali::WidgetView::WidgetView handle( GetOwner() );
762     mWidgetCreationAbortedSignal.Emit( handle );
763
764     return;
765   }
766
767   aul_rsm_viewer_set_surface_handler( mInstanceId.c_str(), &remoteSurfaceHandler, this );
768
769   DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::OnInitialize: widget_instance_launch is called. [%s, mPid = %d]\n", mWidgetId.c_str(), mPid );
770
771 }
772
773 void WidgetView::OnStageConnection( int depth )
774 {
775   Control::OnStageConnection( depth );
776 }
777
778 void WidgetView::OnStageDisconnection()
779 {
780   Control::OnStageDisconnection();
781 }
782
783 void WidgetView::OnSizeSet( const Vector3& targetSize )
784 {
785   if( mWidgetImageView )
786   {
787     mWidgetImageView.SetSize( targetSize );
788   }
789 }
790
791 bool WidgetView::IsWidgetImageView()
792 {
793   return ( mWidgetImageView )? true: false;
794 }
795
796 void WidgetView::UpdateImageSource( tbm_surface_h source )
797 {
798   mImageSource->SetSource( source );
799   Dali::Stage::GetCurrent().KeepRendering( 0.0f );
800 }
801
802 void WidgetView::ConnectSignal( tizen_remote_surface* surface )
803 {
804   if( mWidgetImageView )
805   {
806     mRemoteSurface = surface;
807     mWidgetImageView.TouchSignal().Connect( this, &WidgetView::OnTouch );
808     mWidgetImageView.WheelEventSignal().Connect( this, &WidgetView::OnWheelEvent );
809   }
810
811 }
812
813 bool WidgetView::OnTouch( Dali::Actor actor, const Dali::TouchData& event )
814 {
815   tizen_remote_surface_event_type type = TIZEN_REMOTE_SURFACE_EVENT_TYPE_NONE;
816
817   switch( event.GetState( 0 ) )
818   {
819     case Dali::PointState::UP:
820     {
821       type = TIZEN_REMOTE_SURFACE_EVENT_TYPE_MOUSE_UP;
822       break;
823     }
824     case Dali::PointState::DOWN:
825     {
826       type = TIZEN_REMOTE_SURFACE_EVENT_TYPE_MOUSE_DOWN;
827       break;
828     }
829     case Dali::PointState::MOTION:
830     {
831       type = TIZEN_REMOTE_SURFACE_EVENT_TYPE_MOUSE_MOVE;
832       break;
833     }
834     default:
835     {
836       return false;
837     }
838   }
839
840   tizen_remote_surface_transfer_mouse_event( mRemoteSurface,
841                                              type,
842                                              event.GetDeviceId( 0 ),
843                                              1,
844                                              event.GetLocalPosition( 0 ).x,
845                                              event.GetLocalPosition( 0 ).y,
846                                              event.GetEllipseRadius( 0 ).x,
847                                              event.GetEllipseRadius( 0 ).y,
848                                              event.GetPressure( 0 ),
849                                              event.GetAngle( 0 ).degree,
850                                              TIZEN_INPUT_DEVICE_CLAS_MOUSE,
851                                              TIZEN_INPUT_DEVICE_SUBCLAS_NONE,
852                                              "",
853                                              event.GetTime()
854                                            );
855   return true;
856 }
857
858 bool WidgetView::OnWheelEvent( Dali::Actor actor, const Dali::WheelEvent& event )
859 {
860   tizen_remote_surface_transfer_mouse_wheel( mRemoteSurface,
861                                              event.direction,
862                                              event.z,
863                                              TIZEN_INPUT_DEVICE_CLAS_MOUSE,
864                                              TIZEN_INPUT_DEVICE_SUBCLAS_NONE,
865                                              "",
866                                              event.timeStamp
867                                            );
868   return true;
869 }
870
871 Vector3 WidgetView::GetNaturalSize()
872 {
873   Vector3 size;
874   size.x = mWidth;
875   size.y = mHeight;
876
877   if( size.x > 0 && size.y > 0 )
878   {
879     size.z = std::min( size.x, size.y );
880     return size;
881   }
882   else
883   {
884     return Control::GetNaturalSize();
885   }
886 }
887
888 float WidgetView::GetHeightForWidth( float width )
889 {
890   if( mWidth > 0 && mHeight > 0 )
891   {
892     return GetHeightForWidthBase( width );
893   }
894   else
895   {
896     return Control::GetHeightForWidthBase( width );
897   }
898 }
899
900 float WidgetView::GetWidthForHeight( float height )
901 {
902   if( mWidth > 0 && mHeight > 0 )
903   {
904     return GetWidthForHeightBase( height );
905   }
906   else
907   {
908     return Control::GetWidthForHeightBase( height );
909   }
910 }
911
912 } // namespace Internal
913
914 } // namespace WidgetView
915
916 } // namespace Dali