vtuis/videotelui/src/features/dialer/cvtuidialercontainer.cpp
author Pat Downey <patd@symbian.org>
Wed, 01 Sep 2010 12:29:12 +0100
branchRCL_3
changeset 25 779871d1e4f4
child 26 590f6f022902
permissions -rw-r--r--
Revert incorrect RCL_3 drop: Revision: 201033 Kit: 201035

/*
* Copyright (c) 2006 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:  Dialer feature
*
*/


#include    <cvtlogger.h>
#include    <cvideodtmfdialer.h>
#include    <AknsDrawUtils.h>
#include    <AknsUtils.h>
#include    <aknlayoutscalable_apps.cdl.h>
#include    <aknlayoutscalable_avkon.cdl.h>
#include    <layoutmetadata.cdl.h>
#include    <featmgr.h>
#include    <AknsBasicBackgroundControlContext.h>
#include    <akntoolbar.h>

#include    "VtUiUtility.h"
#include    "VtUiLayout.h"
#include    "mvtuicomponentmanager.h"
#include    "cvtuidialercontainer.h"
#include    "cvtuidialervideocontrol.h"
#include    "tvtuiwsevent.h"
#include    "tvtuistates.h"
#include    "cvtuidialerskmodifier.h"
#include    "cvtuifeaturemanager.h"
#include    "CVtUiAppUi.h"
#include    "mvtuicommandmanager.h"
#include    "cvtuidtmfbuffer.h"
#include    "CVtUiMainControl.h"
#include    "CVtUiContextControl.h"
#include    "CVtUiRemoteVideoControl.h"
#include    "CVtUiEndCallButtonPane.h"
// Index of white color.
const TInt KVtUiColorWhite = 0;

const TInt KVtUiActOrdinalPos = 2;
const TInt KVtUiDeactOrdinalPos = 4;

// Implementation of TVtUiMiniDialerComponentState

// ---------------------------------------------------------------------------
// TVtUiDialerComponentState::TVtUiDialerComponentState
// ---------------------------------------------------------------------------
//
TVtUiDialerComponentState::TVtUiDialerComponentState(
    MVtUiComponent& aComponent ) :
    TVtUiComponentState( aComponent,
        TVtUiBlockListBitField(
            MVtUiComponent::EComponentIdToolbar |
            MVtUiComponent::EComponentIdNumberEntry ) )
    {
    }

// Implementation of CVtUiDialerContainer

// ---------------------------------------------------------------------------
// CVtUiDialerContainer::NewL
// ---------------------------------------------------------------------------
//
CVtUiDialerContainer* CVtUiDialerContainer::NewL(
    CVtUiFeatureManager& aFeatureManager )
    {
    __VTPRINTENTER( "DialContainer.NewL" )
    CVtUiDialerContainer* self =
        new ( ELeave ) CVtUiDialerContainer( aFeatureManager );
    CleanupStack::PushL( self );
    self->ConstructL( aFeatureManager.AppUi().BitmapManager() );
    CleanupStack::Pop(); // self
    __VTPRINTEXIT( "DialContainer.NewL" )
    return self;
    }

// ---------------------------------------------------------------------------
// CVtUiDialerContainer::~CVtUiDialerContainer
// ---------------------------------------------------------------------------
//
CVtUiDialerContainer::~CVtUiDialerContainer()
    {
    __VTPRINTENTER( "DialContainer.~" )
    delete iAsyncDeactivate;
    delete iVideoControl;
    delete iDialer;
    delete iSKModifier;
    delete iInputBuffer;
    delete iBgContext;
    AknsUtils::DeregisterControlPosition( this );
    __VTPRINTEXIT( "DialContainer.~" )
    }

// ---------------------------------------------------------------------------
// CVtUiDialerContainer::HandleResourceChangeL
// ---------------------------------------------------------------------------
//
void CVtUiDialerContainer::HandleResourceChangeL( TInt aType )
    {
    __VTPRINTENTER( "DialContainer.HandleResourceChangeL" )
    switch ( aType )
        {
    case KEikDynamicLayoutVariantSwitch:
    case KAknsMessageSkinChange:
        LayoutDialerContainer();
        break;
    default:
        break;
        }

    CCoeControl::HandleResourceChange( aType );
    
    __VTPRINTEXIT( "DialContainer.HandleResourceChangeL" )
    }

