idlehomescreen/xmluirendering/uiengine/src/xnbackgroundmanager.cpp
branchRCL_3
changeset 47 7be2816dbabd
parent 38 79311d856354
child 54 1b758917cafc
--- a/idlehomescreen/xmluirendering/uiengine/src/xnbackgroundmanager.cpp	Tue Apr 27 16:26:12 2010 +0300
+++ b/idlehomescreen/xmluirendering/uiengine/src/xnbackgroundmanager.cpp	Tue May 11 16:02:39 2010 +0300
@@ -35,11 +35,15 @@
 #include <akntransitionutils.h>
 #include <aknlistquerydialog.h> 
 #include <xnuiengine.rsg>
+#include <xnwallpaperview.rsg>
 #include <AknSkinsInternalCRKeys.h>
 #include <activeidle2domaincrkeys.h>
 #include <AknsWallpaperUtils.h>
 #include <imageconversion.h>
 #include <bitmaptransforms.h>
+#include <StringLoader.h>
+#include <aknnotewrappers.h>
+#include <bautils.h>
 
 #include <AknsUtils.h>
 #include <AknsDrawUtils.h>
@@ -54,7 +58,78 @@
 _LIT8( KSingle, "single" );
 const TUid KDummyUid = { 0x0000000 };
 const TInt KSkinGfxInnerRectShrink( 5 );
