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 <internal/widget_view/widget_view_impl.h>
24 #include <dali/integration-api/debug.h>
26 #include <widget_service.h>
27 #include <widget_instance.h>
28 #include <tzplatform_config.h>
42 #define WIDGET_VIEW_RESOURCE_DEFAULT_IMG "/widget_viewer_dali/images/unknown.png"
44 #if defined(DEBUG_ENABLED)
45 Integration::Log::Filter* gWidgetViewLogging = Integration::Log::Filter::New( Debug::Verbose, false, "LOG_WIDGET_VIEW" );
48 } // unnamed namespace
50 Dali::WidgetView::WidgetView WidgetView::New( const std::string& widgetId, const std::string& contentInfo, int width, int height, double updatePeriod )
52 // Create the implementation, temporarily owned on stack
53 IntrusivePtr< WidgetView > internalWidgetView = new WidgetView( widgetId, contentInfo, width, height, updatePeriod );
55 // Pass ownership to CustomActor
56 Dali::WidgetView::WidgetView widgetView( *internalWidgetView );
58 // Second-phase init of the implementation
59 // This can only be done after the CustomActor connection has been made...
60 internalWidgetView->Initialize();
65 WidgetView::WidgetView()
66 : Control( ControlBehaviour( REQUIRES_TOUCH_EVENTS ) ),
76 mPreviewEnabled( true ),
77 mStateTextEnabled( true ),
78 mPermanentDelete( true )
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 ),
86 mContentInfo( contentInfo ),
92 mUpdatePeriod( updatePeriod ),
93 mPreviewEnabled( true ),
94 mStateTextEnabled( true ),
95 mPermanentDelete( true )
99 WidgetView::~WidgetView()
101 if( !mWidgetId.empty() && !mInstanceId.empty() )
103 widget_instance_terminate( mInstanceId.c_str() );
105 if( mPermanentDelete )
107 widget_instance_destroy( mInstanceId.c_str() );
113 bundle_free( mBundle );
117 bool WidgetView::PauseWidget()
119 int ret = widget_instance_pause( mInstanceId.c_str() );
122 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::PauseWidget: Fail to pause widget(%s, %s) [%d]\n", mWidgetId.c_str(), mInstanceId.c_str(), ret );
126 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::PauseWidget: Widget is paused (%s, %s)\n", mWidgetId.c_str(), mInstanceId.c_str() );
131 bool WidgetView::ResumeWidget()
133 int ret = widget_instance_resume( mInstanceId.c_str() );
136 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::ResumeWidget: Fail to resume widget(%s, %s) [%d]\n", mWidgetId.c_str(), mInstanceId.c_str(), ret );
140 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::ResumeWidget: Widget is resumed (%s, %s)\n", mWidgetId.c_str(), mInstanceId.c_str() );
145 const std::string& WidgetView::GetWidgetId() const
150 const std::string& WidgetView::GetInstanceId() const
155 const std::string& WidgetView::GetContentInfo()
157 widget_instance_h instance;
158 char* contentInfo = NULL;
160 mContentInfo.clear();
162 if( mWidgetId.empty() || mInstanceId.empty() )
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() );
168 instance = widget_instance_get_instance( mWidgetId.c_str(), mInstanceId.c_str() );
171 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::GetContentInfo: widget_instance_get_instance is failed. [%s]\n", mInstanceId.c_str() );
175 if( widget_instance_get_content( instance, &contentInfo ) < 0 )
177 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::GetContentInfo: Failed to get content of widget. [%s]\n", mInstanceId.c_str() );
181 mContentInfo = reinterpret_cast< char* >( contentInfo );
186 const std::string& WidgetView::GetTitle()
190 mTitle = mObjectView.GetTitle();
193 mTitle = widget_service_get_name( mWidgetId.c_str(), NULL );
197 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::GetTitle: title = %s\n", mTitle.c_str() );
202 double WidgetView::GetUpdatePeriod() const
204 return mUpdatePeriod;
207 void WidgetView::Show()
215 void WidgetView::Hide()
223 bool WidgetView::CancelTouchEvent()
227 return mObjectView.CancelTouchEvent();
233 void WidgetView::SetPreviewEnabled( bool enabled )
235 mPreviewEnabled = enabled;
239 mPreviewImage.SetVisible( enabled );
243 bool WidgetView::GetPreviewEnabled() const
245 return mPreviewEnabled;
248 void WidgetView::SetStateTextEnabled( bool enabled )
250 mStateTextEnabled = enabled;
254 mStateText.SetVisible( enabled );
258 bool WidgetView::GetStateTextEnabled() const
260 return mStateTextEnabled;
263 void WidgetView::ActivateFaultedWidget()
267 // Esable preview and text
268 if( mPreviewEnabled )
270 mPreviewImage.SetVisible( true );
273 if( mStateTextEnabled )
275 mStateText.SetVisible( true );
278 // launch widget again
279 mPid = widget_instance_launch( mInstanceId.c_str(), (char *)mContentInfo.c_str(), mWidth, mHeight );
282 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::ActivateFaultedWidget: widget_instance_launch is failed. [%s]\n", mWidgetId.c_str() );
285 Dali::WidgetView::WidgetView handle( GetOwner() );
286 mWidgetCreationAbortedSignal.Emit( handle );
291 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::ActivateFaultedWidget: widget_instance_launch is called. [%s, mPid = %d]\n", mWidgetId.c_str(), mPid );
295 bool WidgetView::IsWidgetFaulted()
297 return mPid < 0 ? true : false;
300 void WidgetView::SetPermanentDelete( bool permanentDelete )
302 mPermanentDelete = permanentDelete;
305 void WidgetView::AddObjectView( Pepper::ObjectView objectView )
307 mObjectView = objectView;
309 mObjectView.SetParentOrigin( ParentOrigin::CENTER );
310 mObjectView.SetAnchorPoint( AnchorPoint::CENTER );
312 Self().Add( mObjectView );
314 // Disable preview and text
315 if( mPreviewEnabled )
317 mPreviewImage.SetVisible( false );
320 if( mStateTextEnabled )
322 mStateText.SetVisible( false );
326 Dali::WidgetView::WidgetView handle( GetOwner() );
327 mWidgetAddedSignal.Emit( handle );
329 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::AddObjectView: ObjectView is added.\n" );
332 void WidgetView::RemoveObjectView()
334 // Enable preview and text
335 if( mPreviewEnabled )
337 mPreviewImage.SetVisible( true );
340 if( mStateTextEnabled )
342 mStateText.SetVisible( true );
346 Dali::WidgetView::WidgetView handle( GetOwner() );
347 mWidgetDeletedSignal.Emit( handle );
351 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::RemoveObjectView: ObjectView is removed.\n" );
354 void WidgetView::SendWidgetEvent( int event )
356 Dali::WidgetView::WidgetView handle( GetOwner() );
358 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::SendWidgetEvent: event = %d widget = %s\n", event, mWidgetId.c_str() );
363 case WIDGET_INSTANCE_EVENT_UPDATE:
365 mWidgetContentUpdatedSignal.Emit( handle );
368 case WIDGET_INSTANCE_EVENT_PERIOD_CHANGED:
370 mWidgetUpdatePeriodChangedSignal.Emit( handle );
373 case WIDGET_INSTANCE_EVENT_SIZE_CHANGED:
375 mWidgetResizedSignal.Emit( handle );
378 case WIDGET_INSTANCE_EVENT_EXTRA_UPDATED:
380 mWidgetExtraInfoUpdatedSignal.Emit( handle );
383 case WIDGET_INSTANCE_EVENT_FAULT:
385 mWidgetFaultedSignal.Emit( handle );
395 Dali::WidgetView::WidgetView::WidgetViewSignalType& WidgetView::WidgetAddedSignal()
397 return mWidgetAddedSignal;
400 Dali::WidgetView::WidgetView::WidgetViewSignalType& WidgetView::WidgetDeletedSignal()
402 return mWidgetDeletedSignal;
405 Dali::WidgetView::WidgetView::WidgetViewSignalType& WidgetView::WidgetCreationAbortedSignal()
407 return mWidgetCreationAbortedSignal;
410 Dali::WidgetView::WidgetView::WidgetViewSignalType& WidgetView::WidgetResizedSignal()
412 return mWidgetResizedSignal;
415 Dali::WidgetView::WidgetView::WidgetViewSignalType& WidgetView::WidgetContentUpdatedSignal()
417 return mWidgetContentUpdatedSignal;
420 Dali::WidgetView::WidgetView::WidgetViewSignalType& WidgetView::WidgetExtraInfoUpdatedSignal()
422 return mWidgetExtraInfoUpdatedSignal;
425 Dali::WidgetView::WidgetView::WidgetViewSignalType& WidgetView::WidgetUpdatePeriodChangedSignal()
427 return mWidgetUpdatePeriodChangedSignal;
430 Dali::WidgetView::WidgetView::WidgetViewSignalType& WidgetView::WidgetFaultedSignal()
432 return mWidgetFaultedSignal;
435 void WidgetView::OnInitialize()
437 char* instanceId = NULL;
438 char* previewPath = NULL;
439 std::string previewImage;
440 widget_size_type_e sizeType;
442 int ret = widget_instance_create( mWidgetId.c_str(), &instanceId );
443 if( ret < 0 || !instanceId )
445 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::OnInitialize: widget_instance_create is failed [%s].\n", mWidgetId.c_str() );
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 );
452 mInstanceId = instanceId;
455 widget_service_get_size_type( mWidth, mHeight, &sizeType );
457 previewPath = widget_service_get_preview_image_path( mWidgetId.c_str(), sizeType );
460 previewImage = previewPath;
465 previewImage = tzplatform_getenv( TZ_SYS_SHARE );
466 previewImage.append( WIDGET_VIEW_RESOURCE_DEFAULT_IMG );
469 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::OnInitialize: preview image path = %s\n", previewImage.c_str() );
471 mPreviewImage = Toolkit::ImageView::New( previewImage );
473 mPreviewImage.SetParentOrigin( ParentOrigin::CENTER );
474 mPreviewImage.SetAnchorPoint( AnchorPoint::CENTER );
478 mPreviewImage.SetSize( mWidth, mHeight );
481 Self().SetResizePolicy( ResizePolicy::FIT_TO_CHILDREN, Dimension::ALL_DIMENSIONS );
482 Self().Add( mPreviewImage );
485 // TODO: use po files
486 mStateText = Toolkit::TextLabel::New( "Loading..." );
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" );
493 mPreviewImage.Add( mStateText );
496 mPid = widget_instance_launch( instanceId, (char *)mContentInfo.c_str(), mWidth, mHeight );
499 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::OnInitialize: widget_instance_launch is failed. [%s]\n", mWidgetId.c_str() );
502 Dali::WidgetView::WidgetView handle( GetOwner() );
503 mWidgetCreationAbortedSignal.Emit( handle );
508 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::OnInitialize: widget_instance_launch is called. [%s, mPid = %d]\n", mWidgetId.c_str(), mPid );
511 void WidgetView::OnSizeSet( const Vector3& targetSize )
515 mObjectView.SetSize( targetSize );
519 } // namespace Internal
521 } // namespace WidgetView