idlehomescreen/nativeuicontroller/src/ainavipanerenderer.cpp
changeset 0 f72a12da539e
child 9 f966699dea19
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/idlehomescreen/nativeuicontroller/src/ainavipanerenderer.cpp	Thu Dec 17 08:40:49 2009 +0200
@@ -0,0 +1,416 @@
+/*
+* Copyright (c) 2005-2007 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  Navipane renderer.
+*
+*/
+
+
+#include <aipropertyextension.h>
+#include <centralrepository.h>
+#include <ProfileEngineSDKCRKeys.h>
+
+#include "ainavipanerenderer.h"
+#include "ainavipaneanimator.h"
+#include "aistatuspanel.h"
+#include "ainativeuimodel.h"
+#include "ainativeuiplugins.h"
+#include "contentprioritymap.h"
+#include <aicontentrequest.h>
+#include "debug.h"
+
+using namespace AiNativeUiController;
+
+
+void CAiNaviPaneRenderer::ConstructL()
+    {
+    iAnimator = CAiNaviPaneAnimator::NewL( iStatusPanel, 
+                                           iRenderingPriorities, 
+                                           *this );
+    iProfileText = HBufC::NewL(0);
+    iSilentIndicator = HBufC::NewL(0);
+    }
+
+
+CAiNaviPaneRenderer* CAiNaviPaneRenderer::NewLC( 
+        CAiStatusPanel& aStatusPanel )
+    {
+    CAiNaviPaneRenderer* self = new( ELeave ) CAiNaviPaneRenderer( aStatusPanel );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    return self;
+    }
+
+
+CAiNaviPaneRenderer::~CAiNaviPaneRenderer()
+    { 
+    delete iAnimator;
+    delete iProfileText;
+    delete iSilentIndicator; 
+    delete iTimedProfileIndicator;
+    }
+
+
+CAiNaviPaneRenderer::CAiNaviPaneRenderer( CAiStatusPanel& aStatusPanel )
+    : iStatusPanel( aStatusPanel ), 
+    iRenderingPriorities( AiNativeUiModel::RenderingPriorities( AiNativeUiModel::KNaviPaneId ) ),
+    iCurrentContent(KAiNullContentId),
+    iCurrentPriority(AiNativeUiModel::KNoPriority)
+    {
+    }
+
+
+void CAiNaviPaneRenderer::DoPublishL( MAiPropertyExtension& aPlugin,
+                                      TInt aContent, 
+                                      const TDesC16& aText,
+                                      TInt /*aIndex*/ )
+    {
+    if( aPlugin.PublisherInfoL()->iUid == KDeviceStatusPluginUid )
+           {
+        switch( aContent )
+            {
+            // FALLTHROUGH
+            case EAiDeviceStatusContentDate:
+            case EAiDeviceStatusContentProfileName:
+            case EAiDeviceStatusContentGeneralProfileName:
+                {
+                __PRINT(__DBG_FORMAT("XAI: Render navi pane - %d, %S"), aContent, &aText );
+                
+                const TInt priority = iRenderingPriorities.RenderingPriority( aContent );
+                
+                // Get active profile ID
+                CRepository* profileApi;
+                TInt         profileId;
+                profileApi = CRepository::NewL( KCRUidProfileEngine );
+                TInt err = profileApi->Get( KProEngActiveProfile, profileId );
+                delete profileApi;
+
+                if ( aContent == EAiDeviceStatusContentGeneralProfileName )
+                    {
+                    const TInt KGeneralProfileId( 0 );
+                    if (profileId == KGeneralProfileId) 
+                        {
+                        iAnimator->AddItemL( EAiDeviceStatusContentGeneralIndicator, aText );
+                        }
+//                    iAnimator->AddItemL( EAiDeviceStatusContentGeneralIndicator, aText );
+//                    iAnimator->AddItemL( EAiDeviceStatusContentGeneralProfileName, aText );
+
+                    iAnimator->AnimateL();
+                    }
+
+          
+                if( (priority >= iCurrentPriority) || !iIsSilent || !iIsTimed )
+                    {
+                    if( priority >= iCurrentPriority )
+                        {
+                        delete iProfileText;
+                        iProfileText = NULL;
+                        iProfileText = aText.AllocL();
+                        iIsOldTextChanged = ETrue;
+
+                        iCurrentPriority = priority;
+                        iCurrentContent = aContent;
+                        }
+
+                    HBufC* newText = ConstructProfileTextLC();
+
+                    if( !iAnimator->IsActive() )
+                        {
+                        iStatusPanel.SetNaviPaneTextL( *newText );
+                        iStatusPanel.RenderNaviPaneL();
+                        }
+                    
+                    CleanupStack::PopAndDestroy( newText );
+                    }            
+                
+                __PRINTS( "XAI: Render navi pane - priority check failed");
+                break;
+                }
+
+            case EAiDeviceStatusContentSilentIndicator:
+                {
+                __PRINT(__DBG_FORMAT("XAI: Render navi pane - %d, %S"), aContent, &aText );
+
+                const TInt priority = iRenderingPriorities.RenderingPriority( aContent );
+                
+                if( priority >= iCurrentPriority && iIsOldTextChanged )
+                    {
+                    delete iSilentIndicator;
+                    iSilentIndicator = NULL;
+                    iSilentIndicator = aText.AllocL();
+                    iIsSilent = ETrue;
+                    if( !iAnimator->IsActive() )
+                        {    
+                        HBufC* newText = ConstructProfileTextLC();
+                        iStatusPanel.SetNaviPaneTextL( *newText );
+                        iStatusPanel.RenderNaviPaneL();                        
+                        CleanupStack::PopAndDestroy( newText );
+                        }
+     
+                    
+
+                    
+                    // iCurrentContent is not assigned because silent indicator is 
+                    // rendered within the navi pane text
+                    
+                    __PRINTS( "XAI: Render navi pane - done");
+                    }                
+                __PRINTS( "XAI: Render navi pane - priority check failed");
+                break;
+                }
+            case EAiDeviceStatusContentTimedProfileIndicator:
+                {
+                __PRINT(__DBG_FORMAT("XAI: Render navi pane - %d, %S"), aContent, &aText );
+
+                const TInt priority = iRenderingPriorities.RenderingPriority( aContent );
+                
+                if( priority >= iCurrentPriority && iIsOldTextChanged )
+                    {
+                    delete iTimedProfileIndicator;
+                    iTimedProfileIndicator = NULL;
+                    iTimedProfileIndicator = aText.AllocL();
+                    iIsTimed = ETrue;
+                    
+                    if( !iAnimator->IsActive() )
+                        {    
+                        HBufC* newText = ConstructProfileTextLC();
+                        iStatusPanel.SetNaviPaneTextL( *newText );
+                        iStatusPanel.RenderNaviPaneL();                        
+                        CleanupStack::PopAndDestroy( newText );
+                        }
+     
+
+                    // iCurrentContent is not assigned because silent indicator is 
+                    // rendered within the navi pane text
+                    
+                    __PRINTS( "XAI: Render navi pane - done");
+                    }                
+                __PRINTS( "XAI: Render navi pane - priority check failed");
+                break;
+                }                
+
+            // FALLTHROUGH
+            case EAiDeviceStatusContentMCNIndicator:
+            case EAiDeviceStatusContentVHZIndicator:
+            case EAiDeviceStatusContentCUGIndicator:
+                {
+                iAnimator->AddItemL( aContent, aText );
+                if( !iAnimator->IsActive() )
+                    {
+                    iAnimator->AnimateL();
+                    }
+                iIsChanged = ETrue;
+                break;
+                }
+
+            default:
+                {
+                User::Leave( KErrNotFound );
+                break;
+                }
+            };
+           }       
+       else
+           {
+           User::Leave( KErrNotFound );    
+           }
+    }
+
+HBufC* CAiNaviPaneRenderer::ConstructProfileTextLC()
+    {
+    TInt bufLen = iProfileText->Length();
+    if ( iIsSilent )
+        {
+        bufLen += iSilentIndicator->Length();
+        }
+    if ( iIsTimed )
+        {
+        bufLen += iTimedProfileIndicator->Length();
+        }
+        
+    HBufC *temp = HBufC::NewLC( bufLen );
+     
+    if ( iIsSilent )
+        {
+        temp->Des().Append( *iSilentIndicator );
+        }
+    if ( iIsTimed )
+        {
+        temp->Des().Append( *iTimedProfileIndicator );
+        }
+        
+    temp->Des().Append( *iProfileText );
+    return temp;
+    }
+
+void CAiNaviPaneRenderer::DoCleanL( MAiPropertyExtension& aPlugin, TInt aContent )
+    {
+    if( aPlugin.PublisherInfoL()->iUid == KDeviceStatusPluginUid )
+        {    
+
+        switch( aContent )
+            {
+            case EAiDeviceStatusContentNetworkIdentity:
+                {
+                iAnimator->RemoveItem( EAiDeviceStatusContentGeneralIndicator );
+                break;
+                }
+
+            // FALLTHROUGH
+            case EAiDeviceStatusContentDate:
+            case EAiDeviceStatusContentProfileName:
+            case EAiDeviceStatusContentGeneralProfileName:
+            case EAiDeviceStatusContentSilentIndicator:
+            case EAiDeviceStatusContentTimedProfileIndicator:
+                {
+                __PRINT(__DBG_FORMAT("XAI: Cleaning navi pane - %d"), aContent );
+                
+                if ( aContent == EAiDeviceStatusContentSilentIndicator )
+                    {
+                    iIsSilent = EFalse;
+                    }
+                if ( aContent == EAiDeviceStatusContentTimedProfileIndicator )
+                    {
+                    iIsTimed = EFalse;
+                    }
+                if ( aContent == EAiDeviceStatusContentGeneralProfileName )
+                    {
+                    iAnimator->RemoveItem( EAiDeviceStatusContentGeneralIndicator );
+//                    iAnimator->RemoveItem( EAiDeviceStatusContentGeneralProfileName );
+                    }
+                if ( aContent == EAiDeviceStatusContentProfileName )
+                    {
+                    iAnimator->RemoveItem( EAiDeviceStatusContentProfileName );
+                    }
+           
+                TInt currentPriority = iCurrentPriority;
+
+                if( iCurrentContent == aContent )
+                    {
+                    iCurrentContent = KAiNullContentId;
+                    iCurrentPriority = AiNativeUiModel::KNoPriority;
+                    
+                    // Publish empty text
+                    iStatusPanel.SetNaviPaneTextL( KNullDesC );
+                    iStatusPanel.RenderNaviPaneL();
+
+                    MAiContentRequest* contentReq = static_cast<MAiContentRequest*>(
+                        aPlugin.GetPropertyL( EAiContentRequest ) );
+                        
+                    if ( contentReq )
+                        {
+                        TInt nextContentId;
+                        while ( iRenderingPriorities.GetNextContentId( 
+                                                        nextContentId, 
+                                                        currentPriority ) )
+                            {
+                            const TBool refreshed = contentReq->RefreshContent( nextContentId );
+                            if ( refreshed )
+                                {
+                                break;
+                                }
+                            }
+                        }
+                                    
+                    }                    
+                __PRINTS( "XAI: Cleaning navi pane - done");    
+                break;
+                }
+
+            case EAiDeviceStatusContentMCNIndicator:
+            case EAiDeviceStatusContentVHZIndicator:
+            case EAiDeviceStatusContentCUGIndicator:
+                {
+                iAnimator->RemoveItem( aContent );
+                break;
+                }
+
+            default:
+                {
+                User::Leave( KErrNotFound );
+                break;
+                }
+            };
+        }
+    else
+        {
+        User::Leave( KErrNotFound );    
+        }    
+    
+    }
+
+
+void CAiNaviPaneRenderer::FocusObtainedL()
+    {
+    if( !iStatusPanel.IsKeyLockEnabled() )
+        {
+        iAnimator->AnimateL();
+        }
+    iFocusObtained = ETrue;    
+    }
+
+
+void CAiNaviPaneRenderer::FocusLostL()
+    {
+    iAnimator->CancelAnimationL();
+    iFocusObtained = EFalse;
+    iCommitted = EFalse;
+    }
+
+
+void CAiNaviPaneRenderer::KeylockDisabledL()
+    {
+    iAnimator->AnimateL();
+    }
+ 
+    
+void CAiNaviPaneRenderer::KeylockEnabledL()
+    {
+    iAnimator->CancelAnimationL();
+    }
+    
+
+void CAiNaviPaneRenderer::TransactionCommittedL()
+    {
+    if( iIsChanged )
+        {
+        if( iFocusObtained && !iCommitted && !iStatusPanel.IsKeyLockEnabled() )
+            {
+            iAnimator->AnimateL();
+            iCommitted = ETrue;
+            }
+        iIsChanged = EFalse;
+        }
+    }
+    
+    
+void CAiNaviPaneRenderer::AnimationCompleteL()
+    {
+    // Navi pane animation is now completed -> show original text
+    HBufC* newText = NULL;
+
+    if ( iProfileText->Length() > 0 )
+        {
+        newText = ConstructProfileTextLC();
+        }
+    else
+        {
+        return;
+        }
+
+    iStatusPanel.SetNaviPaneTextL( *newText );
+    iStatusPanel.RenderNaviPaneL();
+    
+    CleanupStack::PopAndDestroy( newText );
+    }
+