/*
+ * Samsung API
* Copyright (c) 2016 Samsung Electronics Co., Ltd.
*
- * Licensed under the Apache License, Version 2.0 (the "License");
+ * Licensed under the Flora License, Version 1.1 (the License);
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
- * http://www.apache.org/licenses/LICENSE-2.0
+ * http://floralicense.org/license/
*
* Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
+ * distributed under the License is distributed on an AS IS BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
- *
*/
// CLASS HEADER
#include <string.h>
#include <widget_service.h>
#include <widget_instance.h>
+#include <tzplatform_config.h>
namespace Dali
{
namespace
{
+#define WIDGET_VIEW_RESOURCE_DEFAULT_IMG "/widget_viewer_dali/images/unknown.png"
+
#if defined(DEBUG_ENABLED)
Integration::Log::Filter* gWidgetViewLogging = Integration::Log::Filter::New( Debug::Verbose, false, "LOG_WIDGET_VIEW" );
#endif
} // unnamed namespace
-Dali::WidgetView::WidgetView WidgetView::New( const std::string& widgetId, const std::string& contentInfo, int width, int height, double period )
+Dali::WidgetView::WidgetView WidgetView::New( const std::string& widgetId, const std::string& contentInfo, int width, int height, double updatePeriod )
{
// Create the implementation, temporarily owned on stack
- IntrusivePtr< WidgetView > internalWidgetView = new WidgetView( widgetId, contentInfo, width, height, period );
+ IntrusivePtr< WidgetView > internalWidgetView = new WidgetView( widgetId, contentInfo, width, height, updatePeriod );
// Pass ownership to CustomActor
Dali::WidgetView::WidgetView widgetView( *internalWidgetView );
mWidth( 0 ),
mHeight( 0 ),
mPid( 0 ),
- mPeriod( 0.0 ),
+ mUpdatePeriod( 0.0 ),
+ mPreviewEnabled( true ),
+ mStateTextEnabled( true ),
mPermanentDelete( true )
{
}
-WidgetView::WidgetView( const std::string& widgetId, const std::string& contentInfo, int width, int height, double period )
+WidgetView::WidgetView( const std::string& widgetId, const std::string& contentInfo, int width, int height, double updatePeriod )
: Control( ControlBehaviour( REQUIRES_TOUCH_EVENTS ) ),
mWidgetId( widgetId ),
mInstanceId(),
mWidth( width ),
mHeight( height ),
mPid( 0 ),
- mPeriod( period ),
+ mUpdatePeriod( updatePeriod ),
+ mPreviewEnabled( true ),
+ mStateTextEnabled( true ),
mPermanentDelete( true )
{
}
}
}
+bool WidgetView::PauseWidget()
+{
+ int ret = widget_instance_pause( mWidgetId.c_str(), mInstanceId.c_str() );
+ if( ret < 0 )
+ {
+ DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::PauseWidget: Fail to pause widget(%s, %s) [%d]\n", mWidgetId.c_str(), mInstanceId.c_str(), ret );
+ return false;
+ }
+
+ DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::PauseWidget: Widget is paused (%s, %s)\n", mWidgetId.c_str(), mInstanceId.c_str() );
+
+ return true;
+}
+
+bool WidgetView::ResumeWidget()
+{
+ int ret = widget_instance_resume( mWidgetId.c_str(), mInstanceId.c_str() );
+ if( ret < 0 )
+ {
+ DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::ResumeWidget: Fail to resume widget(%s, %s) [%d]\n", mWidgetId.c_str(), mInstanceId.c_str(), ret );
+ return false;
+ }
+
+ DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::ResumeWidget: Widget is resumed (%s, %s)\n", mWidgetId.c_str(), mInstanceId.c_str() );
+
+ return true;
+}
+
const std::string& WidgetView::GetWidgetId() const
{
return mWidgetId;
return mInstanceId;
}
-const std::string& WidgetView::GetContentInfo() const
+const std::string& WidgetView::GetContentInfo()
{
+ widget_instance_h instance;
+ bundle* bundle = NULL;
+ bundle_raw* contentInfo = NULL;
+ int contentLength = 0;
+
+ mContentInfo.clear();
+
+ if( mWidgetId.empty() || mInstanceId.empty() )
+ {
+ DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::GetContentInfo: Widget id (%s) or instance id (%s) is invalid.\n", mWidgetId.c_str(), mInstanceId.c_str() );
+ return mContentInfo;
+ }
+
+ instance = widget_instance_get_instance( mWidgetId.c_str(), mInstanceId.c_str() );
+ if( !instance )
+ {
+ DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::GetContentInfo: widget_instance_get_instance is failed. [%s]\n", mInstanceId.c_str() );
+ return mContentInfo;
+ }
+
+ if( widget_instance_get_content( instance, &bundle ) < 0 )
+ {
+ DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::GetContentInfo: Failed to get content of widget. [%s]\n", mInstanceId.c_str() );
+ return mContentInfo;
+ }
+
+ if( !bundle )
+ {
+ DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::GetContentInfo: Cotent of widget [%s] is invalid.\n", mInstanceId.c_str() );
+ return mContentInfo;
+ }
+
+ if( bundle_encode( bundle, &contentInfo, &contentLength ) < 0 )
+ {
+ DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::GetContentInfo: bundle_encode is failed. [%s]\n", mInstanceId.c_str() );
+ return mContentInfo;
+ }
+
+ mContentInfo = reinterpret_cast< char* >( contentInfo );
+
return mContentInfo;
}
-const std::string& WidgetView::GetTitle() const
+const std::string& WidgetView::GetTitle()
{
+ if( mObjectView )
+ {
+ mTitle = mObjectView.GetTitle();
+ if( mTitle.empty() )
+ {
+ mTitle = widget_service_get_name( mWidgetId.c_str(), NULL );
+ }
+ }
+
+ DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::GetTitle: title = %s\n", mTitle.c_str() );
+
return mTitle;
}
-double WidgetView::GetPeriod() const
+double WidgetView::GetUpdatePeriod() const
{
- return mPeriod;
+ return mUpdatePeriod;
+}
+
+void WidgetView::Show()
+{
+ if( mObjectView )
+ {
+ mObjectView.Show();
+ }
+}
+
+void WidgetView::Hide()
+{
+ if( mObjectView )
+ {
+ mObjectView.Hide();
+ }
+}
+
+bool WidgetView::CancelTouchEvent()
+{
+ if( mObjectView )
+ {
+ return mObjectView.CancelTouchEvent();
+ }
+
+ return false;
+}
+
+void WidgetView::SetPreviewEnabled( bool enabled )
+{
+ mPreviewEnabled = enabled;
+
+ if( mPreviewImage )
+ {
+ mPreviewImage.SetVisible( enabled );
+ }
+}
+
+bool WidgetView::GetPreviewEnabled() const
+{
+ return mPreviewEnabled;
+}
+
+void WidgetView::SetStateTextEnabled( bool enabled )
+{
+ mStateTextEnabled = enabled;
+
+ if( mStateText )
+ {
+ mStateText.SetVisible( enabled );
+ }
+}
+
+bool WidgetView::GetStateTextEnabled() const
+{
+ return mStateTextEnabled;
}
void WidgetView::ActivateFaultedWidget()
{
if( mPid < 0 )
{
+ // Esable preview and text
+ if( mPreviewEnabled )
+ {
+ mPreviewImage.SetVisible( true );
+ }
+
+ if( mStateTextEnabled )
+ {
+ mStateText.SetVisible( true );
+ }
+
// launch widget again
mPid = widget_instance_launch( mWidgetId.c_str(), mInstanceId.c_str(), mBundle, mWidth, mHeight );
if( mPid < 0)
{
DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::ActivateFaultedWidget: widget_instance_launch is failed. [%s]\n", mWidgetId.c_str() );
+
+ // Emit signal
+ Dali::WidgetView::WidgetView handle( GetOwner() );
+ mWidgetCreationAbortedSignal.Emit( handle );
+
return;
}
mObjectView.SetAnchorPoint( AnchorPoint::CENTER );
Self().Add( mObjectView );
- Self().SetResizePolicy( ResizePolicy::FIT_TO_CHILDREN, Dimension::ALL_DIMENSIONS );
- mTitle = mObjectView.GetTitle();
+ // Disable preview and text
+ if( mPreviewEnabled )
+ {
+ mPreviewImage.SetVisible( false );
+ }
+
+ if( mStateTextEnabled )
+ {
+ mStateText.SetVisible( false );
+ }
// Emit signal
Dali::WidgetView::WidgetView handle( GetOwner() );
mWidgetAddedSignal.Emit( handle );
+
+ DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::AddObjectView: ObjectView is added.\n" );
}
void WidgetView::RemoveObjectView()
{
+ // Enable preview and text
+ if( mPreviewEnabled )
+ {
+ mPreviewImage.SetVisible( true );
+ }
+
+ if( mStateTextEnabled )
+ {
+ mStateText.SetVisible( true );
+ }
+
// Emit signal
Dali::WidgetView::WidgetView handle( GetOwner() );
mWidgetDeletedSignal.Emit( handle );
mObjectView.Reset();
+
+ DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::RemoveObjectView: ObjectView is removed.\n" );
+}
+
+void WidgetView::SendWidgetEvent( int event )
+{
+ Dali::WidgetView::WidgetView handle( GetOwner() );
+
+ DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::SendWidgetEvent: event = %d widget = %s\n", event, mWidgetId.c_str() );
+
+ // Emit signal
+ switch( event )
+ {
+ case WIDGET_INSTANCE_EVENT_UPDATE:
+ {
+ mWidgetContentUpdatedSignal.Emit( handle );
+ break;
+ }
+ case WIDGET_INSTANCE_EVENT_PERIOD_CHANGED:
+ {
+ mWidgetUpdatePeriodChangedSignal.Emit( handle );
+ break;
+ }
+ case WIDGET_INSTANCE_EVENT_SIZE_CHANGED:
+ {
+ mWidgetResizedSignal.Emit( handle );
+ break;
+ }
+ case WIDGET_INSTANCE_EVENT_EXTRA_UPDATED:
+ {
+ mWidgetExtraInfoUpdatedSignal.Emit( handle );
+ break;
+ }
+ case WIDGET_INSTANCE_EVENT_FAULT:
+ {
+ mWidgetFaultedSignal.Emit( handle );
+ break;
+ }
+ default:
+ {
+ break;
+ }
+ }
}
Dali::WidgetView::WidgetView::WidgetViewSignalType& WidgetView::WidgetAddedSignal()
return mWidgetDeletedSignal;
}
+Dali::WidgetView::WidgetView::WidgetViewSignalType& WidgetView::WidgetCreationAbortedSignal()
+{
+ return mWidgetCreationAbortedSignal;
+}
+
+Dali::WidgetView::WidgetView::WidgetViewSignalType& WidgetView::WidgetResizedSignal()
+{
+ return mWidgetResizedSignal;
+}
+
+Dali::WidgetView::WidgetView::WidgetViewSignalType& WidgetView::WidgetContentUpdatedSignal()
+{
+ return mWidgetContentUpdatedSignal;
+}
+
+Dali::WidgetView::WidgetView::WidgetViewSignalType& WidgetView::WidgetExtraInfoUpdatedSignal()
+{
+ return mWidgetExtraInfoUpdatedSignal;
+}
+
+Dali::WidgetView::WidgetView::WidgetViewSignalType& WidgetView::WidgetUpdatePeriodChangedSignal()
+{
+ return mWidgetUpdatePeriodChangedSignal;
+}
+
+Dali::WidgetView::WidgetView::WidgetViewSignalType& WidgetView::WidgetFaultedSignal()
+{
+ return mWidgetFaultedSignal;
+}
+
void WidgetView::OnInitialize()
{
char* instanceId = NULL;
+ char* previewPath = NULL;
+ std::string previewImage;
+ widget_size_type_e sizeType;
if( !mContentInfo.empty() )
{
mInstanceId = instanceId;
+ // Preview image
+ widget_service_get_size_type( mWidth, mHeight, &sizeType );
+
+ previewPath = widget_service_get_preview_image_path( mWidgetId.c_str(), sizeType );
+ if( previewPath )
+ {
+ previewImage = previewPath;
+ free( previewPath );
+ }
+ else
+ {
+ previewImage = tzplatform_getenv( TZ_SYS_SHARE );
+ previewImage.append( WIDGET_VIEW_RESOURCE_DEFAULT_IMG );
+ }
+
+ DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::OnInitialize: preview image path = %s\n", previewImage.c_str() );
+
+ mPreviewImage = Toolkit::ImageView::New( previewImage );
+
+ mPreviewImage.SetParentOrigin( ParentOrigin::CENTER );
+ mPreviewImage.SetAnchorPoint( AnchorPoint::CENTER );
+
+ if( !previewPath )
+ {
+ mPreviewImage.SetSize( mWidth, mHeight );
+ }
+
+ Self().SetResizePolicy( ResizePolicy::FIT_TO_CHILDREN, Dimension::ALL_DIMENSIONS );
+ Self().Add( mPreviewImage );
+
+ // State text
+ // TODO: use po files
+ mStateText = Toolkit::TextLabel::New( "Loading..." );
+
+ mStateText.SetParentOrigin( ParentOrigin::CENTER );
+ mStateText.SetAnchorPoint( AnchorPoint::CENTER );
+ mStateText.SetProperty( Toolkit::TextLabel::Property::HORIZONTAL_ALIGNMENT, "CENTER" );
+ mStateText.SetProperty( Toolkit::TextLabel::Property::VERTICAL_ALIGNMENT, "CENTER" );
+
+ mPreviewImage.Add( mStateText );
+
// launch widget
mPid = widget_instance_launch( mWidgetId.c_str(), instanceId, mBundle, mWidth, mHeight );
if( mPid < 0)
{
DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::OnInitialize: widget_instance_launch is failed. [%s]\n", mWidgetId.c_str() );
+
+ // Emit signal
+ Dali::WidgetView::WidgetView handle( GetOwner() );
+ mWidgetCreationAbortedSignal.Emit( handle );
+
return;
}
DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::OnInitialize: widget_instance_launch is called. [%s, mPid = %d]\n", mWidgetId.c_str(), mPid );
}
+void WidgetView::OnSizeSet( const Vector3& targetSize )
+{
+ if( mObjectView )
+ {
+ mObjectView.SetSize( targetSize );
+ }
+}
+
} // namespace Internal
} // namespace WidgetView