// ---------------------------------------------------------------------------
// CVtUiDialerContainer::ComponentId
// ---------------------------------------------------------------------------
//
MVtUiComponent::TComponentId CVtUiDialerContainer::ComponentId() const
    {
    return EComponentIdDialer;
    }

// ---------------------------------------------------------------------------
// CVtUiDialerContainer::ComponentAsControl
// ---------------------------------------------------------------------------
//
CCoeControl* CVtUiDialerContainer::ComponentAsControl()
    {
    return iVideoControl;
    }

// ---------------------------------------------------------------------------
// CVtUiDialerContainer::DoActivateL
// ---------------------------------------------------------------------------
//
void CVtUiDialerContainer::DoActivateL()
    {
    __VTPRINTENTER( "DialContainer.DoActivateL" )
    iUiStates.SetIsDialerActivating( EFalse );
    LayoutDialerContainer();
    Reset();
    
    // Sort control windows' ordinal pos
    TInt ordinalPos = KVtUiActOrdinalPos;
    CVtUiAppUi& appUi = iFeatureManager->AppUi();
    appUi.MainControl().DrawableWindow()->SetOrdinalPosition(
            ordinalPos--, 
            appUi.MainControl().DrawableWindow()->OrdinalPriority() );
    
    appUi.CurrentFixedToolbar()->DrawableWindow()->SetOrdinalPosition(
            ordinalPos--, 
            appUi.CurrentFixedToolbar()->DrawableWindow()->OrdinalPriority() );
    
    iDialer->DrawableWindow()->SetOrdinalPosition(
            ordinalPos--, iDialer->DrawableWindow()->OrdinalPriority() );
    
    iVideoControl->MakeVisible( ETrue );
    iDialer->MakeVisible( ETrue );
    MakeVisible( ETrue );
    // Force a resource change and draw for the dialer
    HandleResourceChange( KAknsMessageSkinChange );
    DrawNow();
    User::LeaveIfError( iFeatureManager->
        CommandManager().AddCommandModifier( *iSKModifier ) );
    iInputBuffer->Activate();
    iMode = CVtUiAppUi::ERenderingModeDialer;
    TVtUiWsEvent< CVtUiAppUi::TRenderingMode > renderingEvent(
        EVtUiWsEventBeginRenderingMode, &iMode );
    iCoeEnv->WsSession().SendEventToWindowGroup(
        Window().WindowGroupId(), renderingEvent );
    iUiStates.SetIsDialerOpen( ETrue );
    iAsyncDeactivate->Cancel();
    __VTPRINTEXIT( "DialContainer.DoActivateL" )
    }

// ---------------------------------------------------------------------------
// CVtUiDialerContainer::DoDeactivateL
// ---------------------------------------------------------------------------
//
void CVtUiDialerContainer::DoDeactivateL()
    {
    __VTPRINTENTER( "DialContainer.DoDeactivateL" )
    iFeatureManager->CommandManager().
        RemoveCommandModifier( *iSKModifier );
    iUiStates.SetIsDialerOpen( EFalse );

    // Sort control windows' ordinal pos
    TInt ordinalPos = KVtUiDeactOrdinalPos;
    CVtUiAppUi& appUi = iFeatureManager->AppUi();
    appUi.MainControl().DrawableWindow()->SetOrdinalPosition( 
            ordinalPos--, 
            appUi.MainControl().DrawableWindow()->OrdinalPriority() );
    
    appUi.CurrentFixedToolbar()->DrawableWindow()->SetOrdinalPosition(
            ordinalPos--, 
            appUi.CurrentFixedToolbar()->DrawableWindow()->OrdinalPriority() );
      
    appUi.EndCallButtonPane().DrawableWindow()->SetOrdinalPosition( 
            ordinalPos--, 
            appUi.EndCallButtonPane().DrawableWindow()->OrdinalPriority() );
    
    appUi.ContextControl().DrawableWindow()->SetOrdinalPosition( 
            ordinalPos--, 
            appUi.ContextControl().DrawableWindow()->OrdinalPriority() );
    
    appUi.RemoteVideoControl().DrawableWindow()->SetOrdinalPosition(
            ordinalPos--, 
            appUi.RemoteVideoControl().DrawableWindow()->OrdinalPriority() );
    
    iVideoControl->MakeVisible( EFalse );
    iDialer->MakeVisible( EFalse );
    MakeVisible( EFalse );
    Reset();
    iInputBuffer->Deactivate();
    iAsyncDeactivate->CallBack();
    __VTPRINTEXIT( "DialContainer.DoDeactivateL" )
    }