-const TInt KCallbackDelay( 500000 ); // 500ms
+
+// ============================= LOCAL FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// ShowInfoNoteL
+// -----------------------------------------------------------------------------
+//
+void ShowInfoNoteL( TInt aResourceId )
+    {
+    HBufC* msg( StringLoader::LoadLC( aResourceId ) ); 
+
+    CAknInformationNote* note = new ( ELeave ) CAknInformationNote;    
+    note->ExecuteLD( *msg );
+                   
+    CleanupStack::PopAndDestroy( msg );                 
+    }
+
+// -----------------------------------------------------------------------------
+// HandleErrorL
+// -----------------------------------------------------------------------------
+//
+void HandleErrorL( TInt aErr )
+    {
+    TInt resourceId( NULL );
+    if ( aErr == KErrTooBig || aErr == KErrNoMemory )
+        {
+        resourceId = R_QTN_HS_TOO_BIG_IMAGE_NOTE;
+        }
+    else if ( aErr == KErrCancel || aErr == KErrCouldNotConnect || 
+        aErr == KErrCANoRights )
+        {
+        // Ignore these
+        }
+    else if ( aErr != KErrNone )
+        {
+        resourceId = R_QTN_HS_CORRUPTED_IMAGE_NOTE;
+        }
+
+    if( resourceId )
+        {
+        ShowInfoNoteL( resourceId );
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CreateSkinBitmapL
+// -----------------------------------------------------------------------------
+//
+CFbsBitmap* CreateSkinBitmapL( TAknsItemID aId, TRect aRect )
+    {
+    CFbsBitmap* newBitmap = new ( ELeave ) CFbsBitmap;
+    User::LeaveIfError( newBitmap->Create( aRect.Size(), EColor16M ) );
+    CleanupStack::PushL( newBitmap );
+            
+    CFbsBitmapDevice* bitmapDev = CFbsBitmapDevice::NewL( newBitmap );
+    CleanupStack::PushL( bitmapDev );
+
+    CBitmapContext* bc( NULL );
+    User::LeaveIfError( bitmapDev->CreateBitmapContext( bc ) );
+    CleanupStack::PushL( bc );
+
+    CAknsBasicBackgroundControlContext* context = 
+        CAknsBasicBackgroundControlContext::NewL( aId, aRect, EFalse );
+    CleanupStack::PushL( context );
+
+    AknsDrawUtils::Background( AknsUtils::SkinInstance(),
+        context, static_cast< CWindowGc& >( *bc ), aRect );
+
+    CleanupStack::PopAndDestroy( 3, bitmapDev );
+    CleanupStack::Pop( newBitmap );
+    return newBitmap;
+    }
 
 // ============================ MEMBER FUNCTIONS ===============================
 
@@ -64,7 +139,8 @@
 //
 CXnBackgroundManager::CXnBackgroundManager( CXnViewManager& aViewManager, CHspsWrapper& aWrapper )
     : iViewManager( aViewManager ), 
-      iHspsWrapper( aWrapper )
+      iHspsWrapper( aWrapper ),
+      iStoreWallpaper( ETrue )
     {
     }
 
@@ -89,9 +165,9 @@
     MakeVisible( ETrue );
     ActivateL();
     iIntUpdate = 0;
+    
     User::LeaveIfError( iSkinSrv.Connect( this ) );
-    iSkinSrv.EnableSkinChangeNotify();  
-    
+          
     // Start listening for drive events.
     User::LeaveIfError( iFsSession.Connect() );
     
@@ -101,12 +177,8 @@
     
     // Reads from cenrep wheteher page specific wallpaper is enabled or not
     CheckFeatureTypeL();   
-
-    iTimer = CPeriodic::NewL( CActive::EPriorityIdle );
-
-    GfxTransEffect::Register( this, KGfxContextBgAppear );    
-
-    iOomSysHandler = CXnOomSysHandler::NewL();
+    
+    GfxTransEffect::Register( this, KGfxContextBgAppear );       
     }
 
 // -----------------------------------------------------------------------------
@@ -131,16 +203,15 @@
 CXnBackgroundManager::~CXnBackgroundManager()
     {
     GfxTransEffect::Deregister( this );
-    
-    delete iTimer;
-    CleanCache();
+        
+    iSkinSrv.RemoveAllWallpapers();
     iSkinSrv.Close();
     delete iDiskNotifier;
     iFsSession.Close();
     delete iBgContext;
     delete iBgImage;
-    delete iBgImagePath;
-    delete iOomSysHandler;
+    delete iBgImagePath;    
+    delete iSpBitmap;
     delete iSpMask;   
     }
 
@@ -151,6 +222,7 @@
 void CXnBackgroundManager::Draw(const TRect& aRect) const
     {
     CFbsBitmap* wallpaper( NULL );
+    
     if( iType == EPageSpecific )
         {
         CXnViewData& viewData( iViewManager.ActiveViewData() );
@@ -167,7 +239,8 @@
         TSize bitmapSize = wallpaper->SizeInPixels();
         
         // If image is smaller that screen size it needs to be centralized
-        if( iRect.Height() > bitmapSize.iHeight && iRect.Width() > bitmapSize.iWidth )
+        if( iRect.Height() > bitmapSize.iHeight && 
+            iRect.Width() > bitmapSize.iWidth )
             {
             TInt width = bitmapSize.iWidth / 2;
             TInt height = bitmapSize.iHeight / 2;
@@ -183,6 +256,7 @@
             {
             SystemGc().DrawBitmap( iRect, wallpaper );
             }
+        
         DrawStatusPaneMask();
         }
     
@@ -207,11 +281,12 @@
 void CXnBackgroundManager::SizeChanged()
     {
     iRect = Rect();
-    if( iType == EPageSpecific )
+    
+    if ( iType == EPageSpecific )
         {
         TRAP_IGNORE( UpdateWallpapersL() );
         }
-    else if( iType == ECommon ) 
+    else if ( iType == ECommon ) 
         {
         if( iBgImagePath )
             {
@@ -220,35 +295,17 @@
             TRAP_IGNORE( iBgImage = iSkinSrv.WallpaperImageL( *iBgImagePath ) );
             }
         }
+    
     iBgContext->SetRect( iRect );
     
-    // create status pane mask image and set size
-    if( iSpMask )
+    TRAPD( err, UpdateStatuspaneMaskL() );
+    if( err )
         {
+        delete iSpBitmap;
+        iSpBitmap = NULL;
         delete iSpMask;
         iSpMask = NULL;
         }
-    
-    TRect spRect;
-    AknLayoutUtils::LayoutMetricsRect( AknLayoutUtils::EStatusPane, spRect );
-    
-    TInt err( KErrNone );    
-    
-    if( Layout_Meta_Data::IsLandscapeOrientation() )
-        {
-        TRAP( err, iSpMask = AknsUtils::CreateBitmapL( AknsUtils::SkinInstance(),
-                KAknsIIDQgnGrafBgLscTopMaskIcon ) );
-        }
-    else
-        {
-        TRAP( err, iSpMask = AknsUtils::CreateBitmapL( AknsUtils::SkinInstance(),
-                KAknsIIDQgnGrafBgPrtTopMaskIcon ) );        
-        }
-    
-    if( iSpMask )
-        {
-        AknIconUtils::SetSize( iSpMask, spRect.Size(), EAspectRatioNotPreserved );
-        }
     }
 
 // -----------------------------------------------------------------------------
@@ -257,32 +314,30 @@
 // 
 void CXnBackgroundManager::MakeVisible( TBool aVisible )
     {    
-    CCoeControl::MakeVisible( aVisible );
-    if ( aVisible && iScreenUpdateNeeded )
+    CCoeControl::MakeVisible( aVisible );      
+    
+    if ( aVisible )
         {
-        iScreenUpdateNeeded = EFalse;
         DrawNow();
         }
     }
 
-
 // -----------------------------------------------------------------------------
 // Handle disk drive notifications.
 // -----------------------------------------------------------------------------
 //
-void CXnBackgroundManager::HandleNotifyDisk(
-        TInt /*aError*/,
-        const TDiskEvent& aEvent )
+void CXnBackgroundManager::HandleNotifyDisk( TInt /*aError*/, 
+    const TDiskEvent& aEvent )              
     {
     if( aEvent.iType == MDiskNotifyHandlerCallback::EDiskStatusChanged )
         {
         if( !( aEvent.iInfo.iDriveAtt & KDriveAttInternal ) ) 
             {        
             TBool diskRemoved( aEvent.iInfo.iType == EMediaNotPresent );
+            
             if( diskRemoved )
                 {
-                // TODO:
-                //TRAP_IGNORE( RemovableDiskRemovedL() );
+                TRAP_IGNORE( RemovableDiskRemovedL() );        
                 }
             else
                 {
@@ -293,62 +348,91 @@
     }
 
 // -----------------------------------------------------------------------------
-// CXnBackgroundManager::CacheWallpaperL
+// CXnBackgroundManager::ConstructWallpaper
 // -----------------------------------------------------------------------------
 //
-TInt CXnBackgroundManager::CacheWallpaperL( const TDesC& aFileName, CXnViewData& aViewData )
+TInt CXnBackgroundManager::ConstructWallpaper( const TDesC& aFileName, 
+    CXnViewData& aViewData )
     {
-    if( aFileName == KNullDesC )
-        {
-        return KErrArgument;
-        }
-
-    aViewData.SetWallpaperImagePathL( aFileName );
+    TRAP_IGNORE( aViewData.SetWallpaperImagePathL( aFileName ) );
     aViewData.SetWallpaperImage( NULL );
 
-    TBool err( KErrNone );
-    TRAP( err, iSkinSrv.AddWallpaperL( aFileName, iRect.Size() ) );
+    TRAPD( err, iSkinSrv.AddWallpaperL( aFileName, iRect.Size() ) );
     if( err == KErrNone )
-        {    
-        CFbsBitmap* bitmap( NULL );
-        CleanupStack::PushL( bitmap );
-        TRAP( err, bitmap = iSkinSrv.WallpaperImageL( aFileName ) );
-        if( err == KErrNone && bitmap )
-            {
-            aViewData.SetWallpaperImage( bitmap ); // Ownership tranferred
-            }        
-        else
-            {
-            iSkinSrv.RemoveWallpaper( aFileName );
-            }
-        CleanupStack::Pop();
-        }
+        {
+        UpdateViewData( aFileName, aViewData );
+        }  
+    
     return err;
     }
 
 // ---------------------------------------------------------------------------
-// CXnBackgroundManager::AddWallpaperL
+// CXnBackgroundManager::SetWallpaperL
 // ---------------------------------------------------------------------------
 //
-TInt CXnBackgroundManager::AddWallpaperL( const TDesC& aFileName )
+void CXnBackgroundManager::SetWallpaperL()
     {
-    TInt retVal( KErrNone );
+    TInt selectedIndex( 0 );
+
+    CAknListQueryDialog* query =
+        new ( ELeave ) CAknListQueryDialog( &selectedIndex );   
+    query->PrepareLC( R_LISTQUERY_CHANGE_WALLPAPER );
+
+    if ( !query->RunLD() )
+        {
+        // Query canceled
+        return;
+        }
+           
+    CXnAppUiAdapter& appui( iViewManager.AppUiAdapter() );
     
-    GfxTransEffect::Begin( this, KGfxControlActionAppear );
-                   
+    if ( selectedIndex == 0 )
+        {
+        // Set wallpaper to default skin
+        SetWallpaper( KNullDesC );
+        
+        appui.EffectManager()->BgAppearEffect( this, ETrue );        
+        }
+    else if ( selectedIndex == 1 )
+        {
+        if ( CXnOomSysHandler::HeapAvailable( CXnOomSysHandler::EMem6MB ) )
+            {                                      
+            appui.ActivateLocalViewL( KWallpaperViewUid, KDummyUid, KSingle );
+            
+            appui.EffectManager()->BeginFullscreenEffectL( KGfxContextOpenWallpaperView );            
+            }
+        else
+            {
+            // Potentially not enough memory
+            iViewManager.OomSysHandler().HandlePotentialOomL();        
+            }
+        }        
+    }
+    
+// ---------------------------------------------------------------------------
+// CXnBackgroundManager::SetWallpaper
+// ---------------------------------------------------------------------------
+//
+TBool CXnBackgroundManager::SetWallpaper( const TDesC& aFileName )
+    {
+    TInt err( KErrNone );
+                         
     if ( iType == EPageSpecific )
         {
-        retVal = AddPageSpecificWallpaperL( aFileName );
+        TRAP( err, SetPageSpecificWallpaperL( aFileName ) );
         }
     else if ( iType == ECommon )
         {
-        retVal = AddCommonWallpaperL( aFileName );
+        TRAP( err, SetCommonWallpaperL( aFileName ) );
         }
     
-    GfxTransEffect::SetDemarcation( this, Position() );    
-    GfxTransEffect::End( this );
-    
-    return retVal;
+    if( err )
+        {
+        TRAP_IGNORE( HandleErrorL( err ) );
+        return EFalse;
+        }
+        
+    return ETrue;
     }
 
 // ---------------------------------------------------------------------------
@@ -379,7 +463,31 @@
         iBgImage = NULL;
         }
     }
-    
+
+// -----------------------------------------------------------------------------
+// CXnBackgroundManager::ChangeWallpaper
+// -----------------------------------------------------------------------------
+//
+void CXnBackgroundManager::ChangeWallpaper( const CXnViewData& aOldView, 
+    const CXnViewData& aNewView, TBool aDrawNow )
+    {
+    if( iType == EPageSpecific )
+        {
+        const TDesC& oldwp( aOldView.WallpaperImagePath() );
+        const TDesC& newwp( aNewView.WallpaperImagePath() ); 
+            
+        if ( oldwp.Compare( newwp ) ) 
+            {
+            iStoreWallpaper = ETrue;                    
+            
+            if ( aDrawNow )
+                {
+                DrawNow();
+                }
+            }
+        }
+    }
+
 // ---------------------------------------------------------------------------
 // CXnBackgroundManager::WallpaperType
 // ---------------------------------------------------------------------------
@@ -388,26 +496,28 @@
     {
     return iType;
     }
-
-// -----------------------------------------------------------------------------
-// CXnBackgroundManager::WallpaperChanged
-// -----------------------------------------------------------------------------
+	
+// ---------------------------------------------------------------------------
+// CXnBackgroundManager::UpdateViewData
+// ---------------------------------------------------------------------------
 //
-void CXnBackgroundManager::WallpaperChanged( const CXnViewData& aOldView, 
-    const CXnViewData& aNewView )
+void CXnBackgroundManager::UpdateViewData( const TDesC& aFileName,
+    CXnViewData& aViewData )
     {
-    if( iType == EPageSpecific && 
-        aOldView.WallpaperImagePath().Compare( aNewView.WallpaperImagePath() ) )
+    TRAP_IGNORE( aViewData.SetWallpaperImagePathL( aFileName ) );
+    
+    if( aFileName == KNullDesC )
         {
-        UpdateScreen();
-
-        // Since AknsWallpaperUtils::SetIdleWallpaper() call is slow, it is called
-        // asynchronously. In that way we can avoid it slowing down page switching.
-        if ( iTimer->IsActive() )
+        aViewData.SetWallpaperImage( NULL );
+        }
+    else
+        {
+        CFbsBitmap* bitmap( NULL );
+        TRAPD( err, bitmap = iSkinSrv.WallpaperImageL( aFileName ) );
+        if( err == KErrNone && bitmap )
             {
-            iTimer->Cancel();
-            }
-        iTimer->Start(KCallbackDelay, KCallbackDelay, TCallBack( TimerCallback, this ) );
+            aViewData.SetWallpaperImage( bitmap ); // Ownership tranferred
+            }        
         }
     }
 
@@ -518,52 +628,21 @@
     
     return ret;
     }
-
-// ---------------------------------------------------------------------------
-// CXnBackgroundManager::SetWallpaperL
-// ---------------------------------------------------------------------------
-//
-void CXnBackgroundManager::SetWallpaperL()
-    {
-    TInt selectedIndex( 0 );
-
-    CAknListQueryDialog* query =
-        new ( ELeave ) CAknListQueryDialog( &selectedIndex );
-    CleanupStack::PushL( query );
-    query->PrepareLC( R_LISTQUERY_CHANGE_WALLPAPER );
-
-    if ( query->RunLD() )
-        {
-        if ( selectedIndex == 0 )
-            {
-            AddWallpaperL( KNullDesC );
-            }
-        else if ( selectedIndex == 1 )
-            {
-            if ( CXnOomSysHandler::HeapAvailable( CXnOomSysHandler::EMem6MB ) )
-                {
-            CXnAppUiAdapter& appui( iViewManager.AppUiAdapter() );
-            
-            appui.EffectManager()->BeginFullscreenEffectL(
-                KGfxContextOpenWallpaperView, iViewManager.ActiveViewData() );        
-            
-            appui.ActivateLocalViewL( KWallpaperViewUid, KDummyUid, KSingle );                                 
-                }
-            else
-            	{
-            	OomSysHandler().HandlePotentialOomL();
-            	}
-            }
-        }
-    CleanupStack::Pop( query );
-    }
     
 // ---------------------------------------------------------------------------
 // CXnBackgroundManager::SkinContentChanged
 // ---------------------------------------------------------------------------
 //
 void CXnBackgroundManager::SkinContentChanged()
-    {    
+    {   
+    TRAPD( err, UpdateStatuspaneMaskL() );
+    if( err )
+        {
+        delete iSpBitmap;
+        iSpBitmap = NULL;
+        delete iSpMask;
+        iSpMask = NULL;
+        }
     }
     
 // ---------------------------------------------------------------------------
@@ -586,7 +665,7 @@
         }
     else if ( aReason == EAknsSkinStatusConfigurationDeployed )
         {
-        UpdateScreen();
+        DrawNow();
         }
     }
     
@@ -600,21 +679,17 @@
     }
 
 // -----------------------------------------------------------------------------
