idlehomescreen/xmluirendering/uiengine/src/xnviewmanager.cpp
branchRCL_3
changeset 23 7be2816dbabd
parent 19 79311d856354
child 25 137ebc85284b
--- 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