// ---------------------------------------------------------------------------
// CVtUiDialerContainer::GetContents
// ---------------------------------------------------------------------------
//
void CVtUiDialerContainer::GetContents( TDes& aContents ) const
    {
    __VTPRINTENTER( "DialContainer.GetContents" )
    iInputBuffer->GetContents( aContents );
    __VTPRINTEXIT( "DialContainer.GetContents" )
    }

// ---------------------------------------------------------------------------
// CVtUiDialerContainer::OfferKeyEventL
// ---------------------------------------------------------------------------
//
TKeyResponse CVtUiDialerContainer::OfferKeyEventL( const TKeyEvent& aEvent,
    TEventCode aType )
    {
    __VTPRINTENTER( "DialContainer.OfferKeyEventL" )
    TKeyResponse response( EKeyWasNotConsumed );
    TChar dtmfTone;
    if ( VtUiUtility::IsDTMFEvent( aEvent, dtmfTone ) &&
         ( aType == EEventKey ) )
        {
        response = EKeyWasConsumed;
        AppendDigit( dtmfTone );
        }
    __VTPRINTEXIT( "DialContainer.OfferKeyEventL" )
    return response;
    }

// ---------------------------------------------------------------------------
// CVtUiDialerContainer::Draw
// ---------------------------------------------------------------------------
//
void CVtUiDialerContainer::Draw( const TRect& ) const
    {
    __VTPRINTENTER( "DialContainer.Draw" )
    CWindowGc& gc( SystemGc() );
    gc.SetBrushStyle( CWindowGc::ESolidBrush );
    gc.SetPenStyle( CGraphicsContext::ENullPen );
    gc.SetBrushColor( AKN_LAF_COLOR( KVtUiColorWhite ) );
    gc.Clear();
    MAknsSkinInstance* skin = AknsUtils::SkinInstance();
    MAknsControlContext* cc = AknsDrawUtils::ControlContext( this );
    AknsDrawUtils::Background( skin, cc, this, gc, Rect() );
    __VTPRINTEXIT( "DialContainer.Draw" )
    }

// ---------------------------------------------------------------------------
// CVtUiDialerContainer::SizeChanged
// ---------------------------------------------------------------------------
//
void CVtUiDialerContainer::SizeChanged()
    {
    __VTPRINTENTER( "DialContainer.SizeChanged" )
    TRect bgRect;
    AknLayoutUtils::LayoutMetricsRect( AknLayoutUtils::EScreen, bgRect );
    iBgContext->SetRect( bgRect );

    AknsUtils::RegisterControlPosition( this );
    CCoeControl::SizeChanged();
    __VTPRINTEXIT( "DialContainer.SizeChanged" )
    }

// ---------------------------------------------------------------------------
// CVtUiDialerContainer::PositionChanged
// ---------------------------------------------------------------------------
//
void CVtUiDialerContainer::PositionChanged()
    {
    __VTPRINTENTER( "DialContainer.PositionChanged" )
    AknsUtils::RegisterControlPosition( this );
    CCoeControl::PositionChanged();
    __VTPRINTEXIT( "DialContainer.PositionChanged" )
    }

// ---------------------------------------------------------------------------
// CVtUiDialerContainer::CountComponentControls
// ---------------------------------------------------------------------------
//
TInt CVtUiDialerContainer::CountComponentControls() const
    {
    return iDialer ? 1 : 0;
    }

// ---------------------------------------------------------------------------
// CVtUiDialerContainer::ComponentControl
// ---------------------------------------------------------------------------
//
CCoeControl* CVtUiDialerContainer::ComponentControl( TInt aIndex ) const
    {
    CCoeControl* result = NULL;
    switch ( aIndex )
        {
    case 0:
        result = iDialer;
        break;
    default:
        break;
        }
    return result;
    }

