--- a/idlehomescreen/xmluirendering/uiengine/src/xnviewmanager.cpp Tue Apr 27 16:26:12 2010 +0300
+++ b/idlehomescreen/xmluirendering/uiengine/src/xnviewmanager.cpp Tue May 11 16:02:39 2010 +0300
@@ -27,7 +27,6 @@
#include <aifwdefs.h>
#include <gfxtranseffect/gfxtranseffect.h>
#include <akntransitionutils.h>
-#include <layoutmetadata.cdl.h>
// User includes
#include "xnapplication.h"
@@ -56,6 +55,7 @@
#include "xnoomsyshandler.h"
#include "xnbackgroundmanager.h"
#include "xneffectmanager.h"
+#include "xnkeyeventdispatcher.h"
// Constants
_LIT8( KEmptyWidgetUid, "0x2001f47f" );
@@ -64,6 +64,7 @@
const TInt KPSCategoryUid( 0x200286E3 );
const TInt KPSCrashCountKey( 1 );
const TInt KStabilityInterval( 60000000 ); // 1 minute
+const TInt KActivationCompleteInterval( 2000000 ); // 2s
const TInt KCrashRestoreDefaultThreshold( 3 );
const TInt KCrashRestoreAllTreshold( 4 );
@@ -278,7 +279,9 @@
// -----------------------------------------------------------------------------
//
CXnViewManager::~CXnViewManager()
- {
+ {
+ delete iAsyncCb;
+
delete iStabilityTimer;
iObservers.Reset();
@@ -325,9 +328,9 @@
iHspsWrapper = &iEditor->HspsWrapper();
iComposer = CXnComposer::NewL( *iHspsWrapper );
-
- iIsLandscapeOrientation = Layout_Meta_Data::IsLandscapeOrientation();
-
+
+ iAsyncCb = CPeriodic::NewL( CActive::EPriorityIdle );
+
DoRobustnessCheckL();
}
@@ -348,8 +351,8 @@
CleanupStack::PopAndDestroy(); // DisableRenderUiLC();
- // Activate initial view already here to get publishers loaded
- ActiveViewData().SetActive( ETrue );
+ // Load initial view publishers
+ ActiveViewData().LoadPublishers( EAiFwSystemStartup );
}
// -----------------------------------------------------------------------------
@@ -364,6 +367,13 @@
NotifyViewDeactivatedL( ActiveViewData() );
+ if ( iAsyncCb->IsActive() )
+ {
+ iAsyncCb->Cancel();
+
+ ContainerActivated( this );
+ }
+
delete iWidgetAmountTrigger;
iWidgetAmountTrigger = NULL;
@@ -388,6 +398,7 @@
// -----------------------------------------------------------------------------
// CXnViewManager::LoadWidgetToPluginL()
+//
// -----------------------------------------------------------------------------
//
TInt CXnViewManager::LoadWidgetToPluginL( const CHsContentInfo& aContentInfo,
@@ -416,7 +427,7 @@
if( retval == KErrDiskFull )
{
- ShowDiskFullMessageL();
+ TRAP_IGNORE( ShowErrorL( R_QTN_HS_OPERATION_FAILED_NO_DISK ) );
}
}
else
@@ -435,7 +446,7 @@
}
else if( retval == KErrDiskFull )
{
- ShowDiskFullMessageL();
+ TRAP_IGNORE( ShowErrorL( R_QTN_HS_OPERATION_FAILED_NO_DISK ) );
}
CleanupStack::PopAndDestroy( result );
@@ -460,11 +471,11 @@
}
else if ( retval == KErrNoMemory )
{
- aPluginData.ShowOutOfMemError();
+ TRAP_IGNORE( ShowErrorL( R_QTN_HS_HS_MEMORY_FULL ) );
}
else if ( retval == KXnErrPluginFailure )
{
- aPluginData.ShowContentRemovedError();
+ TRAP_IGNORE( ShowErrorL( R_QTN_HS_ERROR_WIDGETS_REMOVED ) );
}
CleanupStack::PopAndDestroy(); // DisableRenderUiLC
@@ -475,6 +486,7 @@
// -----------------------------------------------------------------------------
// CXnViewManager::UnloadWidgetFromPluginL()
+//
// -----------------------------------------------------------------------------
//
TInt CXnViewManager::UnloadWidgetFromPluginL( CXnPluginData& aPluginData,
@@ -558,6 +570,7 @@
// -----------------------------------------------------------------------------
// CXnViewManager::ReplaceWidgetToPluginL
+//
// -----------------------------------------------------------------------------
//
TInt CXnViewManager::ReplaceWidgetToPluginL( const CHsContentInfo& aContentInfo,
@@ -606,11 +619,11 @@
}
else if ( retval == KErrNoMemory )
{
- aPluginData.ShowOutOfMemError();
+ TRAP_IGNORE( ShowErrorL( R_QTN_HS_HS_MEMORY_FULL ) );
}
else if ( retval == KXnErrPluginFailure )
{
- aPluginData.ShowContentRemovedError();
+ TRAP_IGNORE( ShowErrorL( R_QTN_HS_ERROR_WIDGETS_REMOVED ) );
}
CleanupStack::PopAndDestroy(); // DisableRenderUiLC
@@ -780,6 +793,7 @@
// -----------------------------------------------------------------------------
// CXnViewManager::AppearanceNodes()
+//
// -----------------------------------------------------------------------------
//
RPointerArray< CXnNode >& CXnViewManager::AppearanceNodes() const
@@ -865,71 +879,29 @@
CXnViewData& next( NextViewData() );
if ( !next.Occupied() )
- {
- if ( next.Load() == KErrNoMemory )
+ {
+ TInt err( next.Load() );
+
+ if ( err )
{
- next.ShowOutOfMemError();
- return;
+ if ( err == KErrNoMemory )
+ {
+ TRAP_IGNORE( ShowErrorL( R_QTN_HS_HS_MEMORY_FULL ) );
+ }
+ else if ( err == KXnErrPluginFailure )
+ {
+ TRAP_IGNORE( ShowErrorL( R_QTN_HS_ERROR_WIDGETS_REMOVED ) );
+ }
+
+ return;
}
}
// Activate view
if ( next.Occupied() && !next.Active() )
- {
- CXnControlAdapter* thisView(
- ActiveViewData().ViewNode()->Control() );
-
- CXnControlAdapter* nextView(
- next.ViewNode()->Control() );
-
- GfxTransEffect::Register( thisView, KGfxContextActivateNextView );
- GfxTransEffect::Register( nextView, KGfxContextActivateNextView );
-
- TInt ret( GfxTransEffect::BeginGroup() );
-
- CFbsBitmap* currentBg( ActiveViewData().WallpaperImage() );
- CFbsBitmap* nextBg( next.WallpaperImage() );
-
- if ( currentBg || nextBg )
- {
- CCoeControl* bg( &iAppUiAdapter.ViewAdapter().BgManager() );
-
- if ( !currentBg && nextBg )
- {
- GfxTransEffect::Begin( bg, KGfxControlActionBgAnimToImgAppear );
- }
- else
- {
- GfxTransEffect::Begin( bg, KGfxControlActionBgImgToImgAppear );
- }
-
- GfxTransEffect::SetDemarcation( bg, bg->Position() );
- GfxTransEffect::End( bg );
- }
-
- if ( iIsLandscapeOrientation )
- {
- GfxTransEffect::Begin( thisView, KGfxControlActionDisappearLsc );
- GfxTransEffect::Begin( nextView, KGfxControlActionAppearLsc );
- }
- else
- {
- GfxTransEffect::Begin( thisView, KGfxControlActionDisappearPrt );
- GfxTransEffect::Begin( nextView, KGfxControlActionAppearPrt );
- }
-
- TRAP_IGNORE( iAppUiAdapter.ViewAdapter().ActivateContainerL( next ) );
-
- GfxTransEffect::SetDemarcation( thisView, thisView->Position() );
- GfxTransEffect::End( thisView );
-
- GfxTransEffect::SetDemarcation( nextView, nextView->Position() );
- GfxTransEffect::End( nextView );
-
- GfxTransEffect::EndGroup( ret );
-
- GfxTransEffect::Deregister( thisView );
- GfxTransEffect::Deregister( nextView );
+ {
+ iAppUiAdapter.ViewAdapter().ActivateContainerL(
+ next, EFalse, KGfxContextActivateNextView );
}
}
@@ -944,70 +916,28 @@
if ( !prev.Occupied() )
{
- if ( prev.Load() == KErrNoMemory )
+ TInt err( prev.Load() );
+
+ if ( err )
{
- prev.ShowOutOfMemError();
- return;
- }
+ if ( err == KErrNoMemory )
+ {
+ TRAP_IGNORE( ShowErrorL( R_QTN_HS_HS_MEMORY_FULL ) );
+ }
+ else if ( err == KXnErrPluginFailure )
+ {
+ TRAP_IGNORE( ShowErrorL( R_QTN_HS_ERROR_WIDGETS_REMOVED ) );
+ }
+
+ return;
+ }
}
// Activate view
if ( prev.Occupied() && !prev.Active() )
{
- CXnControlAdapter* thisView(
- ActiveViewData().ViewNode()->Control() );
-
- CXnControlAdapter* prevView(
- prev.ViewNode()->Control() );
-
- GfxTransEffect::Register( thisView, KGfxContextActivatePrevView );
- GfxTransEffect::Register( prevView, KGfxContextActivatePrevView );
-
- TInt ret( GfxTransEffect::BeginGroup() );
-
- CFbsBitmap* currentBg( ActiveViewData().WallpaperImage() );
- CFbsBitmap* prevBg( prev.WallpaperImage() );
-
- if ( currentBg || prevBg )
- {
- CCoeControl* bg( &iAppUiAdapter.ViewAdapter().BgManager() );
-
- if ( !currentBg && prevBg )
- {
- GfxTransEffect::Begin( bg, KGfxControlActionBgAnimToImgAppear );
- }
- else
- {
- GfxTransEffect::Begin( bg, KGfxControlActionBgImgToImgAppear );
- }
-
- GfxTransEffect::SetDemarcation( bg, bg->Position() );
- GfxTransEffect::End( bg );
- }
-
- if ( iIsLandscapeOrientation )
- {
- GfxTransEffect::Begin( thisView, KGfxControlActionDisappearLsc );
- GfxTransEffect::Begin( prevView, KGfxControlActionAppearLsc );
- }
- else
- {
- GfxTransEffect::Begin( thisView, KGfxControlActionDisappearPrt );
- GfxTransEffect::Begin( prevView, KGfxControlActionAppearPrt );
- }
-
- TRAP_IGNORE( iAppUiAdapter.ViewAdapter().ActivateContainerL( prev ) );
-
- GfxTransEffect::SetDemarcation( thisView, thisView->Position() );
- GfxTransEffect::End( thisView );
-
- GfxTransEffect::SetDemarcation( prevView, prevView->Position() );
- GfxTransEffect::End( prevView );
-
- GfxTransEffect::EndGroup( ret );
-
- GfxTransEffect::Deregister( thisView );
- GfxTransEffect::Deregister( prevView );
+ iAppUiAdapter.ViewAdapter().ActivateContainerL(
+ prev, EFalse, KGfxContextActivatePrevView );
}
}
@@ -1033,7 +963,7 @@
if( retval == KErrDiskFull )
{
- ShowDiskFullMessageL();
+ TRAP_IGNORE( ShowErrorL( R_QTN_HS_OPERATION_FAILED_NO_DISK ) );
}
else if ( retval == KErrNone )
{
@@ -1048,9 +978,13 @@
if ( retval == KErrNoMemory )
{
- newView->ShowOutOfMemError();
+ TRAP_IGNORE( ShowErrorL( R_QTN_HS_HS_MEMORY_FULL ) );
}
-
+ else if ( retval == KXnErrPluginFailure )
+ {
+ TRAP_IGNORE( ShowErrorL( R_QTN_HS_ERROR_WIDGETS_REMOVED ) );
+ }
+
if ( newView->Occupied() )
{
// Load succeed, add the new view behind the current view
@@ -1097,18 +1031,9 @@
{
if ( iRootData->PluginData().Count() >= iRootData->MaxPages() )
{
- HBufC* msg( StringLoader::LoadLC(
- R_QTN_HS_MAX_AMOUNT_OF_PAGES_NOTE ) );
-
- CAknErrorNote* note = new ( ELeave ) CAknErrorNote;
- CleanupStack::PushL( note );
-
- note->ExecuteLD( *msg );
-
- CleanupStack::Pop( note );
- CleanupStack::PopAndDestroy( msg );
-
- return;
+ TRAP_IGNORE( ShowErrorL( R_QTN_HS_MAX_AMOUNT_OF_PAGES_NOTE ) );
+
+ return;
}
// Add new view (template view) to hsps
@@ -1121,7 +1046,7 @@
if( status == KErrDiskFull )
{
- ShowDiskFullMessageL();
+ TRAP_IGNORE( ShowErrorL( R_QTN_HS_OPERATION_FAILED_NO_DISK ) );
}
else if ( status == KErrNone )
{
@@ -1136,9 +1061,13 @@
if ( status == KErrNoMemory )
{
- newView->ShowOutOfMemError();
+ TRAP_IGNORE( ShowErrorL( R_QTN_HS_HS_MEMORY_FULL ) );
+ }
+ else if ( status == KXnErrPluginFailure )
+ {
+ TRAP_IGNORE( ShowErrorL( R_QTN_HS_ERROR_WIDGETS_REMOVED ) );
}
-
+
if ( newView->Occupied() )
{
// Start transition effect
@@ -1212,6 +1141,7 @@
// Activate the next view, or first if in the last view
CXnViewData& next( NextViewData() );
+
iAppUiAdapter.ViewAdapter().ActivateContainerL( next );
}
@@ -1221,11 +1151,7 @@
retval = iHspsWrapper->RemovePluginL( view->PluginId() );
// Notify observers of view list change
- TRAPD( err, NotifyViewRemovalL( *view ) );
- if ( err != KErrNone )
- {
- // ignored
- }
+ TRAP_IGNORE( NotifyViewRemovalL( *view ) );
iRootData->DestroyViewData( view );
@@ -1298,11 +1224,8 @@
iHspsWrapper->RemovePluginL( view->PluginId() );
// Notify observers of view list change
- TRAPD( err, NotifyViewRemovalL( *view ) );
- if ( err != KErrNone )
- {
- // ignored
- }
+ TRAP_IGNORE( NotifyViewRemovalL( *view ) );
+
iRootData->DestroyViewData( view );
@@ -1313,6 +1236,7 @@
// -----------------------------------------------------------------------------
// CXnViewManager::AddObserver()
+//
// -----------------------------------------------------------------------------
//
void CXnViewManager::AddObserver( const MXnViewObserver& aObserver )
@@ -1327,6 +1251,7 @@
// -----------------------------------------------------------------------------
// CXnViewManager::RemoveObserver()
+//
// -----------------------------------------------------------------------------
//
void CXnViewManager::RemoveObserver( const MXnViewObserver& aObserver )
@@ -1435,26 +1360,29 @@
// CXnViewManager::NotifyContainerChangedL()
// Notifies container is changed, this is called always by CXnViewAdapter
// -----------------------------------------------------------------------------
+//
void CXnViewManager::NotifyContainerChangedL( CXnViewData& aViewToActivate )
{
+ iAsyncCb->Cancel();
+
CXnViewData& viewToDeactivate( ActiveViewData() );
+ TInt err( KErrNone );
+
if ( &aViewToActivate != &viewToDeactivate )
- {
+ {
NotifyViewDeactivatedL( viewToDeactivate );
- viewToDeactivate.SetActive( EFalse );
+ err = viewToDeactivate.SetActive( EFalse );
aViewToActivate.SetActive( ETrue );
-
- iHspsWrapper->SetActivePluginL( aViewToActivate.PluginId() );
-
+
// Cache update is needed after view activation
UpdateCachesL();
}
else
{
// Activate first view
- aViewToActivate.SetActive( ETrue );
+ err = aViewToActivate.SetActive( ETrue );
// Cache update is needed after view activation
UpdateCachesL();
@@ -1463,8 +1391,72 @@
iRootData->LoadRemainingViews();
}
- NotifyViewActivatedL( aViewToActivate );
- UpdatePageManagementInformationL();
+ if ( err == KErrNoMemory )
+ {
+ TRAP_IGNORE( ShowErrorL( R_QTN_HS_HS_MEMORY_FULL ) );
+ }
+ else if ( err == KXnErrPluginFailure )
+ {
+ TRAP_IGNORE( ShowErrorL( R_QTN_HS_ERROR_WIDGETS_REMOVED ) );
+ }
+
+ NotifyViewActivatedL( aViewToActivate );
+ }
+
+// -----------------------------------------------------------------------------
+// CXnViewManager::PublishersReadyL()
+// Notifies that aViewData activation is complete
+// -----------------------------------------------------------------------------
+//
+void CXnViewManager::PublishersReadyL( CXnViewData& aViewData, TInt aResult )
+ {
+ if ( !aViewData.Active() )
+ {
+ return;
+ }
+
+ iAsyncCb->Cancel();
+
+ TCallBack cb( ContainerActivated, this ) ;
+
+ iAsyncCb->Start( KActivationCompleteInterval, 0, cb );
+
+ if ( !iUiReady )
+ {
+ iAppUiAdapter.HandleUiReadyEventL();
+ iUiReady = ETrue;
+ }
+
+ if ( aResult == KErrNoMemory )
+ {
+ ShowErrorL( R_QTN_HS_HS_MEMORY_FULL );
+ }
+ else if ( aResult == KXnErrPluginFailure )
+ {
+ ShowErrorL( R_QTN_HS_ERROR_WIDGETS_REMOVED );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CXnViewManager::ContainerActivated()
+// Notifies that a container activation is complete
+// -----------------------------------------------------------------------------
+//
+/* static */ TInt CXnViewManager::ContainerActivated( TAny* aAny )
+ {
+ CXnViewManager* self = static_cast< CXnViewManager* >( aAny );
+
+ self->iAsyncCb->Cancel();
+
+ CXnViewData& active( self->ActiveViewData() );
+
+ TRAP_IGNORE( self->iHspsWrapper->SetActivePluginL( active.PluginId() ) );
+
+ CXnBackgroundManager& bg( self->iAppUiAdapter.ViewAdapter().BgManager() );
+
+ TRAP_IGNORE( bg.StoreWallpaperL() );
+
+ return KErrNone;
}
// -----------------------------------------------------------------------------
@@ -1572,6 +1564,7 @@
// -----------------------------------------------------------------------------
// CXnViewManager::UpdateCachesL()
+//
// -----------------------------------------------------------------------------
//
void CXnViewManager::UpdateCachesL()
@@ -1587,6 +1580,7 @@
// -----------------------------------------------------------------------------
// CXnViewManager::ReportWidgetAmountL()
+//
// -----------------------------------------------------------------------------
//
void CXnViewManager::ReportWidgetAmountL( const CXnViewData& aViewData )
@@ -1652,24 +1646,30 @@
}
// -----------------------------------------------------------------------------
-// CXnViewManager::ShowOperationFailedMessageL
+// CXnViewManager::ShowErrorL
+//
// -----------------------------------------------------------------------------
//
-void CXnViewManager::ShowDiskFullMessageL() const
- {
- HBufC* msg( StringLoader::LoadLC( R_QTN_HS_OPERATION_FAILED_NO_DISK ) );
-
- CAknErrorNote* note = new ( ELeave ) CAknErrorNote;
- CleanupStack::PushL( note );
-
- note->ExecuteLD( *msg );
-
- CleanupStack::Pop( note );
- CleanupStack::PopAndDestroy( msg );
+void CXnViewManager::ShowErrorL( TInt aResource ) const
+ {
+ if ( aResource == R_QTN_HS_HS_MEMORY_FULL )
+ {
+ iOomSysHandler->HandlePotentialOomL();
+ }
+ else
+ {
+ HBufC* msg( StringLoader::LoadLC( aResource ) );
+
+ CAknErrorNote* note = new ( ELeave ) CAknErrorNote;
+ note->ExecuteLD( *msg );
+
+ CleanupStack::PopAndDestroy( msg );
+ }
}
// -----------------------------------------------------------------------------
// CXnViewManager::OOMSysHandler
+//
// -----------------------------------------------------------------------------
//
CXnOomSysHandler& CXnViewManager::OomSysHandler() const
@@ -1759,6 +1759,7 @@
// -----------------------------------------------------------------------------
// CXnViewManager::ResetCrashCount
+//
// -----------------------------------------------------------------------------
void CXnViewManager::ResetCrashCount()
{
@@ -1766,38 +1767,34 @@
}
// -----------------------------------------------------------------------------
-// CXnViewManager::ShowErrorNoteL
-// -----------------------------------------------------------------------------
-void CXnViewManager::ShowErrorNoteL()
- {
- CAknQueryDialog* query = CAknQueryDialog::NewL();
- query->PrepareLC( R_HS_CONTENT_REMOVED_VIEW );
-
- HBufC* queryText( StringLoader::LoadLC( R_HS_ERROR_CONTENT_REMOVED ) );
- query->SetPromptL( queryText->Des() );
- CleanupStack::PopAndDestroy( queryText );
-
- query->RunLD();
- }
-
-// -----------------------------------------------------------------------------
-// CXnViewManager::DoRobustnessCheckL
+// CXnViewManager::DoRobustnessCheckL
+//
// -----------------------------------------------------------------------------
void CXnViewManager::DoRobustnessCheckL()
{
TInt crashCount = 0;
+
RProperty::Get( TUid::Uid( KPSCategoryUid ),
KPSCrashCountKey,
crashCount );
if( crashCount == KCrashRestoreDefaultThreshold )
{
- TInt err = iHspsWrapper->RestoreDefaultConfL();
- ShowErrorNoteL();
+ iHspsWrapper->RestoreDefaultConfL();
+
+ CAknQueryDialog* query = CAknQueryDialog::NewL();
+ query->PrepareLC( R_HS_CONTENT_REMOVED_VIEW );
+
+ HBufC* queryText( StringLoader::LoadLC( R_HS_ERROR_CONTENT_REMOVED ) );
+ query->SetPromptL( queryText->Des() );
+ CleanupStack::PopAndDestroy( queryText );
+
+ query->RunLD();
}
else if( crashCount >= KCrashRestoreAllTreshold )
{
- TInt err = iHspsWrapper->RestoreRootL();
+ iHspsWrapper->RestoreRootL();
+
ResetCrashCount();
return;
}
@@ -1814,12 +1811,4 @@
}
}
-// -----------------------------------------------------------------------------
-// CXnViewManager::OrientationChanged
-// -----------------------------------------------------------------------------
-void CXnViewManager::OrientationChanged()
- {
- iIsLandscapeOrientation = Layout_Meta_Data::IsLandscapeOrientation();
- }
-
// End of file