-// CXnBackgroundManager::CleanCache
-// -----------------------------------------------------------------------------
-//
-void CXnBackgroundManager::CleanCache()
-    {
-    iSkinSrv.RemoveAllWallpapers();
-    }
-
-// -----------------------------------------------------------------------------
 // CXnBackgroundManager::RemoveWallpaper
 // -----------------------------------------------------------------------------
 //
 void CXnBackgroundManager::RemoveWallpaperFromCache( const TDesC& aFileName,
     CXnViewData* aViewData )
     {
+    if( aFileName == KNullDesC )
+        {
+        return;
+        }
+    
     CXnViewData* currentViewData( aViewData );
     if( !currentViewData )
         {
@@ -642,17 +717,6 @@
     }
 
 // -----------------------------------------------------------------------------
-// CXnBackgroundManager::RemoveWallpaper
-// -----------------------------------------------------------------------------
-//
-void CXnBackgroundManager::RemoveWallpaperL( CXnViewData& aViewData )
-    {
-    aViewData.SetWallpaperImagePathL( KNullDesC );
-    aViewData.SetWallpaperImage( NULL );
-    SetSettingPropertyL( aViewData.PluginId(), KWallpaper, KPath, KNullDesC8 );
-    }
-
-// -----------------------------------------------------------------------------
 // CXnBackgroundManager::UpdateWallpapersL
 // -----------------------------------------------------------------------------
 //
@@ -681,11 +745,74 @@
     }
 
 // -----------------------------------------------------------------------------