// ---------------------------------------------------------------------------
// CVtUiDialerContainer::CVtUiDialerContainer
// ---------------------------------------------------------------------------
//
CVtUiDialerContainer::CVtUiDialerContainer(
    CVtUiFeatureManager& aFeatureManager ) :
    iComponentState( *this ),
    iFeatureManager( &aFeatureManager ),
    iComponentManager( &aFeatureManager.ComponentManager() ),
    iUiStates( aFeatureManager.UiStates() )
    {
    __VTPRINTENTER( "DialContainer.ctor" )
    __VTPRINTEXIT( "DialContainer.ctor" )
    }

// ---------------------------------------------------------------------------
// CVtUiDialerContainer::ConstructL
// ---------------------------------------------------------------------------
//
void CVtUiDialerContainer::ConstructL( CVtUiBitmapManager& aBitmapManager )
    {
    __VTPRINTENTER( "DialContainer.ConstructL" )
    iBgContext = CAknsBasicBackgroundControlContext::NewL(
                      KAknsIIDQsnBgScreen, Rect(), ETrue );
    CreateWindowL();
    DrawableWindow()->SetPointerGrab( ETrue );
    SetExtent( TPoint(), TSize() );
    ActivateL();
    MakeVisible( EFalse );
    iInputBuffer = CVtUiDTMFBuffer::NewL( *iCoeEnv );
    iVideoControl = CVtUiDialerVideoControl::NewL( aBitmapManager );
    iDialer = CVideoDTMFDialer::NewL( *this, *iVideoControl, DialerRect() );
    
    iSKModifier = CVtUiDialerSKModifier::NewL( *iFeatureManager );
    // Disable fading when using DP (eliminates nasty color error)
    if ( FeatureManager::FeatureSupported( KFeatureIdDisplayPost ) )
        {
        Window().SetNonFading( ETrue );
        }
    iAsyncDeactivate = new ( ELeave ) CAsyncCallBack(
        TCallBack( ASyncDoDeactivate, this ), CActive::EPriorityLow );
    __VTPRINTEXIT( "DialContainer.ConstructL" )
    }

// ---------------------------------------------------------------------------
// CVtUiDialerContainer::RegisterComponentL
// ---------------------------------------------------------------------------
//
void CVtUiDialerContainer::RegisterComponentL()
    {
    __VTPRINTENTER( "DialContainer.RegisterComponentL" )
    User::LeaveIfError( iComponentManager->ChangeResourceChangeRegistration(
        *this, MVtUiComponentManager::ERegister ) );
    User::LeaveIfError(
        iComponentManager->ChangeComponentRegistration(
        iComponentState, MVtUiComponentManager::ERegister ) );
    User::LeaveIfError( iComponentManager->ChangeKeyEventRegistration(
        *this, MVtUiComponentManager::ERegister ) );
    __VTPRINTEXIT( "DialContainer.RegisterComponentL" )
    }

// ---------------------------------------------------------------------------
// CVtUiDialerContainer::UnregisterComponent
// ---------------------------------------------------------------------------
//
void CVtUiDialerContainer::UnregisterComponent()
    {
    __VTPRINTENTER( "DialContainer.UnregisterComponent" )
    iComponentManager->ChangeComponentRegistration(
        iComponentState, MVtUiComponentManager::EUnregister );
    iComponentManager->ChangeResourceChangeRegistration(
        *this, MVtUiComponentManager::EUnregister );
    iComponentManager->ChangeKeyEventRegistration(
        *this, MVtUiComponentManager::EUnregister );
    __VTPRINTEXIT( "DialContainer.UnregisterComponent" )
    }

// ---------------------------------------------------------------------------
// CVtUiDialerContainer::UnregisterComponent
// ---------------------------------------------------------------------------
//
MVtUiVideoWindow* CVtUiDialerContainer::ComponentAsVideoWindow()
    {
    __VTPRINTENTER( "DialContainer.ComponentAsVideoWindow" )
    __VTPRINTEXIT( "DialContainer.ComponentAsVideoWindow" )
    return iVideoControl;
    }

