diff -r 5315654608de -r 08c6ee43b396 idlehomescreen/widgetmanager/src/wmwidgetdata.cpp --- a/idlehomescreen/widgetmanager/src/wmwidgetdata.cpp Thu Jan 07 12:39:41 2010 +0200 +++ b/idlehomescreen/widgetmanager/src/wmwidgetdata.cpp Mon Jan 18 20:10:36 2010 +0200 @@ -23,24 +23,34 @@ #include #include #include // widgetreqistry -#include #include +#include +#include +#include +#include +#include #include "wmwidgetdata.h" #include "wmwidgetdataobserver.h" #include "wmpersistentwidgetorder.h" +#include "wmresourceloader.h" #include "wmcommon.h" -#include + +// CONSTANTS +_LIT8( KWrtMime, "application/x-nokia-widget"); // --------------------------------------------------------- // CWmWidgetData::NewL // --------------------------------------------------------- // -CWmWidgetData* CWmWidgetData::NewL( +CWmWidgetData* CWmWidgetData::NewL( + const TSize& aLogoSize, + CWmResourceLoader& aWmResourceLoader, CHsContentInfo* aHsContentInfo, RWidgetRegistryClientSession* aRegistryClientSession ) { CWmWidgetData* self = CWmWidgetData::NewLC( + aLogoSize, aWmResourceLoader, aHsContentInfo, aRegistryClientSession ); CleanupStack::Pop(); // self; return self; @@ -50,11 +60,14 @@ // CWmWidgetData::NewLC // --------------------------------------------------------- // -CWmWidgetData* CWmWidgetData::NewLC( +CWmWidgetData* CWmWidgetData::NewLC( + const TSize& aLogoSize, + CWmResourceLoader& aWmResourceLoader, CHsContentInfo* aHsContentInfo, RWidgetRegistryClientSession* aRegistryClientSession ) { - CWmWidgetData* self = new ( ELeave ) CWmWidgetData(); + CWmWidgetData* self = new ( ELeave ) CWmWidgetData( + aLogoSize, aWmResourceLoader ); CleanupStack::PushL(self); self->ConstructL( aHsContentInfo, aRegistryClientSession ); return self; @@ -64,16 +77,23 @@ // CWmWidgetData::CWmWidgetData // --------------------------------------------------------- // -CWmWidgetData::CWmWidgetData() +CWmWidgetData::CWmWidgetData( const TSize& aLogoSize, + CWmResourceLoader& aWmResourceLoader ) + : CActive( EPriorityStandard ), + iWmResourceLoader( aWmResourceLoader ) { iIdle = NULL; iLogoImage = NULL; iLogoImageMask = NULL; iHsContentInfo = NULL; iWidgetType = CWmWidgetData::EUnknown; - iInstallAnimationIndex = KErrNotFound; iPublisherUid = KNullUid; - iLogoSize = TSize( 0, 0 ); + iLogoSize = aLogoSize; + iPeriodic = NULL; + iAnimationIndex = 0; + iAsyncUninstalling = EFalse; + iFireLogoChanged = EFalse; + CActiveScheduler::Add( this ); } // --------------------------------------------------------- @@ -88,8 +108,13 @@ // start decoding the icon iImageConverter = CWmImageConverter::NewL( this ); - iIdle = CIdle::NewL( CActive::EPriorityLow ); - iIdle->Start( TCallBack( HandleAsyncIconString, this ) ); + iIdle = CIdle::NewL( CActive::EPriorityStandard ); + iWait = new (ELeave) CActiveSchedulerWait(); + iPeriodic = CPeriodic::NewL( CActive::EPriorityStandard ); + + // start logo handling + iImageConverter->SetLogoSize( iLogoSize ); + HandleIconString( HsContentInfo().IconPath() ); } // --------------------------------------------------------- @@ -124,12 +149,20 @@ // CWmWidgetData::~CWmWidgetData() { + Cancel(); if ( iIdle && iIdle->IsActive() ) { iIdle->Cancel(); } delete iIdle; + if ( iWait && iWait->IsStarted() ) + { + iWait->AsyncStop(); + } + delete iWait; SetObserver( NULL ); + DestroyAnimData(); + delete iPeriodic; delete iLogoImage; delete iLogoImageMask; delete iImageConverter; @@ -219,15 +252,24 @@ { iLogoImage = iImageConverter->Bitmap(); iLogoImageMask = iImageConverter->Mask(); - FireDataChanged(); + + if ( iWait && iWait->IsStarted() ) + { + iWait->AsyncStop(); + } + if ( iFireLogoChanged ) + { + iFireLogoChanged = EFalse; + FireDataChanged(); + } } } // --------------------------------------------------------- -// CWmWidgetData::HandleIconStringL +// CWmWidgetData::HandleIconString // --------------------------------------------------------- // -void CWmWidgetData::HandleIconStringL( const TDesC& aIconStr ) +void CWmWidgetData::HandleIconString( const TDesC& aIconStr ) { HBufC* iconStr = NULL; if ( aIconStr.Length() == 0 && @@ -236,12 +278,13 @@ // workaround for wrt widgets icon _LIT( KUidTag, "uid(0x%x)" ); const TInt KLength = 32; - iconStr = HBufC::NewLC( KLength ); - iconStr->Des().Format( KUidTag, iPublisherUid.iUid ); + TBuf uidBuf; + uidBuf.Format( KUidTag, iPublisherUid.iUid ); + iconStr = uidBuf.Alloc(); } else { - iconStr = aIconStr.AllocLC(); + iconStr = aIconStr.Alloc(); } TSize size( iLogoSize ); @@ -251,10 +294,21 @@ { size = iLogoSize; } - iImageConverter->HandleIconStringL( + TInt err = iImageConverter->HandleIconString( size.iWidth, size.iHeight, *iconStr ); - CleanupStack::PopAndDestroy( iconStr ); + delete iconStr; + iconStr = NULL; + + // handle result + if ( KErrNone == err && IsPrepairingLogo() ) + { + iWait->Start(); + } + else if ( KErrNone != err && iFireLogoChanged ) + { + FireDataChanged(); // draw default icon + } } // --------------------------------------------------------- @@ -314,12 +368,7 @@ if ( widgetUid != 0 ) { // WRT widget - iPublisherUid = TUid::Uid( widgetUid ); - - HBufC* desc = StringLoader::LoadLC( R_QTN_WM_WIDGET_DETAILS_WRT, - CEikonEnv::Static() ); - iHsContentInfo->SetDescriptionL( *desc ); - CleanupStack::PopAndDestroy( desc ); + iPublisherUid = TUid::Uid( widgetUid ); } else { @@ -327,33 +376,21 @@ } } } -// ---------------------------------------------------- -// CWmWidgetData::SetLogoSize -// ---------------------------------------------------- -// -void CWmWidgetData::SetLogoSize( const TSize& aSize ) - { - iLogoSize = aSize; - if ( iImageConverter ) - { - iImageConverter->SetLogoSize( aSize ); - } - } // --------------------------------------------------------- -// CWmWidgetData::HandleAsyncIconString +// CWmWidgetData::Description // --------------------------------------------------------- // -TInt CWmWidgetData::HandleAsyncIconString( TAny* aPtr ) +const TDesC& CWmWidgetData::Description() const { - CWmWidgetData* self = static_cast< CWmWidgetData* >( aPtr ); - if ( self->iIdle->IsActive() ) - { - self->iIdle->Cancel(); - } - TRAP_IGNORE( self->HandleIconStringL( - self->HsContentInfo().IconPath() ); ); - return KErrNone; + if ( iHsContentInfo->Description().Length() <= 0 && + &iWmResourceLoader ) + { + return ( ( iPublisherUid != KNullUid ) ? + iWmResourceLoader.WrtDescription() : + iWmResourceLoader.NoDescription() ); + } + return iHsContentInfo->Description(); } // --------------------------------------------------------- @@ -361,19 +398,20 @@ // --------------------------------------------------------- // void CWmWidgetData::ReCreateLogo( const TSize& aSize ) - { - iLogoSize = aSize; - + { delete iLogoImage; iLogoImage = NULL; delete iLogoImageMask; iLogoImageMask = NULL; - - if ( iIdle && !iIdle->IsActive() ) + + if ( iWait && iWait->IsStarted() ) { - // start decoding the icon - iIdle->Start( TCallBack( HandleAsyncIconString, this ) ); + iWait->AsyncStop(); } + + iFireLogoChanged = ETrue; + iLogoSize = aSize; + HandleIconString( HsContentInfo().IconPath() ); } // --------------------------------------------------------- @@ -412,5 +450,274 @@ return !( sameAppearance && sameLogo ); } + +// --------------------------------------------------------- +// CWmWidgetData::IsPrepairingLogo +// --------------------------------------------------------- +// +TBool CWmWidgetData::IsPrepairingLogo() + { + TBool prepairing( EFalse ); + if ( !iLogoImage ) + { + prepairing = iImageConverter->IsProcessing(); + } + return prepairing; + } + +// --------------------------------------------------------- +// CWmWidgetData::UnInstallL +// --------------------------------------------------------- +// +void CWmWidgetData::UnInstallL() + { + if ( IsUninstalling() || IsActive() ) + { + User::Leave( KErrInUse ); + } + + DestroyAnimData(); + + TInt err = iInstaller.Connect(); + if ( KErrNone == err ) + { + CleanupClosePushL( iInstaller ); + PrepairAnimL(); + CleanupStack::Pop( &iInstaller ); + SwiUI::TUninstallOptions optionsUninstall; + optionsUninstall.iBreakDependency = SwiUI::EPolicyAllowed; + optionsUninstall.iKillApp = SwiUI::EPolicyAllowed; + SwiUI::TUninstallOptionsPckg uninstallOptionsPkg( optionsUninstall ); + iInstaller.SilentUninstall( iStatus, iPublisherUid, + uninstallOptionsPkg, KWrtMime ); + VisualizeUninstall(); + SetActive(); + } + else + { + // do normal uninstall + iAsyncUninstalling = EFalse; + SwiUI::RSWInstLauncher installer; + User::LeaveIfError( installer.Connect() ); + CleanupClosePushL( installer ); + User::LeaveIfError( installer.Uninstall( iPublisherUid, KWrtMime ) ); + CleanupStack::PopAndDestroy( &installer ); + } + } + +// --------------------------------------------------------- +// CWmWidgetData::VisualizeUninstall +// --------------------------------------------------------- +// +void CWmWidgetData::VisualizeUninstall() + { + iAsyncUninstalling = ETrue; + iAnimationIndex = 0; + const TInt tickInterval = 400000; + iPeriodic->Start( + tickInterval,tickInterval,TCallBack(Tick, this)); + } + +// --------------------------------------------------------- +// CWmWidgetData::PrepairAnimL +// --------------------------------------------------------- +// +void CWmWidgetData::PrepairAnimL() + { + TInt resourceId = R_QGN_GRAF_WAIT_BAR_ANIM; + CAknBitmapAnimation* aknAnimation = CAknBitmapAnimation::NewL(); + CleanupStack::PushL( aknAnimation ); + aknAnimation->SetScaleModeForAnimationFrames(EAspectRatioNotPreserved); + TAknsItemID iid; + iid.Set(EAknsMajorAvkon, resourceId ); + if ( !aknAnimation ->ConstructFromSkinL( iid ) ) + { + TResourceReader readerForAnimation; + CCoeEnv::Static()->CreateResourceReaderLC( readerForAnimation,resourceId ); + aknAnimation->ConstructFromResourceL( readerForAnimation ); + CleanupStack::PopAndDestroy(); + } + TInt endFrame = aknAnimation ->BitmapAnimData()->FrameArray().Count()-1; + for ( TInt i=0; i<=endFrame; i++ ) + { + aknAnimation ->BitmapAnimData()->FrameArray().At(i)->SetBitmapsOwnedExternally( ETrue ); + CFbsBitmap* bitmap = aknAnimation ->BitmapAnimData()->FrameArray().At(i)->Bitmap(); + CFbsBitmap* bitmapMask = aknAnimation ->BitmapAnimData()->FrameArray().At(i)->Mask(); + if ( bitmap && bitmapMask ) + { + iUninstallAnimIcons.AppendL( bitmap ); + iUninstallAnimIcons.AppendL( bitmapMask ); + } + } + CleanupStack::PopAndDestroy( aknAnimation ); + } + +// --------------------------------------------------------- +// CWmWidgetData::DestroyAnimData +// --------------------------------------------------------- +// +void CWmWidgetData::DestroyAnimData() + { + if ( iPeriodic && iPeriodic->IsActive() ) + { + iPeriodic->Cancel(); + } + + for( TInt i=0; i < iUninstallAnimIcons.Count(); i++ ) + { + CFbsBitmap* bitmap = iUninstallAnimIcons[i]; + delete bitmap; bitmap = NULL; + } + iUninstallAnimIcons.Close(); + } + +// --------------------------------------------------------- +// CWmWidgetData::Tick +// --------------------------------------------------------- +// +TInt CWmWidgetData::Tick( TAny* aPtr ) + { + CWmWidgetData* self = static_cast< CWmWidgetData* >( aPtr ); + self->iAnimationIndex += 2; + if ( self->iAnimationIndex >= self->iUninstallAnimIcons.Count() -1 ) + { + self->iAnimationIndex = 0; // restart from beginging + } + self->FireDataChanged(); + return 1; + } + +// --------------------------------------------------------- +// CWmWidgetData::CloseSwiSession +// --------------------------------------------------------- +// +TInt CWmWidgetData::CloseSwiSession( TAny* aPtr ) + { + CWmWidgetData* self = static_cast< CWmWidgetData* >( aPtr ); + if ( self->iIdle->IsActive() ) + { + self->iIdle->Cancel(); + } + + self->iInstaller.Close(); + return KErrNone; + } + +// --------------------------------------------------------- +// CWmWidgetData::AnimationBitmap +// --------------------------------------------------------- +// +const CFbsBitmap* CWmWidgetData::AnimationBitmap( const TSize& aSize ) + { + CFbsBitmap* bitmap = NULL; + if ( iUninstallAnimIcons.Count() ) + { + TInt index = iAnimationIndex; + if ( index >= iUninstallAnimIcons.Count() - 1 ) + { + index = 0; + } + bitmap = iUninstallAnimIcons[index]; + if ( bitmap->SizeInPixels() != aSize ) + { + AknIconUtils::SetSize( bitmap, aSize, + EAspectRatioNotPreserved ); + } + } + return bitmap; + } + +// --------------------------------------------------------- +// CWmWidgetData::AnimationMask +// --------------------------------------------------------- +// +const CFbsBitmap* CWmWidgetData::AnimationMask( const TSize& aSize ) + { + CFbsBitmap* mask = NULL; + if ( iUninstallAnimIcons.Count() ) + { + TInt index = iAnimationIndex+1; + if ( index >= iUninstallAnimIcons.Count() ) + { + index = 1; + } + mask = iUninstallAnimIcons[index]; + if ( mask && mask->SizeInPixels() != aSize ) + { + AknIconUtils::SetSize( mask, aSize, + EAspectRatioNotPreserved ); + } + } + return mask; + } + +// --------------------------------------------------------- +// CWmWidgetData::IsUninstalling +// --------------------------------------------------------- +// +TBool CWmWidgetData::IsUninstalling() + { + return iAsyncUninstalling; + } + +// --------------------------------------------------------- +// CWmWidgetData::DoCancel +// --------------------------------------------------------- +// +void CWmWidgetData::DoCancel() + { + if ( IsActive() && iAsyncUninstalling ) + { + iInstaller.CancelAsyncRequest( + SwiUI::ERequestSilentUninstall ); + + // close session + iInstaller.Close(); + } + iAsyncUninstalling = EFalse; + iAnimationIndex = 0; + } + +// --------------------------------------------------------- +// CWmWidgetData::RunL +// --------------------------------------------------------- +// +void CWmWidgetData::RunL() + { + iAsyncUninstalling = EFalse; + iAnimationIndex = 0; + + DestroyAnimData(); + FireDataChanged(); + + // close SWI session + if ( iIdle && iIdle->IsActive() ) + { + iIdle->Cancel(); + } + iIdle->Start( TCallBack( CloseSwiSession, this ) ); + } + +// --------------------------------------------------------- +// CWmWidgetData::RunError +// --------------------------------------------------------- +// +TInt CWmWidgetData::RunError(TInt /*aError*/) + { + iAsyncUninstalling = EFalse; + iAnimationIndex = 0; + DestroyAnimData(); + FireDataChanged(); + + // close SWI session + if ( iIdle && iIdle->IsActive() ) + { + iIdle->Cancel(); + } + iIdle->Start( TCallBack( CloseSwiSession, this ) ); + + return KErrNone; + } + // End of file