+// CXnBackgroundManager::RemovableDiskRemovedL
+// -----------------------------------------------------------------------------
+//
+void CXnBackgroundManager::RemovableDiskRemovedL()
+    {
+    TInt drawingNeeded( EFalse );
+    RFs& fs( CEikonEnv::Static()->FsSession() );
+
+    if( iType == EPageSpecific )
+        {
+        CXnRootData& rootData = iViewManager.ActiveAppData();
+        if( !&rootData )
+            {
+            return;
+            }
+        RPointerArray<CXnPluginData>& rootDataArr = rootData.PluginData();
+        for( TInt i = 0; i < rootDataArr.Count(); i++ )
+            {
+            CXnViewData* viewData = static_cast<CXnViewData*>( rootDataArr[i] );
+            const TDesC& path = viewData->WallpaperImagePath();
+            CFbsBitmap* bitmap = viewData->WallpaperImage();
+            if( path != KNullDesC && bitmap )
+                {
+                if ( !BaflUtils::FileExists( fs, path ) )
+                    {
+                    viewData->SetWallpaperImage( NULL );
+                    if( viewData == &iViewManager.ActiveViewData() )
+                        {
+                        drawingNeeded = ETrue;
+                        }
+                    }
+                }
+            }
+        }
+    else
+        {
+        if( iBgImagePath && iBgImage )
+            {
+            if ( !BaflUtils::FileExists( fs, *iBgImagePath ) )
+                {
+                delete iBgImage;
+                iBgImage = NULL;
+                drawingNeeded = ETrue;
+                }
+            }
+        }
+
+    if( drawingNeeded )
+        {
+        DrawNow();
+        
+        iIntUpdate++;
+        TInt err = AknsWallpaperUtils::SetIdleWallpaper( KNullDesC , NULL );
+        if( err )
+            {
+            iIntUpdate--;
+            }  
+        }    
+    }
+
+// -----------------------------------------------------------------------------
 // CXnBackgroundManager::RemovableDiskInsertedL
 // -----------------------------------------------------------------------------
 //
 void CXnBackgroundManager::RemovableDiskInsertedL()
     {
+    RFs& fs( CEikonEnv::Static()->FsSession() );
+
     if( iType == EPageSpecific )
         {
         CXnRootData& rootData = iViewManager.ActiveAppData();
@@ -702,30 +829,38 @@
             CFbsBitmap* bitmap = viewData->WallpaperImage();
             if( path != KNullDesC && !bitmap )
                 {
-                TInt err = CacheWallpaperL( path, *viewData );
-                if( err == KErrNone && viewData == &iViewManager.ActiveViewData() )
+                if ( BaflUtils::FileExists( fs, path ) )
                     {
-                    drawingNeeded = ETrue;
+                    TInt err = ConstructWallpaper( path, *viewData );
+                    if( err == KErrNone && viewData == &iViewManager.ActiveViewData() )
+                        {
+                        drawingNeeded = ETrue;
+                        }
                     }
                 }
             }
         if( drawingNeeded )
             {
-            UpdateScreen();
-            
-            TInt err = AknsWallpaperUtils::SetIdleWallpaper( 
-                iViewManager.ActiveViewData().WallpaperImagePath(), NULL );
-            if( err == KErrNone )
-                {
-                iIntUpdate++;
-                }   
+            DrawNow();
+            iStoreWallpaper = ETrue;
+            StoreWallpaperL();
             }    
         }
     else
         {
-        if( iBgImagePath )
+        if( iBgImagePath && !iBgImage )
             {
-            AddCommonWallpaperL( *iBgImagePath, EFalse );
+            if ( BaflUtils::FileExists( fs, *iBgImagePath ) )
+                {
+                TRAPD( err, SetCommonWallpaperL( *iBgImagePath, EFalse ) );
+                if( err == KErrCANoRights )
+                    {
+                    ShowInfoNoteL( R_QTN_HS_DRM_PROTECTED_IMAGE_NOTE );
+                    delete iBgImagePath;
+                    iBgImagePath = NULL;
+                    SaveWallpaperL();
+                    }
+                }
             }
         }
     }
