phoneuis/BubbleManager/Src/BMDefaultManager.cpp
branchRCL_3
changeset 25 5266b1f337bd
parent 0 5f000ab63145
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phoneuis/BubbleManager/Src/BMDefaultManager.cpp	Wed Sep 01 12:30:10 2010 +0100
@@ -0,0 +1,415 @@
+/*
+* Copyright (c) 2008 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:  Customization manager
+*
+*/
+
+#include "BMDefaultManager.h"
+#include "BMBubbleImageManager.h"
+#include "BMBubbleHeader.h"
+#include "BMCallStatusIndiBig.h"
+#include "BMCallStatusIndiSmall.h"
+#include "BMCallStatusAnimBig.h"
+#include "BMCallStatusAnimSmall.h"
+#include "BMNumberTypeIcon.h"
+#include "BMPanic.h"
+#include <telbubblecallimage.h>
+
+// max amounts per type
+const TInt KBubbleMaxCallStatusIndiBig  = 2;
+const TInt KBubbleMaxCallStatusIndiSmall  = 7;
+const TInt KBubbleMaxCallStatusAnimBig  = 2;
+const TInt KBubbleMaxCallStatusAnimSmall  = 1;
+const TInt KBubbleMaxNumberTypeIcon  = 2;
+const TInt KBubbleMaxCallerImageDrawer = 1;
+
+// ---------------------------------------------------------------------------
+// C++ constructor
+// ---------------------------------------------------------------------------
+//
+CBubbleDefaultManager::CBubbleDefaultManager( CBubbleManager& aBubbleManager )
+    : iBubbleManager( aBubbleManager )
+    {
+    }
+
+
+// ---------------------------------------------------------------------------
+// ConstructL
+// ---------------------------------------------------------------------------
+//
+void CBubbleDefaultManager::ConstructL()
+    {
+    iMaxAmounts.Append( KBubbleMaxCallStatusIndiBig );
+    iMaxAmounts.Append( KBubbleMaxCallStatusIndiSmall );
+    iMaxAmounts.Append( KBubbleMaxCallStatusAnimBig );
+    iMaxAmounts.Append( KBubbleMaxCallStatusAnimSmall );
+    iMaxAmounts.Append( KBubbleMaxNumberTypeIcon );
+    iMaxAmounts.Append( KBubbleMaxCallerImageDrawer );
+    
+    const TInt kDifferentElements = iMaxAmounts.Count();
+
+    for ( TInt i = 0 ; i < kDifferentElements ; i++ )
+        {
+        iAvailabilities.Append( 0 );
+        }
+
+    // Create main array
+    iElements = new( ELeave ) 
+                    CArrayPtrFlat<CSingleElement>( kDifferentElements );
+    iElements->SetReserveL( kDifferentElements );
+
+    // Create arrays inside the main array and add them to the main array
+    TInt resource = 0;
+    for ( resource = 0 ; resource < kDifferentElements ; resource++ )
+        {
+        CSingleElement* single = new( ELeave ) 
+                                    CSingleElement( iMaxAmounts[resource] );
+        CleanupStack::PushL( single );
+        single->SetReserveL( iMaxAmounts[resource] );
+        iElements->AppendL( single );
+        CleanupStack::Pop( single );
+        }
+
+    // Create implementations to individual arrays:
+    for ( resource = 0 ; resource < kDifferentElements ; resource++ )
+        {
+        TInt maxCellAmount = iMaxAmounts[resource];
+        CSingleElement* single = iElements->At( resource );
+        switch( resource )
+            {
+            case EBMDefaultCallStatusIndiBig:
+                {
+                for ( TInt i = 0 ; i < maxCellAmount ; i++ )
+                    {
+                    CBubbleCallStatusIndiBig* indiControl = 
+                        CBubbleCallStatusIndiBig::NewL( 
+                            iBubbleManager.ImageManager() );
+                    CleanupStack::PushL( indiControl );
+                    indiControl->SetContainerWindowL( iBubbleManager );
+                    indiControl->SetParent( &iBubbleManager );
+                    CTelBubbleCustomElement* indiElem =  
+                        CTelBubbleCustomElement::NewL( indiControl, 
+                            CTelBubbleCustomElement::EBigCallIndicator );
+                    CleanupStack::PushL( indiElem );
+                    single->AppendL( indiElem );
+                    CleanupStack::Pop(2,indiControl);
+                    }
+                break;
+                }
+                
+            case EBMDefaultCallStatusIndiSmall:
+                {
+                for ( TInt i = 0 ; i < maxCellAmount ; i++ )
+                    {
+                    CBubbleCallStatusIndiSmall* indiControl = 
+                        CBubbleCallStatusIndiSmall::NewL( 
+                            iBubbleManager.ImageManager() );
+                    CleanupStack::PushL( indiControl );
+                    indiControl->SetContainerWindowL( iBubbleManager );
+                    indiControl->SetParent( &iBubbleManager );
+                    CTelBubbleCustomElement* indiElem =  
+                        CTelBubbleCustomElement::NewL( indiControl, 
+                            CTelBubbleCustomElement::ESmallCallIndicator );
+                    CleanupStack::PushL( indiElem );
+                    single->AppendL( indiElem );
+                    CleanupStack::Pop(2,indiControl);
+                    }
+                break;
+                }
+                
+            case EBMDefaultCallStatusAnimBig:
+                {
+                for ( TInt i = 0 ; i < maxCellAmount ; i++ )
+                    {
+                    CBubbleCallStatusAnimBig* animControl = 
+                        CBubbleCallStatusAnimBig::NewL( 
+                            iBubbleManager.ImageManager() );
+                    CleanupStack::PushL( animControl );
+                    animControl->SetContainerWindowL( iBubbleManager );
+                    animControl->SetParent( &iBubbleManager );
+                    CTelBubbleCustomElement* animElem =  
+                        CTelBubbleCustomElement::NewL( animControl, 
+                            CTelBubbleCustomElement::EBigCallIndicator );
+                    CleanupStack::PushL( animElem );
+                    single->AppendL( animElem );
+                    CleanupStack::Pop(2,animControl);
+                    }
+                break;
+                }
+                
+            case EBMDefaultCallStatusAnimSmall:
+                {
+                for ( TInt i = 0 ; i < maxCellAmount ; i++ )
+                    {
+                    CBubbleCallStatusAnimSmall* animControl = 
+                        CBubbleCallStatusAnimSmall::NewL( 
+                            iBubbleManager.ImageManager() );
+                    CleanupStack::PushL( animControl );
+                    animControl->SetContainerWindowL( iBubbleManager );
+                    animControl->SetParent( &iBubbleManager );
+                    CTelBubbleCustomElement* animElem =  
+                        CTelBubbleCustomElement::NewL( animControl, 
+                            CTelBubbleCustomElement::ESmallCallIndicator );
+                    CleanupStack::PushL( animElem );
+                    single->AppendL( animElem );
+                    CleanupStack::Pop(2,animControl);
+                    }
+                break;
+                }
+                
+            case EBMDefaultNumberTypeIcon:
+                {
+                for ( TInt i = 0 ; i < maxCellAmount ; i++ )
+                    {
+                    CBubbleNumberTypeIcon* numberTypeIcon = 
+                        CBubbleNumberTypeIcon::NewL( 
+                            iBubbleManager.ImageManager() );
+                    CleanupStack::PushL( numberTypeIcon );
+                    numberTypeIcon->SetContainerWindowL( iBubbleManager );
+                    numberTypeIcon->SetParent( &iBubbleManager );
+                    CTelBubbleCustomElement* numberTypeIconElem =  
+                        CTelBubbleCustomElement::NewL( numberTypeIcon, 
+                            CTelBubbleCustomElement::EBigCallIndicator );
+                    CleanupStack::PushL( numberTypeIconElem );
+                    single->AppendL( numberTypeIconElem );
+                    CleanupStack::Pop( 2, numberTypeIcon );
+                    }
+                break;
+                }
+                
+            case EBMDefaultCallImageControl:
+                {
+                for ( TInt i = 0 ; i < maxCellAmount ; i++ )
+                    {
+                    CTelBubbleCallImage* image = 
+                        CTelBubbleCallImage::NewL();
+                    CleanupStack::PushL( image );
+                    image->SetContainerWindowL( iBubbleManager );
+                    image->SetParent( &iBubbleManager );
+                    CTelBubbleCustomElement* imageElem =  
+                        CTelBubbleCustomElement::NewL( image, 
+                            CTelBubbleCustomElement::ECallImage );
+                    CleanupStack::PushL( imageElem );
+                    single->AppendL( imageElem );
+                    CleanupStack::Pop(2,image);
+                    }
+                break;
+                }    
+                
+            default:
+                Panic( EBMPanicUnhandledSwitchCase );
+            }
+        }    
+    }
+
+// ---------------------------------------------------------------------------
+// NewL
+// ---------------------------------------------------------------------------
+//
+CBubbleDefaultManager* CBubbleDefaultManager::NewL(
+    CBubbleManager& aBubbleManager )
+    {
+    CBubbleDefaultManager* self = 
+        new( ELeave ) CBubbleDefaultManager( aBubbleManager );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+
+// ---------------------------------------------------------------------------
+// Destructor
+// ---------------------------------------------------------------------------
+//
+CBubbleDefaultManager::~CBubbleDefaultManager()
+    {
+    if ( iElements )
+        {
+        for ( TInt i = 0 ; i < iElements->Count() ; i++ )
+            {
+            if ( iElements->At( i ) )
+                {
+                iElements->At( i )->ResetAndDestroy();
+                }
+            }
+        iElements->ResetAndDestroy();
+        delete iElements;
+        }
+
+    iAvailabilities.Close();
+    iMaxAmounts.Close();    
+    }
+
+// ---------------------------------------------------------------------------
+// ReserveCallIndicatorElement
+// ---------------------------------------------------------------------------
+//
+CTelBubbleCustomElement* CBubbleDefaultManager::ReserveBigCallIndicatorElement(
+    const CBubbleHeader& aHeader )
+    {
+    CTelBubbleCustomElement* element;
+    CBubbleManager::TPhoneCallState state = aHeader.CallState();
+    
+    if ( state == CBubbleManager::EOutgoing ||
+         state == CBubbleManager::EAlertToDisconnected )
+        {
+        // Image
+        element = ReserveElement( EBMDefaultCallStatusIndiBig );
+        CBubbleCallStatusIndi* indi = 
+            static_cast<CBubbleCallStatusIndi*> ( element->Control() ); 
+        indi->ReadBubbleHeader( aHeader );
+        }
+    else
+        {
+        // Animation
+        element = ReserveElement( EBMDefaultCallStatusAnimBig );
+        CBubbleCallStatusAnim* anim =
+            static_cast<CBubbleCallStatusAnim*> ( element->Control() ); 
+        anim->ReadBubbleHeader( aHeader );
+        }    
+    
+    return element;
+    }
+
+// ---------------------------------------------------------------------------
+// ReserveSmallCallIndicatorElement
+// ---------------------------------------------------------------------------
+//
+CTelBubbleCustomElement* CBubbleDefaultManager::ReserveSmallCallIndicatorElement(
+    const CBubbleHeader& aHeader )
+    {
+    CTelBubbleCustomElement* element;
+    CBubbleManager::TPhoneCallState state = aHeader.CallState();
+    
+    if( state == CBubbleManager::EOutgoing ||
+        state == CBubbleManager::EWaiting ||
+        state == CBubbleManager::EAlerting )
+        {
+        // Show animation
+        element = ReserveElement( EBMDefaultCallStatusAnimSmall );
+        CBubbleCallStatusAnim* anim =
+            static_cast<CBubbleCallStatusAnim*> ( element->Control() ); 
+        anim->ReadBubbleHeader( aHeader );
+        }
+    else
+        {
+        // Show image
+        element = ReserveElement( EBMDefaultCallStatusIndiSmall );
+        CBubbleCallStatusIndi* indi = 
+            static_cast<CBubbleCallStatusIndi*> ( element->Control() ); 
+        indi->ReadBubbleHeader( aHeader );
+        }
+    
+    return element;
+    }
+
+// ---------------------------------------------------------------------------
+// ReserveNumberTypeIconElement
+// ---------------------------------------------------------------------------
+//
+CTelBubbleCustomElement* CBubbleDefaultManager::ReserveNumberTypeIconElement(
+     const CBubbleHeader& aHeader )
+    {
+    CTelBubbleCustomElement* element = 
+        ReserveElement( EBMDefaultNumberTypeIcon );
+    
+    CBubbleNumberTypeIcon* icon = 
+        static_cast<CBubbleNumberTypeIcon*> ( element->Control() ); 
+
+    icon->ReadBubbleHeader( aHeader );
+    
+    return element;
+    }
+
+// ---------------------------------------------------------------------------
+// ReserveCallerImageElement
+// ---------------------------------------------------------------------------
+//
+CTelBubbleCustomElement* CBubbleDefaultManager::ReserveCallImageElement(
+    const CBubbleHeader& /*aHeader*/ )
+    {
+    return ReserveElement( EBMDefaultCallImageControl );
+    }
+
+// ---------------------------------------------------------------------------
+// ReserveElement
+// ---------------------------------------------------------------------------
+//
+CTelBubbleCustomElement* CBubbleDefaultManager::ReserveElement(
+    TBubbleDefaultElements aType )
+    {
+    CTelBubbleCustomElement* element = NULL;
+    TUint amount = iElements->At( aType )->Count();
+    // 1 mean is reserved and 0 free slot
+    TUint& available = iAvailabilities[aType]; 
+    TUint bit = 1; // start from first bit
+    for ( TUint slot = 0 ; slot < amount ; slot++ )
+        {
+        // if flag is one the seat is taken...
+        if ( available&bit )
+            {
+            bit = bit<<1; //move to next bit of for next round
+            continue;
+            }
+
+        // so we found a free slot
+        element = iElements->At( aType )->At( slot );
+        if ( element != NULL )
+            {
+            available |= bit; // set the corrensponding bit 
+                              // for reserved indicator
+            }
+        break;
+        }
+    __ASSERT_DEBUG( element != NULL , 
+                    Panic( EBMPanicCustomization ) );
+    return element;
+    }
+
+// ---------------------------------------------------------------------------
+// ReleaseElement
+// ---------------------------------------------------------------------------
+//
+void CBubbleDefaultManager::ReleaseElement(
+    CTelBubbleCustomElement*& aElement )
+    {
+    if ( aElement == NULL )
+        {
+        return;
+        }
+
+    for ( TInt i = 0 ; i < iElements->Count() ; i++ )
+        {
+        CSingleElement* single = iElements->At( i );
+        TUint amount = single->Count();
+        TUint& available = iAvailabilities[i]; // 1 mean is reserved 
+                                                   // and 0 free slot
+        TUint bit = 1; // start from first bit
+        for ( TUint slot = 0 ; slot < amount ; slot++ )
+            {
+            if ( single->At( slot ) == aElement )
+                {
+                __ASSERT_DEBUG( available&bit, 
+                                Panic( EBMPanicCustomization ) );
+                available &= ~bit; // zero the corrensponding bit 
+                                   // for freed indicator
+                aElement = NULL;
+                break;
+                }
+            bit = bit<<1; //move to next bit of for next round
+            }
+        }
+    }
+