// ---------------------------------------------------------------------------
// CVtUiDialerContainer::LayoutDialerContainer
// ---------------------------------------------------------------------------
//
void CVtUiDialerContainer::LayoutDialerContainer()
    {
    __VTPRINTENTER( "DialContainer.LayoutDialerContainer" )

    TAknWindowLineLayout mainPaneLL;

    if ( Layout_Meta_Data::IsLandscapeOrientation() )
        {
        // Landscape: Option11 (thin status pane, lsc)
        mainPaneLL = AknLayoutScalable_Apps::main_pane( 15 ).LayoutLine();
        }
    else
        {
        // Portrait: main pane with status pane off, control pane on
        mainPaneLL = AknLayoutScalable_Apps::main_pane( 9 ).LayoutLine();
        }

    TRect appWinRect;
    AknLayoutUtils::LayoutMetricsRect( AknLayoutUtils::EApplicationWindow,
        appWinRect );

    // Layout container
    AknLayoutUtils::LayoutControl( this, appWinRect, mainPaneLL );

    // Layout dialer
    const TInt variety( Layout_Meta_Data::IsLandscapeOrientation() ?
        1 : 0 );
    TAknWindowLineLayout dialerLLout(
        AknLayoutScalable_Apps::main_video_tele_dialer_pane(
            variety ).LayoutLine() );
    AknLayoutUtils::LayoutControl( iDialer, Rect(), dialerLLout );

    // Layout video control
    AknLayoutUtils::LayoutControl( iVideoControl, iDialer->Rect(),
         AknLayoutScalable_Apps::video_down_pane_cp(
            variety ).LayoutLine() );

    __VTPRINTEXIT( "DialContainer.LayoutDialerContainer" )
    }

// ---------------------------------------------------------------------------
// CVtUiDialerContainer::DialerRect
// ---------------------------------------------------------------------------
//
TRect CVtUiDialerContainer::DialerRect() const
    {
    __VTPRINTENTER( "DialContainer.DialerRect" )
    TRect mainPaneRect;
    AknLayoutUtils::LayoutMetricsRect( AknLayoutUtils::EMainPane,
        mainPaneRect );
    __VTPRINTEXIT( "DialContainer.DialerRect" )
    return mainPaneRect;
    }

// ---------------------------------------------------------------------------
// CVtUiDialerContainer::Reset
// ---------------------------------------------------------------------------
//
void CVtUiDialerContainer::Reset()
    {
    __VTPRINTENTER( "DialContainer.Reset" )
    iInputBuffer->Reset();
    __VTPRINTEXIT( "DialContainer.Reset" )
    }

// ---------------------------------------------------------------------------
// CVtUiDialerContainer::AppendDigit
// ---------------------------------------------------------------------------
//
void CVtUiDialerContainer::AppendDigit( TChar aDigit )
    {
    __VTPRINTENTER( "DialContainer.AppendDigit" )
    iInputBuffer->Append( aDigit );
    __VTPRINTEXIT( "DialContainer.AppendDigit" )
    }

// ---------------------------------------------------------------------------
// CVtUiDialerContainer::MopSupplyObject
// ---------------------------------------------------------------------------
//
TTypeUid::Ptr CVtUiDialerContainer::MopSupplyObject( TTypeUid aId )
 {
     __VTPRINTENTER( "CVtUiDialerContainer.MopSupplyObject" )
 // Required during rendering of the background skin in Draw()
 if (aId.iUid == MAknsControlContext::ETypeId)
     {
      __VTPRINTEXIT( "CVtUiDialerContainer.MopSupplyObject.1" )
     return MAknsControlContext::SupplyMopObject( aId, iBgContext );
     }
    __VTPRINTEXIT( "CVtUiDialerContainer.MopSupplyObject.2" )
 return CCoeControl::MopSupplyObject( aId );
 }

// ---------------------------------------------------------------------------
// CVtUiDialerContainer::ASyncDoDeactivate
// ---------------------------------------------------------------------------
//
TInt CVtUiDialerContainer::ASyncDoDeactivate( TAny* aSelf )
    {
    __VTPRINTENTER( "DialContainer.ASyncDoDeactivate" )
    CVtUiDialerContainer* self =
        reinterpret_cast< CVtUiDialerContainer* >( aSelf );
    self->iMode = CVtUiAppUi::ERenderingModeDialer;
    TVtUiWsEvent< CVtUiAppUi::TRenderingMode > renderingEvent(
        EVtUiWsEventEndRenderingMode, &self->iMode );
    self->iCoeEnv->WsSession().SendEventToWindowGroup(
        self->Window().WindowGroupId(), renderingEvent );
    __VTPRINTEXIT( "DialContainer.ASyncDoDeactivate" )
    return KErrNone;
    }