@@ -750,11 +885,13 @@
             }
         else
             {
+            iStoreWallpaper = EFalse;
+
             TFileName path;
             err = repository->Get( KAIWallpaperPath, path );
             if ( !err && path.Length())
                 {
-                AddCommonWallpaperL( path, EFalse );
+                TRAP_IGNORE( SetCommonWallpaperL( path, EFalse, EFalse ) );
                 }
             }
         }
@@ -762,111 +899,105 @@
     }
 
 // ---------------------------------------------------------------------------
-// CXnBackgroundManager::AddPageSpecificWallpaperL
+// CXnBackgroundManager::SetPageSpecificWallpaperL
 // ---------------------------------------------------------------------------
 //
-TInt CXnBackgroundManager::AddPageSpecificWallpaperL( const TDesC& aFileName )
+void CXnBackgroundManager::SetPageSpecificWallpaperL( const TDesC& aFileName )
     {
-    TInt err = KErrNone;
     CXnViewData& viewData( iViewManager.ActiveViewData() );
-    const TDesC& old = viewData.WallpaperImagePath();
-
-    // Remove old from the cache
-    if( old != KNullDesC )
-        {
-        RemoveWallpaperFromCache( old );
-        }
 
-    // Add new to the cache
-    if( aFileName != KNullDesC )
+    TInt err( KErrNone );
+    iIntUpdate++;
+
+    if(  aFileName == KNullDesC )
         {
-        err = CacheWallpaperL( aFileName, viewData ); 
-    
-        if( err == KErrNone )
-            {
-            SaveWallpaperL(); // to HSPS
-            }
-        else
-            {
-            return err;
-            }
+        err = AknsWallpaperUtils::SetIdleWallpaper( aFileName, NULL );
         }
-    // WallpaperImage changed back to default. Update view data.
     else
         {
-        viewData.SetWallpaperImagePathL( KNullDesC );
-        viewData.SetWallpaperImage( NULL ); 
+        // Wallpaper is also added into the cache if it is not there already.
+        err = AknsWallpaperUtils::SetIdleWallpaper( aFileName, CCoeEnv::Static(),
+            R_QTN_HS_PROCESSING_NOTE, R_CHANGE_WALLPAPER_WAIT_DIALOG );    
+        }
+    if( err == KErrNone )
+        {
+        // Remove old wallpaper from the cache
+        const TDesC& oldPath = viewData.WallpaperImagePath();
+        RemoveWallpaperFromCache( oldPath );
+
+        UpdateViewData( aFileName, viewData );
+
         SaveWallpaperL(); // to HSPS
         }
-
-    // Update screen
-    UpdateScreen();
-    
-    err = AknsWallpaperUtils::SetIdleWallpaper( aFileName, NULL );
-    if( err == KErrNone )
+    else
         {
-        iIntUpdate++;
+        iIntUpdate--;
+        User::Leave( err );
         }
-        
-    return err;
     }
         
 // ---------------------------------------------------------------------------
