3 * Copyright (c) 2016 Samsung Electronics Co., Ltd.
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
9 * http://floralicense.org/license/
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.
19 #include <widget_viewer_dali/internal/widget_view/widget_view_impl.h>
24 #include <dali/public-api/common/stage.h>
25 #include <dali/public-api/events/touch-data.h>
26 #include <dali/public-api/events/key-event.h>
27 #include <dali/public-api/events/wheel-event.h>
28 #include <dali/public-api/images/native-image.h>
29 #include <dali/public-api/object/type-registry.h>
30 #include <dali/public-api/object/type-registry-helper.h>
31 #include <dali-toolkit/public-api/visuals/visual-properties.h>
32 #include <dali-toolkit/devel-api/visual-factory/visual-factory.h>
33 #include <dali/integration-api/debug.h>
34 #include <dali/devel-api/events/touch-event-devel.h>
35 #include <dali/devel-api/events/key-event-devel.h>
37 #include <Ecore_Wayland.h>
38 #include <Ecore_Input.h>
39 #include <widget_service.h>
40 #include <widget_instance.h>
41 #include <tzplatform_config.h>
42 #include <wayland-extension/tizen-extension-client-protocol.h>
43 #include <tbm_surface_internal.h>
46 #include <xkbcommon/xkbcommon.h>
60 const int DEFAULT_FONT_PIXEL_SIZE = 30; // Referred platform widget viewer evas
62 #define GET_LOCALE_TEXT(string) dgettext(PKGNAME, string)
64 #if defined(DEBUG_ENABLED)
65 Integration::Log::Filter* gWidgetViewLogging = Integration::Log::Filter::New( Debug::Verbose, false, "LOG_WIDGET_VIEW" );
70 return Dali::BaseHandle();
73 // Setup properties, signals and actions using the type-registry.
74 DALI_TYPE_REGISTRATION_BEGIN( Dali::WidgetView::WidgetView, Toolkit::Control, Create );
75 DALI_PROPERTY_REGISTRATION( Dali::WidgetView, WidgetView, "widgetId", BOOLEAN, WIDGET_ID )
76 DALI_PROPERTY_REGISTRATION( Dali::WidgetView, WidgetView, "instanceId", BOOLEAN, INSTANCE_ID )
77 DALI_PROPERTY_REGISTRATION( Dali::WidgetView, WidgetView, "contentInfo", BOOLEAN, CONTENT_INFO )
78 DALI_PROPERTY_REGISTRATION( Dali::WidgetView, WidgetView, "title", BOOLEAN, TITLE )
79 DALI_PROPERTY_REGISTRATION( Dali::WidgetView, WidgetView, "updatePeriod", BOOLEAN, UPDATE_PERIOD )
80 DALI_PROPERTY_REGISTRATION( Dali::WidgetView, WidgetView, "preview", MAP, PREVIEW )
81 DALI_PROPERTY_REGISTRATION( Dali::WidgetView, WidgetView, "loadingText", MAP, LOADING_TEXT )
82 DALI_PROPERTY_REGISTRATION( Dali::WidgetView, WidgetView, "widgetStateFaulted", BOOLEAN, WIDGET_STATE_FAULTED )
83 DALI_PROPERTY_REGISTRATION( Dali::WidgetView, WidgetView, "permanentDelete", BOOLEAN, PERMANENT_DELETE )
86 // ToDo it should be changed public property.
87 const int TERMINATE_WIDGET = Dali::WidgetView::WidgetView::Property::PERMANENT_DELETE+1;
88 const int RETRY_TEXT = TERMINATE_WIDGET+1;
89 const int WIDGET_IMAGE = RETRY_TEXT+1;
91 Dali::PropertyRegistration internalProperty1( typeRegistration, "terminateWidget", TERMINATE_WIDGET, Property::BOOLEAN, Dali::WidgetView::Internal::WidgetView::SetProperty, Dali::WidgetView::Internal::WidgetView::GetProperty );
92 Dali::PropertyRegistration internalProperty2( typeRegistration, "retryText", RETRY_TEXT, Property::MAP, Dali::WidgetView::Internal::WidgetView::SetProperty, Dali::WidgetView::Internal::WidgetView::GetProperty );
93 Dali::PropertyRegistration internalProperty3( typeRegistration, "widgetImage", WIDGET_IMAGE, Property::MAP, Dali::WidgetView::Internal::WidgetView::SetProperty, Dali::WidgetView::Internal::WidgetView::GetProperty );
96 DALI_SIGNAL_REGISTRATION( Dali::WidgetView, WidgetView, "widgetAdded", SIGNAL_WIDGET_ADDED )
97 DALI_SIGNAL_REGISTRATION( Dali::WidgetView, WidgetView, "widgetDeleted", SIGNAL_WIDGET_DELETED )
98 DALI_SIGNAL_REGISTRATION( Dali::WidgetView, WidgetView, "widgetCreationAborted", SIGNAL_WIDGET_CREATION_ABORTED )
99 DALI_SIGNAL_REGISTRATION( Dali::WidgetView, WidgetView, "widgetContentUpdated", SIGNAL_WIDGET_CONTENT_UPDATED )
100 DALI_SIGNAL_REGISTRATION( Dali::WidgetView, WidgetView, "widgetUpdatePeriodChanged", SIGNAL_WIDGET_UPDATE_PERIOD_CHANGED )
101 DALI_SIGNAL_REGISTRATION( Dali::WidgetView, WidgetView, "widgetFaulted", SIGNAL_WIDGET_FAULTED )
102 DALI_SIGNAL_REGISTRATION( Dali::WidgetView, WidgetView, "widgetTerminated", SIGNAL_WIDGET_TERMINATED )
105 DALI_ACTION_REGISTRATION( Dali::WidgetView, WidgetView, "pauseWidget", ACTION_WIDGETVIEW_PAUSE_WIDGET );
106 DALI_ACTION_REGISTRATION( Dali::WidgetView, WidgetView, "resumeWidget", ACTION_WIDGETVIEW_RESUME_WIDGET );
107 DALI_ACTION_REGISTRATION( Dali::WidgetView, WidgetView, "cancelTouchEvent", ACTION_WIDGETVIEW_CANCEL_TOUCH_EVENT );
108 DALI_ACTION_REGISTRATION( Dali::WidgetView, WidgetView, "activateFaultedWidget", ACTION_WIDGETVIEW_ACTIVATE_FAULTED_WIDGET );
110 DALI_TYPE_REGISTRATION_END()
112 struct wl_buffer* preBuffer;
113 struct tizen_remote_surface* remoteSurface;
115 const char* const STATE_TEXT( "stateText" );
116 const char* const FONT_STYLE( "fontStyle" );
117 const char* const TEXT_POINT_SIZE( "textPointSize" );
118 const char* const TEXT_COLOR( "textColor" );
119 const char* const TEXT_VISIBLE( "textVisible" ); //ToDo: it should be removed after retry text property is public one
121 // ToDo: Now dali provides only dali key codes.
122 // This funtion will be used to get platform specific key codes from key name
126 xkb_keycode_t keyCode;
130 static void FindKeyCode( struct xkb_keymap* keyMap, xkb_keycode_t key, void* data )
132 KeyCodeMap* foundKeyCode = static_cast< KeyCodeMap* >( data );
133 if( foundKeyCode->isKeyCode )
138 xkb_keysym_t keySym = foundKeyCode->keySym;
140 const xkb_keysym_t* symsOut = NULL;
142 nsyms = xkb_keymap_key_get_syms_by_level( keyMap, key, 0, 0, &symsOut );
144 if( nsyms && symsOut )
146 if( *symsOut == keySym )
148 foundKeyCode->keyCode = key;
149 foundKeyCode->isKeyCode = true;
154 static bool GetKeyCode( std::string keyName, int32_t& keyCode )
156 xkb_keymap* keyMap = NULL;
157 Ecore_Wl_Input* ecoreWlInput = NULL;
158 xkb_keysym_t sym = XKB_KEY_NoSymbol;
159 KeyCodeMap foundKeyCode;
161 ecoreWlInput = ecore_wl_input_get();
164 DALI_LOG_ERROR( "Failed to get Ecore_Wl_Input in WidgetView\n" );
168 keyMap = ecore_wl_input_keymap_get( ecoreWlInput );
171 DALI_LOG_ERROR( "Failed to get keymap in WidgetView\n" );
175 sym = xkb_keysym_from_name( keyName.c_str(), XKB_KEYSYM_NO_FLAGS );
176 if( sym == XKB_KEY_NoSymbol )
178 DALI_LOG_ERROR( "Failed to get keysym in WidgetView\n" );
182 foundKeyCode.keySym = sym;
183 foundKeyCode.isKeyCode = false;
184 xkb_keymap_key_for_each( keyMap, FindKeyCode, &foundKeyCode );
185 keyCode = static_cast< int32_t >( foundKeyCode.keyCode );
189 static void OnBufferUpdated( struct tizen_remote_surface *surface, uint32_t type, struct wl_buffer *buffer,
190 int32_t img_file_fd, uint32_t img_file_size, uint32_t time, struct wl_array *keys,
191 const char *appid, const char *instance_id, const int pid, void *data)
193 Dali::WidgetView::Internal::WidgetView* widgetView = static_cast< Dali::WidgetView::Internal::WidgetView* >( data );
197 if( !widgetView->IsWidgetImageView() )
199 tizen_remote_surface_transfer_visibility( surface, TIZEN_REMOTE_SURFACE_VISIBILITY_TYPE_VISIBLE);
201 widgetView->CreateWidgetImageView();
202 widgetView->ConnectSignal( surface );
205 //get tbm surface from buffer
206 tbm_surface_h tbmSurface = static_cast< tbm_surface_h >( wl_buffer_get_user_data( buffer ) );
207 widgetView->UpdateImageSource( tbmSurface );
210 if( preBuffer != NULL && tizen_remote_surface_get_version( surface ) >= TIZEN_REMOTE_SURFACE_RELEASE_SINCE_VERSION )
212 tizen_remote_surface_release( surface, preBuffer );
213 tbm_surface_h preTbmSurface = (tbm_surface_h)wl_buffer_get_user_data( preBuffer );
214 tbm_surface_internal_unref( preTbmSurface );
215 wl_buffer_destroy( preBuffer );
218 remoteSurface = surface;
221 close( img_file_fd );
224 static void OnBufferAdded( const char *appid, const char *instance_id, const int pid, void *data )
228 static void OnSurfaceRemoved( const char *appid, const char *instance_id, const int pid, void *data )
230 Dali::WidgetView::Internal::WidgetView* widgetView = static_cast< Dali::WidgetView::Internal::WidgetView* >( data );
232 if( widgetView && !widgetView->IsWidgetFaulted() )
234 widgetView->CloseRemoteSurface();
235 widgetView->RemoveWidgetImage();
239 } // unnamed namespace
241 Dali::WidgetView::WidgetView WidgetView::New( const std::string& widgetId, const std::string& contentInfo, int width, int height, float updatePeriod )
243 // Create the implementation, temporarily owned on stack
244 IntrusivePtr< WidgetView > internalWidgetView = new WidgetView( widgetId, contentInfo, width, height, updatePeriod );
246 // Pass ownership to CustomActor
247 Dali::WidgetView::WidgetView widgetView( *internalWidgetView );
249 // Second-phase init of the implementation
250 // This can only be done after the CustomActor connection has been made...
251 internalWidgetView->Initialize();
256 WidgetView::WidgetView()
257 : Control( ControlBehaviour( REQUIRES_TOUCH_EVENTS ) ),
265 mUpdatePeriod( 0.0 ),
266 mPreviewVisible( true ),
267 mLoadingTextVisible( true ),
268 mLoadingTextString(),
269 mRetryTextVisible( true ),
271 mRetryState( false ),
272 mPermanentDelete( false ),
273 mWatcherHandle( NULL ),
274 mRemoteSurface( NULL )
278 WidgetView::WidgetView( const std::string& widgetId, const std::string& contentInfo, int width, int height, float updatePeriod )
279 : Control( ControlBehaviour( REQUIRES_TOUCH_EVENTS ) ),
280 mWidgetId( widgetId ),
282 mContentInfo( contentInfo ),
287 mUpdatePeriod( updatePeriod ),
288 mPreviewVisible( true ),
289 mLoadingTextVisible( true ),
290 mLoadingTextString(),
291 mRetryTextVisible( true ),
293 mRetryState( false ),
294 mPermanentDelete( false ),
295 mWatcherHandle( NULL ),
296 mRemoteSurface( NULL )
300 WidgetView::~WidgetView()
304 bool WidgetView::PauseWidget()
306 int ret = widget_instance_pause( mInstanceId.c_str() );
309 DALI_LOG_ERROR( "WidgetView::PauseWidget: Fail to pause widget(%s, %s) [%d]\n", mWidgetId.c_str(), mInstanceId.c_str(), ret );
313 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::PauseWidget: Widget is paused (%s, %s)\n", mWidgetId.c_str(), mInstanceId.c_str() );
318 bool WidgetView::ResumeWidget()
320 int ret = widget_instance_resume( mInstanceId.c_str() );
323 DALI_LOG_ERROR( "WidgetView::ResumeWidget: Fail to resume widget(%s, %s) [%d]\n", mWidgetId.c_str(), mInstanceId.c_str(), ret );
327 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::ResumeWidget: Widget is resumed (%s, %s)\n", mWidgetId.c_str(), mInstanceId.c_str() );
332 const std::string& WidgetView::GetWidgetId() const
337 const std::string& WidgetView::GetInstanceId() const
342 const std::string& WidgetView::GetContentInfo()
344 widget_instance_h instance;
345 char* contentInfo = NULL;
347 mContentInfo.clear();
349 if( mWidgetId.empty() || mInstanceId.empty() )
351 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::GetContentInfo: Widget id (%s) or instance id (%s) is invalid.\n", mWidgetId.c_str(), mInstanceId.c_str() );
355 instance = widget_instance_get_instance( mWidgetId.c_str(), mInstanceId.c_str() );
358 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::GetContentInfo: widget_instance_get_instance is failed. [%s]\n", mInstanceId.c_str() );
362 if( widget_instance_get_content( instance, &contentInfo ) < 0 )
364 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::GetContentInfo: Failed to get content of widget. [%s]\n", mInstanceId.c_str() );
368 mContentInfo = reinterpret_cast< char* >( contentInfo );
373 const std::string& WidgetView::GetTitle()
375 //ToDo: We should add some codes by considering widget_viewer_evas
378 mTitle = widget_service_get_name( mWidgetId.c_str(), NULL );
381 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::GetTitle: title = %s\n", mTitle.c_str() );
386 float WidgetView::GetUpdatePeriod() const
388 return mUpdatePeriod;
391 bool WidgetView::CancelTouchEvent()
395 tizen_remote_surface_transfer_touch_cancel( mRemoteSurface );
402 void WidgetView::SetPreviewVisible( bool visible )
404 if( mPreviewImage && mPreviewVisible != visible )
406 mPreviewVisible = visible;
407 mPreviewImage.SetVisible( visible );
411 bool WidgetView::IsPreviewVisible()
413 return mPreviewVisible;
416 void WidgetView::SetLoadingTextVisible( bool visible )
418 if( mLoadingText && mLoadingTextVisible != visible )
420 mLoadingTextVisible = visible;
424 mLoadingText.SetProperty( Toolkit::TextLabel::Property::TEXT,
425 ( mLoadingTextString.empty() )? GET_LOCALE_TEXT( "IDS_ST_POP_LOADING_ING" ) : mLoadingTextString );
427 mLoadingText.SetVisible( visible );
431 void WidgetView::SetRetryTextVisible( bool visible )
433 if( mRetryText && mRetryTextVisible != visible )
435 mRetryTextVisible = visible;
439 mRetryText.SetProperty( Toolkit::TextLabel::Property::TEXT,
440 ( mRetryTextString.empty() )? GET_LOCALE_TEXT( "IDS_HS_BODY_UNABLE_TO_LOAD_DATA_TAP_TO_RETRY" ) : mRetryTextString );
442 mRetryText.SetVisible( visible );
446 bool WidgetView::IsLoadingTextVisible()
448 return mLoadingTextVisible;
451 bool WidgetView::IsRetryTextVisible()
453 return mRetryTextVisible;
456 void WidgetView::ActivateFaultedWidget()
460 // Enable preview and loading text
461 ShowRetryState( false );
462 ShowLoadingState( true );
464 // launch widget again
465 mPid = widget_instance_launch( mInstanceId.c_str(), (char *)mContentInfo.c_str(), mWidth, mHeight );
468 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::ActivateFaultedWidget: widget_instance_launch is failed. [%s]\n", mWidgetId.c_str() );
470 ShowLoadingState( false );
471 ShowRetryState( true );
474 Dali::WidgetView::WidgetView handle( GetOwner() );
475 mWidgetCreationAbortedSignal.Emit( handle );
480 screen_connector_toolkit_ops ops;
481 ops.updated_cb = OnBufferUpdated;
482 ops.removed_cb = OnSurfaceRemoved;
483 ops.added_cb = OnBufferAdded;
484 mWatcherHandle = screen_connector_toolkit_add(&ops, (char *)mInstanceId.c_str(), SCREEN_CONNECTOR_SCREEN_TYPE_WIDGET, this);
486 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::ActivateFaultedWidget: widget_instance_launch is called. [%s, mPid = %d]\n", mWidgetId.c_str(), mPid );
490 bool WidgetView::IsWidgetFaulted()
492 return mPid < 0 ? true : false;
495 void WidgetView::SetPermanentDelete( bool permanentDelete )
497 mPermanentDelete = permanentDelete;
500 bool WidgetView::IsPermanentDelete()
502 return mPermanentDelete;
505 void WidgetView::CreateWidgetImageView()
508 mImageSource = Dali::NativeImageSource::New( source );
509 Dali::NativeImage image = Dali::NativeImage::New( *mImageSource );
511 mWidgetImageView = Dali::Toolkit::ImageView::New( image );
513 mWidgetImageView.SetParentOrigin( ParentOrigin::CENTER );
514 mWidgetImageView.SetAnchorPoint( AnchorPoint::CENTER );
515 mWidgetImageView.SetSize( mWidth, mHeight );
517 if( !mWidgetImagePropertyMap.Empty() )
519 mWidgetImageView.SetProperty( Toolkit::ImageView::Property::IMAGE, mWidgetImagePropertyMap );
522 Self().Add( mWidgetImageView );
524 //EFL app should be pre multiplied image.
525 mWidgetImageView.SetProperty( Toolkit::ImageView::Property::PRE_MULTIPLIED_ALPHA, true );
527 // Disable preview and text
528 ShowLoadingState( false );
531 Dali::WidgetView::WidgetView handle( GetOwner() );
532 mWidgetAddedSignal.Emit( handle );
534 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::CreateWidgetImageView: Widget image is added.\n" );
537 void WidgetView::RemoveWidgetImage()
539 if( mWidgetImageView )
541 mWidgetImageView.SetVisible( false );
542 mWidgetImageView.Reset();
544 ShowRetryState( true );
546 Dali::WidgetView::WidgetView handle( GetOwner() );
547 mWidgetDeletedSignal.Emit( handle );
550 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::RemoveWidgetImage: Widget image is removed.\n" );
553 void WidgetView::TerminateWidget()
555 if( !mWidgetId.empty() && !mInstanceId.empty() )
557 widget_instance_terminate( mInstanceId.c_str() );
559 if( mPermanentDelete )
561 widget_instance_destroy( mInstanceId.c_str() );
564 Dali::WidgetView::WidgetView handle( GetOwner() );
565 mWidgetTerminatedSignal.Emit( handle );
566 mWidgetDeletedSignal.Emit( handle );
571 CloseRemoteSurface();
574 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::TerminateWidget: Widget is terminated/destroyed and deleted signal is emitted.\n" );
578 void WidgetView::SendWidgetEvent( int event )
580 Dali::WidgetView::WidgetView handle( GetOwner() );
582 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::SendWidgetEvent: event = %d widget = %s\n", event, mWidgetId.c_str() );
587 case WIDGET_INSTANCE_EVENT_UPDATE:
588 case WIDGET_INSTANCE_EVENT_EXTRA_UPDATED:
590 mWidgetContentUpdatedSignal.Emit( handle );
593 case WIDGET_INSTANCE_EVENT_PERIOD_CHANGED:
595 mWidgetUpdatePeriodChangedSignal.Emit( handle );
598 case WIDGET_INSTANCE_EVENT_FAULT:
600 mWidgetFaultedSignal.Emit( handle );
601 CloseRemoteSurface();
612 bool WidgetView::DoConnectSignal( BaseObject* object, ConnectionTrackerInterface* tracker, const std::string& signalName, FunctorDelegate* functor )
614 Dali::BaseHandle handle( object );
616 bool connected( true );
617 Dali::WidgetView::WidgetView widgetView = Dali::WidgetView::WidgetView::DownCast( handle );
619 if( strcmp( signalName.c_str(), SIGNAL_WIDGET_ADDED ) == 0 )
621 widgetView.WidgetAddedSignal().Connect( tracker, functor );
623 else if( strcmp( signalName.c_str(), SIGNAL_WIDGET_DELETED ) == 0 )
625 widgetView.WidgetDeletedSignal().Connect( tracker, functor );
627 else if( strcmp( signalName.c_str(), SIGNAL_WIDGET_CREATION_ABORTED ) == 0 )
629 widgetView.WidgetCreationAbortedSignal().Connect( tracker, functor );
631 else if( strcmp( signalName.c_str(), SIGNAL_WIDGET_CONTENT_UPDATED ) == 0 )
633 widgetView.WidgetContentUpdatedSignal().Connect( tracker, functor );
635 else if( strcmp( signalName.c_str(), SIGNAL_WIDGET_UPDATE_PERIOD_CHANGED ) == 0 )
637 widgetView.WidgetUpdatePeriodChangedSignal().Connect( tracker, functor );
639 else if( strcmp( signalName.c_str(), SIGNAL_WIDGET_FAULTED ) == 0 )
641 widgetView.WidgetFaultedSignal().Connect( tracker, functor );
645 // signalName does not match any signal
652 bool WidgetView::DoAction( BaseObject* object, const std::string& actionName, const Property::Map& attributes )
656 Dali::BaseHandle handle( object );
657 Dali::WidgetView::WidgetView widgetView = Dali::WidgetView::WidgetView::DownCast( handle );
664 WidgetView& impl = GetImplementation( widgetView );
666 if( strcmp( actionName.c_str(), ACTION_WIDGETVIEW_PAUSE_WIDGET ) == 0 )
670 else if( strcmp( actionName.c_str(), ACTION_WIDGETVIEW_RESUME_WIDGET ) == 0 )
674 else if( strcmp( actionName.c_str(), ACTION_WIDGETVIEW_CANCEL_TOUCH_EVENT ) == 0 )
676 impl.CancelTouchEvent();
678 else if( strcmp( actionName.c_str(), ACTION_WIDGETVIEW_ACTIVATE_FAULTED_WIDGET ) == 0 )
680 impl.ActivateFaultedWidget();
690 void WidgetView::SetProperty( BaseObject* object, Property::Index index, const Property::Value& value )
692 Dali::WidgetView::WidgetView widgetView = Dali::WidgetView::WidgetView::DownCast( Dali::BaseHandle( object ) );
696 WidgetView& impl = GetImplementation( widgetView );
700 case Dali::WidgetView::WidgetView::Property::PREVIEW:
704 if( value.Get( previewEnabled ) )
706 impl.SetPreviewVisible( previewEnabled );
710 case Dali::WidgetView::WidgetView::Property::LOADING_TEXT:
715 if( value.Get( textEnabled ) )
717 impl.SetLoadingTextVisible( textEnabled );
719 else if( value.Get( map ) )
721 impl.SetLoadingTextPropertyMap( map );
725 case Dali::WidgetView::WidgetView::Property::PERMANENT_DELETE:
728 if( value.Get( permanent ) )
730 impl.SetPermanentDelete( permanent );
734 case TERMINATE_WIDGET:
737 if( value.Get( del ) && del )
739 impl.TerminateWidget();
747 if( value.Get( map ) )
749 impl.SetRetryTextPropertyMap( map );
756 if( value.Get( map ) )
758 impl.SetWidgetImagePropertyMap( map );
766 Property::Value WidgetView::GetProperty( BaseObject* object, Property::Index index )
768 Property::Value value;
769 Dali::WidgetView::WidgetView widgetView = Dali::WidgetView::WidgetView::DownCast( Dali::BaseHandle( object ) );
773 WidgetView& impl = GetImplementation( widgetView );
777 case Dali::WidgetView::WidgetView::Property::WIDGET_ID:
779 value = impl.GetWidgetId();
782 case Dali::WidgetView::WidgetView::Property::INSTANCE_ID:
784 value = impl.GetInstanceId();
787 case Dali::WidgetView::WidgetView::Property::CONTENT_INFO:
789 value = impl.GetContentInfo();
792 case Dali::WidgetView::WidgetView::Property::TITLE:
794 value = impl.GetTitle();
797 case Dali::WidgetView::WidgetView::Property::UPDATE_PERIOD:
799 value = impl.GetUpdatePeriod();
802 case Dali::WidgetView::WidgetView::Property::PREVIEW:
804 value = impl.IsPreviewVisible();
807 case Dali::WidgetView::WidgetView::Property::LOADING_TEXT:
809 value = impl.IsLoadingTextVisible();
812 case Dali::WidgetView::WidgetView::Property::WIDGET_STATE_FAULTED:
814 value = impl.IsWidgetFaulted();
817 case Dali::WidgetView::WidgetView::Property::PERMANENT_DELETE:
819 value = impl.IsPermanentDelete();
828 Dali::WidgetView::WidgetView::WidgetViewSignalType& WidgetView::WidgetAddedSignal()
830 return mWidgetAddedSignal;
833 Dali::WidgetView::WidgetView::WidgetViewSignalType& WidgetView::WidgetDeletedSignal()
835 return mWidgetDeletedSignal;
838 Dali::WidgetView::WidgetView::WidgetViewSignalType& WidgetView::WidgetCreationAbortedSignal()
840 return mWidgetCreationAbortedSignal;
843 Dali::WidgetView::WidgetView::WidgetViewSignalType& WidgetView::WidgetContentUpdatedSignal()
845 return mWidgetContentUpdatedSignal;
848 Dali::WidgetView::WidgetView::WidgetViewSignalType& WidgetView::WidgetUpdatePeriodChangedSignal()
850 return mWidgetUpdatePeriodChangedSignal;
853 Dali::WidgetView::WidgetView::WidgetViewSignalType& WidgetView::WidgetFaultedSignal()
855 return mWidgetFaultedSignal;
858 Dali::WidgetView::WidgetView::WidgetViewSignalType& WidgetView::WidgetTerminatedSignal()
860 return mWidgetTerminatedSignal;
863 void WidgetView::OnInitialize()
865 char* instanceId = NULL;
866 char* previewPath = NULL;
867 std::string previewImage;
868 widget_size_type_e sizeType;
869 screen_connector_toolkit_ops ops;
871 int ret = widget_instance_create( mWidgetId.c_str(), &instanceId );
872 if( ret < 0 || !instanceId )
874 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::OnInitialize: widget_instance_create is failed [%s].\n", mWidgetId.c_str() );
878 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::OnInitialize: widget_instance_create is called. [widget id = %s, instance id = %s]\n",
879 mWidgetId.c_str(), instanceId );
881 mInstanceId = instanceId;
884 widget_service_get_size_type( mWidth, mHeight, &sizeType );
886 previewPath = widget_service_get_preview_image_path( mWidgetId.c_str(), sizeType );
889 previewImage = previewPath;
894 previewImage = WIDGET_VIEW_RESOURCE_DEFAULT_IMG;
897 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::OnInitialize: preview image path = %s\n", previewImage.c_str() );
900 mPreviewActor = Dali::Actor::New();
901 mPreviewActor.SetParentOrigin( ParentOrigin::CENTER );
902 mPreviewActor.SetAnchorPoint( AnchorPoint::CENTER );
903 mPreviewActor.SetResizePolicy( ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS );
905 mPreviewImage = Toolkit::ImageView::New( previewImage );
906 mPreviewImage.SetParentOrigin( ParentOrigin::CENTER );
907 mPreviewImage.SetAnchorPoint( AnchorPoint::CENTER );
908 mPreviewImage.SetResizePolicy( ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS );
910 Self().SetResizePolicy( ResizePolicy::FIXED, Dimension::ALL_DIMENSIONS );
911 Self().SetSize( mWidth, mHeight );
913 Self().Add( mPreviewActor );
914 mPreviewActor.Add( mPreviewImage );
916 mStateTextActor = Dali::Actor::New();
917 mStateTextActor.SetParentOrigin( ParentOrigin::CENTER );
918 mStateTextActor.SetAnchorPoint( AnchorPoint::CENTER );
919 mStateTextActor.SetResizePolicy( ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS );
922 mLoadingText = Toolkit::TextLabel::New( ( mLoadingTextString.empty() )? GET_LOCALE_TEXT( "IDS_ST_POP_LOADING_ING" ) : mLoadingTextString );
923 mLoadingText.SetParentOrigin( ParentOrigin::CENTER );
924 mLoadingText.SetAnchorPoint( AnchorPoint::CENTER );
925 mLoadingText.SetProperty( Toolkit::TextLabel::Property::HORIZONTAL_ALIGNMENT, "CENTER" );
926 mLoadingText.SetProperty( Toolkit::TextLabel::Property::VERTICAL_ALIGNMENT, "CENTER" );
927 mLoadingText.SetProperty( Toolkit::TextLabel::Property::TEXT_COLOR, Dali::Color::WHITE );
928 mLoadingText.SetProperty( Toolkit::TextLabel::Property::FONT_STYLE, "Bold" );
929 mLoadingText.SetProperty( Toolkit::TextLabel::Property::POINT_SIZE, TextPixelToPointSize( DEFAULT_FONT_PIXEL_SIZE ) );
931 mPreviewActor.Add( mStateTextActor );
932 mStateTextActor.Add( mLoadingText );
935 mRetryText = Toolkit::TextLabel::New( ( mRetryTextString.empty() )? GET_LOCALE_TEXT( "IDS_HS_BODY_UNABLE_TO_LOAD_DATA_TAP_TO_RETRY" ) : mRetryTextString );
936 mRetryText.SetParentOrigin( ParentOrigin::CENTER );
937 mRetryText.SetAnchorPoint( AnchorPoint::CENTER );
938 mRetryText.SetProperty( Toolkit::TextLabel::Property::HORIZONTAL_ALIGNMENT, "CENTER" );
939 mRetryText.SetProperty( Toolkit::TextLabel::Property::VERTICAL_ALIGNMENT, "CENTER" );
940 mRetryText.SetProperty( Toolkit::TextLabel::Property::TEXT_COLOR, Dali::Color::WHITE );
941 mRetryText.SetProperty( Toolkit::TextLabel::Property::FONT_STYLE, "Bold" );
942 mRetryText.SetProperty( Toolkit::TextLabel::Property::POINT_SIZE, TextPixelToPointSize( DEFAULT_FONT_PIXEL_SIZE ) );
944 mStateTextActor.Add( mRetryText );
945 mRetryText.SetVisible( false );
948 mPid = widget_instance_launch( instanceId, (char *)mContentInfo.c_str(), mWidth, mHeight );
952 ShowLoadingState( false );
953 ShowRetryState( true );
955 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::OnInitialize: widget_instance_launch is failed. [%s]\n", mWidgetId.c_str() );
958 Dali::WidgetView::WidgetView handle( GetOwner() );
959 mWidgetCreationAbortedSignal.Emit( handle );
964 ops.updated_cb = OnBufferUpdated;
965 ops.removed_cb = OnSurfaceRemoved;
966 ops.added_cb = OnBufferAdded;
967 mWatcherHandle = screen_connector_toolkit_add(&ops, (char *)instanceId, SCREEN_CONNECTOR_SCREEN_TYPE_WIDGET, this);
968 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::OnInitialize: widget_instance_launch is called. [%s, mPid = %d]\n", mWidgetId.c_str(), mPid );
972 void WidgetView::OnStageConnection( int depth )
974 Control::OnStageConnection( depth );
977 void WidgetView::OnStageDisconnection()
979 Control::OnStageDisconnection();
982 void WidgetView::OnSizeSet( const Vector3& targetSize )
984 if( mWidgetImageView )
986 mWidgetImageView.SetSize( targetSize );
990 bool WidgetView::IsWidgetImageView()
992 return ( mWidgetImageView )? true: false;
995 void WidgetView::UpdateImageSource( tbm_surface_h source )
997 mImageSource = Dali::NativeImageSource::New( source );
998 Dali::NativeImage image = Dali::NativeImage::New( *mImageSource );
1000 if( mWidgetImageView )
1002 mWidgetImageView.SetImage( image );
1003 mWidgetImageView.SetProperty( Toolkit::ImageView::Property::PRE_MULTIPLIED_ALPHA, true );
1007 void WidgetView::ConnectSignal( tizen_remote_surface* surface )
1009 if( mWidgetImageView && surface )
1011 mRemoteSurface = surface;
1013 Self().TouchSignal().Connect( this, &WidgetView::OnTouch );
1014 Self().WheelEventSignal().Connect( this, &WidgetView::OnWheelEvent );
1018 bool WidgetView::OnTouch( Dali::Actor actor, const Dali::TouchData& event )
1020 if( event.GetPointCount() == 0 )
1025 if( mRemoteSurface == NULL )
1030 DevelDevice::Class::Type deviceType = DevelTouchData::GetDeviceClass( event, 0 );
1031 if( deviceType == DevelDevice::Class::MOUSE )
1033 return MouseEvent( event );
1035 else if( deviceType == DevelDevice::Class::TOUCH )
1037 return TouchEvent( event );
1043 bool WidgetView::OnWheelEvent( Dali::Actor actor, const Dali::WheelEvent& event )
1045 if( mRemoteSurface == NULL )
1049 //ToDo: We should check TIZEN_INPUT_DEVICE_CLAS_MOUSE
1050 tizen_remote_surface_transfer_mouse_wheel( mRemoteSurface,
1053 TIZEN_INPUT_DEVICE_CLAS_MOUSE,
1054 TIZEN_INPUT_DEVICE_SUBCLAS_NONE,
1061 bool WidgetView::OnKeyEvent( const Dali::KeyEvent& event )
1063 if( mRemoteSurface == NULL )
1068 tizen_remote_surface_event_type type = TIZEN_REMOTE_SURFACE_EVENT_TYPE_NONE;
1070 switch( event.state )
1072 case Dali::KeyEvent::Down:
1074 type = TIZEN_REMOTE_SURFACE_EVENT_TYPE_KEY_DOWN;
1077 case Dali::KeyEvent::Up:
1079 type = TIZEN_REMOTE_SURFACE_EVENT_TYPE_KEY_UP;
1082 case Dali::KeyEvent::Last:
1093 if( GetKeyCode( event.keyPressedName, keyCode ) == false )
1098 tizen_remote_surface_transfer_key_event( mRemoteSurface,
1101 Dali::DevelKeyEvent::GetDeviceClass( event ),
1102 Dali::DevelKeyEvent::GetDeviceSubclass( event ),
1104 static_cast< uint32_t >( event.time )
1110 Vector3 WidgetView::GetNaturalSize()
1116 if( size.x > 0 && size.y > 0 )
1118 size.z = std::min( size.x, size.y );
1123 return Control::GetNaturalSize();
1127 float WidgetView::GetHeightForWidth( float width )
1129 if( mWidth > 0 && mHeight > 0 )
1131 return GetHeightForWidthBase( width );
1135 return Control::GetHeightForWidthBase( width );
1139 float WidgetView::GetWidthForHeight( float height )
1141 if( mWidth > 0 && mHeight > 0 )
1143 return GetWidthForHeightBase( height );
1147 return Control::GetWidthForHeightBase( height );
1151 void WidgetView::CloseRemoteSurface()
1153 if( mWatcherHandle != NULL )
1155 if( remoteSurface != NULL && preBuffer != NULL && tizen_remote_surface_get_version( remoteSurface ) >= TIZEN_REMOTE_SURFACE_RELEASE_SINCE_VERSION )
1157 tizen_remote_surface_release( remoteSurface, preBuffer );
1158 tbm_surface_h preTbmSurface = (tbm_surface_h)wl_buffer_get_user_data( preBuffer );
1159 tbm_surface_internal_unref( preTbmSurface );
1160 wl_buffer_destroy( preBuffer );
1164 screen_connector_toolkit_remove( mWatcherHandle );
1165 mWatcherHandle = NULL;
1166 mRemoteSurface = NULL;
1171 void WidgetView::ShowLoadingState( bool show )
1173 if( mPreviewImage && mPreviewVisible )
1175 mPreviewImage.SetVisible( show );
1178 if( mLoadingText && mLoadingTextVisible )
1180 mLoadingText.SetProperty( Toolkit::TextLabel::Property::TEXT,
1181 ( mLoadingTextString.empty() )? GET_LOCALE_TEXT( "IDS_ST_POP_LOADING_ING" ) : mLoadingTextString );
1182 mLoadingText.SetVisible( show );
1186 void WidgetView::ShowRetryState( bool show )
1188 if( mPreviewImage && mPreviewVisible )
1190 mPreviewImage.SetVisible( false );
1193 if( mRetryText && mRetryTextVisible )
1195 mRetryText.SetProperty( Toolkit::TextLabel::Property::TEXT,
1196 ( mRetryTextString.empty() )? GET_LOCALE_TEXT( "IDS_HS_BODY_UNABLE_TO_LOAD_DATA_TAP_TO_RETRY" ) : mRetryTextString );
1197 mRetryText.SetVisible( show );
1202 void WidgetView::SetLoadingTextPropertyMap( Property::Map map )
1206 Property::Value* loadingText = map.Find( STATE_TEXT );
1208 if( loadingText && loadingText->Get( text ) )
1210 mLoadingText.SetProperty( Toolkit::TextLabel::Property::TEXT, text );
1211 mLoadingTextString = text;
1214 Property::Value* fontStyle = map.Find( FONT_STYLE );
1217 if( fontStyle && fontStyle->Get( style ) )
1219 mLoadingText.SetProperty( Toolkit::TextLabel::Property::FONT_STYLE, style );
1222 Property::Value* textPointSize = map.Find( TEXT_POINT_SIZE );
1225 if( textPointSize && textPointSize->Get( size ) )
1227 mLoadingText.SetProperty( Toolkit::TextLabel::Property::POINT_SIZE, size );
1230 Property::Value* textColor = map.Find( TEXT_COLOR );
1233 if( textColor && textColor->Get( color ) )
1235 mLoadingText.SetProperty( Toolkit::TextLabel::Property::TEXT_COLOR, color );
1240 void WidgetView::SetRetryTextPropertyMap( Property::Map map )
1244 Property::Value* retryText = map.Find( STATE_TEXT );
1246 if( retryText && retryText->Get( text ) )
1248 mRetryText.SetProperty( Toolkit::TextLabel::Property::TEXT, text );
1249 mRetryTextString = text;
1252 Property::Value* fontStyle = map.Find( FONT_STYLE );
1255 if( fontStyle && fontStyle->Get( style ) )
1257 mRetryText.SetProperty( Toolkit::TextLabel::Property::FONT_STYLE, style );
1260 Property::Value* textPointSize = map.Find( TEXT_POINT_SIZE );
1263 if( textPointSize && textPointSize->Get( size ) )
1265 mRetryText.SetProperty( Toolkit::TextLabel::Property::POINT_SIZE, size );
1268 Property::Value* textColor = map.Find( TEXT_COLOR );
1270 if( textColor && textColor->Get( color ) )
1272 mRetryText.SetProperty( Toolkit::TextLabel::Property::TEXT_COLOR, color );
1275 Property::Value* textVisible = map.Find( TEXT_VISIBLE );
1276 bool visible = true;
1277 if( textVisible && textVisible->Get( visible ) )
1279 SetRetryTextVisible( visible );
1284 void WidgetView::SetWidgetImagePropertyMap( Property::Map map )
1286 mWidgetImagePropertyMap = map;
1287 if( mWidgetImageView )
1289 mWidgetImageView.SetProperty( Toolkit::ImageView::Property::IMAGE, map );
1293 float WidgetView::TextPixelToPointSize( int pixelSize )
1295 Dali::Vector2 dpi = Dali::Stage::GetCurrent().GetDpi();
1296 float meanDpi = (dpi.height + dpi.width) / 2.0f;
1298 return (pixelSize * 72.0f) / meanDpi;
1301 void WidgetView::MouseIn( const Dali::TouchData& event )
1303 Vector2 localPos = event.GetLocalPosition( 0 );
1305 tizen_remote_surface_transfer_mouse_event( mRemoteSurface,
1306 TIZEN_REMOTE_SURFACE_EVENT_TYPE_MOUSE_IN,
1315 TIZEN_INPUT_DEVICE_CLAS_MOUSE,
1316 DevelTouchData::GetDeviceSubclass( event, 0 ),
1322 void WidgetView::MouseOut( const Dali::TouchData& event )
1324 tizen_remote_surface_transfer_mouse_event( mRemoteSurface,
1325 TIZEN_REMOTE_SURFACE_EVENT_TYPE_MOUSE_OUT,
1334 TIZEN_INPUT_DEVICE_CLAS_MOUSE,
1335 DevelTouchData::GetDeviceSubclass( event, 0 ),
1341 bool WidgetView::MouseEvent( const Dali::TouchData& event )
1343 tizen_remote_surface_event_type type = TIZEN_REMOTE_SURFACE_EVENT_TYPE_NONE;
1346 switch( event.GetState( 0 ) )
1348 case Dali::PointState::UP:
1350 type = TIZEN_REMOTE_SURFACE_EVENT_TYPE_MOUSE_UP;
1354 ActivateFaultedWidget();
1360 case Dali::PointState::DOWN:
1362 type = TIZEN_REMOTE_SURFACE_EVENT_TYPE_MOUSE_DOWN;
1367 case Dali::PointState::MOTION:
1369 type = TIZEN_REMOTE_SURFACE_EVENT_TYPE_MOUSE_MOVE;
1379 Vector2 localPos = event.GetLocalPosition( 0 );
1381 tizen_remote_surface_transfer_mouse_event( mRemoteSurface,
1387 wl_fixed_from_double( event.GetEllipseRadius( 0 ).x ),
1388 wl_fixed_from_double( event.GetEllipseRadius( 0 ).y ),
1389 wl_fixed_from_double( event.GetPressure( 0 ) ),
1390 wl_fixed_from_double( event.GetAngle( 0 ).degree ),
1391 TIZEN_INPUT_DEVICE_CLAS_MOUSE,
1392 DevelTouchData::GetDeviceSubclass( event, 0 ),
1397 if( event.GetState( 0 ) == Dali::PointState::UP)
1405 bool WidgetView::TouchEvent( const Dali::TouchData& event )
1407 tizen_remote_surface_event_type type = TIZEN_REMOTE_SURFACE_EVENT_TYPE_NONE;
1410 switch( event.GetState( 0 ) )
1412 case Dali::PointState::UP:
1414 type = TIZEN_REMOTE_SURFACE_EVENT_TYPE_TOUCH_UP;
1418 ActivateFaultedWidget();
1424 case Dali::PointState::DOWN:
1426 type = TIZEN_REMOTE_SURFACE_EVENT_TYPE_TOUCH_DOWN;
1430 case Dali::PointState::MOTION:
1432 type = TIZEN_REMOTE_SURFACE_EVENT_TYPE_TOUCH_MOVE;
1442 Vector2 localPos = event.GetLocalPosition( 0 );
1444 tizen_remote_surface_transfer_touch_event( mRemoteSurface,
1450 wl_fixed_from_double( event.GetEllipseRadius( 0 ).x ),
1451 wl_fixed_from_double( event.GetEllipseRadius( 0 ).y ),
1452 wl_fixed_from_double( event.GetPressure( 0 ) ),
1453 wl_fixed_from_double( event.GetAngle( 0 ).degree ),
1454 TIZEN_INPUT_DEVICE_CLAS_TOUCHSCREEN,
1455 DevelTouchData::GetDeviceSubclass( event, 0 ),
1462 } // namespace Internal
1464 } // namespace WidgetView