-// CXnBackgroundManager::AddCommonWallpaperL
+// CXnBackgroundManager::SetCommonWallpaperL
 // ---------------------------------------------------------------------------
 //
-TInt CXnBackgroundManager::AddCommonWallpaperL( const TDesC& aFileName, 
-    TBool aSave )
+void CXnBackgroundManager::SetCommonWallpaperL( const TDesC& aFileName, 
+    TBool aSave, TBool aShowProgressBar )
     {
-    TInt err = KErrNone;      
-    // Remove old from the cache
-    if( iBgImagePath )
+    TInt err( KErrNone );
+    iIntUpdate++;
+
+    if(  aFileName == KNullDesC || !aShowProgressBar )
         {
-        iSkinSrv.RemoveWallpaper( *iBgImagePath );          
-        delete iBgImagePath;
-        iBgImagePath = NULL;
+        err = AknsWallpaperUtils::SetIdleWallpaper( aFileName, NULL );
         }
-    delete iBgImage;
-    iBgImage = NULL;
+    else
+        {
+        // Wallpaper is also added into the cache if it is not there already.
+        err = AknsWallpaperUtils::SetIdleWallpaper( aFileName, CCoeEnv::Static(),
+            R_QTN_HS_PROCESSING_NOTE, R_CHANGE_WALLPAPER_WAIT_DIALOG );    
+        }
 
-    if( aFileName != KNullDesC )
+    if( !err )
         {
-        iBgImagePath = aFileName.AllocL();
-    
-        err = KErrNone;
-        TRAP( err, iSkinSrv.AddWallpaperL( aFileName, iRect.Size() ) );
-        if( err != KErrNone )
+        // Remove old from the cache
+        if( iBgImagePath && iBgImagePath->Compare( aFileName ) )
             {
-            return err;
+            iSkinSrv.RemoveWallpaper( *iBgImagePath );          
+            delete iBgImagePath;
+            iBgImagePath = NULL;
             }
-        
-        TRAP( err, iBgImage = iSkinSrv.WallpaperImageL( aFileName ) );
-        if( err )
+        delete iBgImage;
+        iBgImage = NULL;
+
+        if( aFileName != KNullDesC )
             {
-            iSkinSrv.RemoveWallpaper( aFileName );
-            delete iBgImage;
-            iBgImage = NULL;
-            // image is corrupted or format is not supported
-            return KErrCACorruptContent;
-            }
+            iBgImagePath = aFileName.AllocL();
+
+            TRAPD( err, iBgImage = iSkinSrv.WallpaperImageL( aFileName ) );
+            if( err )
+                {
+                delete iBgImage;
+                iBgImage = NULL;
+                delete iBgImagePath;
+                iBgImagePath = NULL;
+                User::Leave( err );
+                }
+            }    
+        }
+    else
+        {
+        iIntUpdate--;
+        User::Leave( err );
         }
     
     // Update screen
-    UpdateScreen();        
+    DrawNow();        
 
     // Save path to cenrep
     if( aSave )
         {
         SaveWallpaperL();
         }
-
-    err = AknsWallpaperUtils::SetIdleWallpaper( aFileName, NULL );
-    if( err == KErrNone )
-        {
-        iIntUpdate++;
-        }
-
-    return err;
     }
 
 // ---------------------------------------------------------------------------
@@ -883,66 +1014,52 @@
         TInt err = repository->Get( KPslnWallpaperType, wallpaperType );
         if ( err == KErrNone )
             {
-            if ( wallpaperType == 0 )
+            TFileName wallpaper;            
+            
+            // WallpaperImage is image
+            // Get wallpaper image path from cenrep
+            if ( wallpaperType == 1 )
                 {
-                if( iType == EPageSpecific )
-                    {
-                    CXnViewData& viewData( iViewManager.ActiveViewData() );
-                    RemoveWallpaperFromCache( viewData.WallpaperImagePath() );
-                    RemoveWallpaperL( viewData );                        
-                    } 
-                else if( iType == ECommon )
+                err = repository->Get( KPslnIdleBackgroundImagePath, wallpaper );
+                if ( err != KErrNone )
                     {
-                    if( iBgImagePath )
-                        {
-                        iSkinSrv.RemoveWallpaper( *iBgImagePath );
-                        delete iBgImagePath;
-                        iBgImagePath = NULL;
-                        }
-                    delete iBgImage;
-                    iBgImage = NULL;
-                    SaveWallpaperL();
+                    return;
                     }
                 }
-            else if ( wallpaperType == 1 )
+                
+            if( iType == EPageSpecific )
                 {
-                // WallpaperImage is image
-                // Get wallpaper image path from cenrep and save it
-                TFileName wallpaper;            
-                err = repository->Get( KPslnIdleBackgroundImagePath, wallpaper );
-                if ( err == KErrNone )
+                CXnViewData& viewData( iViewManager.ActiveViewData() );
+                RemoveWallpaperFromCache( viewData.WallpaperImagePath() );
+                viewData.SetWallpaperImagePathL( KNullDesC );
+                viewData.SetWallpaperImage( NULL );
+                if( wallpaperType == 1 )
                     {
-                    if( iType == EPageSpecific )
-                        {
-                        AddPageSpecificWallpaperL( wallpaper );
-                        }
-                    else if( iType == ECommon )
-                        {
-                        AddCommonWallpaperL( wallpaper, EFalse );
-                        }
-                    }                
+                    UpdateViewData( wallpaper, viewData );
+                    }
+                } 
+            else if( iType == ECommon )
+                {
+                if( iBgImagePath )
+                    {
+                    iSkinSrv.RemoveWallpaper( *iBgImagePath );
+                    delete iBgImagePath;
+                    iBgImagePath = NULL;
+                    }
+                delete iBgImage;
+                iBgImage = NULL;
+                if( wallpaperType == 1 )
+                    {
+                    iBgImagePath = wallpaper.AllocL();                
+                    iBgImage = iSkinSrv.WallpaperImageL( wallpaper );
+                    }
                 }
-            UpdateScreen();
             }
 
-        CleanupStack::PopAndDestroy( repository );
+        SaveWallpaperL();
+        DrawNow();
         }    
-    }
-
-// ---------------------------------------------------------------------------
-// CXnBackgroundManager::UpdateScreen
-// ---------------------------------------------------------------------------
-//
-void CXnBackgroundManager::UpdateScreen()
-    {
-    if( !IsVisible() )
-        {
-        iScreenUpdateNeeded = ETrue;
-        }
-    else
-        {
-        DrawNow();  
-        }
+    CleanupStack::PopAndDestroy( repository );
     }
 
 // -----------------------------------------------------------------------------
@@ -962,46 +1079,101 @@
     }
 
 // -----------------------------------------------------------------------------
-// CXnBackgroundManager::TimerCallback
-// -----------------------------------------------------------------------------
-//
-TInt CXnBackgroundManager::TimerCallback(TAny *aPtr)
-    {
-    CXnBackgroundManager* bgManager = reinterpret_cast<CXnBackgroundManager*>( aPtr );    
-    bgManager->iTimer->Cancel();
-    
-    TInt err = AknsWallpaperUtils::SetIdleWallpaper( bgManager->
-        iViewManager.ActiveViewData().WallpaperImagePath(), NULL );
-    if( err == KErrNone )
-        {
-        bgManager->iIntUpdate++;
-        }   
-    return EFalse;
-    }
-
-// -----------------------------------------------------------------------------
 // CXnBackgroundManager::DrawStatusPaneMask
 // -----------------------------------------------------------------------------
 //
 void CXnBackgroundManager::DrawStatusPaneMask() const
     {
-    if( iSpMask )
+    if( iSpBitmap && iSpMask )
         {
         TSize bmpSize = iSpMask->SizeInPixels();
         TRect spRect( 0, 0, bmpSize.iWidth, bmpSize.iHeight );
-        SystemGc().DrawBitmap( spRect, iSpMask );
+        SystemGc().DrawBitmapMasked( spRect, iSpBitmap, spRect, iSpMask, ETrue );
         }
     }
 
 // -----------------------------------------------------------------------------
-// CXnBackgroundManager::OOMSysHandler
+// CXnBackgroundManager::StoreWallpaperL
 // -----------------------------------------------------------------------------
 //
-CXnOomSysHandler& CXnBackgroundManager::OomSysHandler() const
+void CXnBackgroundManager::StoreWallpaperL()
     {
-    __ASSERT_DEBUG( iOomSysHandler , User::Panic( _L("xnbackgroundmanager"), 0 ) );
+    if ( iStoreWallpaper )
+        {   
+        iStoreWallpaper = EFalse;
+
+        CXnViewData& activeView = iViewManager.ActiveViewData();
+        const TDesC& path( activeView.WallpaperImagePath() );
+        if( path != KNullDesC && activeView.WallpaperImage() )
+            {
+            iIntUpdate++;
+            TInt err( AknsWallpaperUtils::SetIdleWallpaper( path, NULL ) ); 
+                  
+            if( err )
+                {
+                iIntUpdate--;
+                
+                if ( err == KErrCANoRights )
+                    {
+                    ShowInfoNoteL( R_QTN_HS_DRM_PROTECTED_IMAGE_NOTE );
+
+                    // Change wpp to default
+                    UpdateViewData( KNullDesC, iViewManager.ActiveViewData() );
+                    SaveWallpaperL();
+                    DrawNow();
+                    }            
+                }        
+            }
+        else
+            {
+            iIntUpdate++;
+            TInt err( AknsWallpaperUtils::SetIdleWallpaper( KNullDesC, NULL ) ); 
+            if( err )
+                {
+                iIntUpdate--;
+                }       
+            }
+        }       
+    }
 
-    return *iOomSysHandler;
+// -----------------------------------------------------------------------------
+// CXnBackgroundManager::UpdateStatuspaneMaskL
+// -----------------------------------------------------------------------------
+//
+void CXnBackgroundManager::UpdateStatuspaneMaskL()
+    {
+    if ( iSpBitmap )
+        {
+        delete iSpBitmap;
+        iSpBitmap = NULL;
+        }
+    if ( iSpMask )
+        {
+        delete iSpMask;
+        iSpMask = NULL;
+        }
+    
+    TRect spRect;
+    AknLayoutUtils::LayoutMetricsRect( AknLayoutUtils::EStatusPane, spRect );
+    
+    iSpBitmap = CreateSkinBitmapL( KAknsIIDQsnBgScreenIdle, spRect );
+    
+    if ( Layout_Meta_Data::IsLandscapeOrientation() )
+        {
+        iSpMask = AknsUtils::CreateBitmapL( AknsUtils::SkinInstance(),
+            KAknsIIDQgnGrafBgLscTopMaskIcon );
+        }
+    else
+        {
+        iSpMask = AknsUtils::CreateBitmapL( AknsUtils::SkinInstance(),
+            KAknsIIDQgnGrafBgPrtTopMaskIcon );        
+        }
+    
+    if ( iSpMask )
+        {
+        User::LeaveIfError( AknIconUtils::SetSize( 
+            iSpMask, spRect.Size(), EAspectRatioNotPreserved ) );
+        }
     }
 
 //  End of File