phoneapp/phoneuiview/src/cphonedialercontroller.cpp
branchRCL_3
changeset 9 8871b09be73b
parent 0 5f000ab63145
child 14 24062c24fe38
--- a/phoneapp/phoneuiview/src/cphonedialercontroller.cpp	Tue Feb 02 00:10:04 2010 +0200
+++ b/phoneapp/phoneuiview/src/cphonedialercontroller.cpp	Fri Feb 19 22:50:26 2010 +0200
@@ -1,5 +1,5 @@
 /*
-* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). 
+* Copyright (c) 2009, 2010 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"
@@ -21,67 +21,99 @@
 #include <eikapp.h>
 #include <eikcolib.h>
 #include <gulicon.h>
-#include <akntoolbar.h>
-#include <aknbutton.h>
 #include <StringLoader.h>
+#include <AknsUtils.h>
 #include <phoneui.rsg>
+#include <phoneui.mbg>
 #include <pevirtualengine.h>
 #include <data_caging_path_literals.hrh>
 
 #include "cphonedialercontroller.h"
+#include "cphoneeasydialingcontroller.h"
 #include "cphonebubblewrapper.h"
 #include "phoneui.hrh"
-#include "phonerssbase.h"
 #include "tphonecmdparaminteger.h"
-#include "cphonemenucontroller.h"
 #include "cphonemainresourceresolver.h"
 #include "tphonecmdparamcallstatedata.h"
 #include "tphonecmdparamboolean.h"
-#include "mphonedialercontroller.h"
 
 _LIT ( KPhoneMifFileName, "phoneui.mif" );
-_LIT( KDialerToolbarButtonEmptyStr, "" );
+
 
-const TInt KNumberOfButtons = 6;
-struct SPhoneDialerToolbarButton
+/** States for Call button. */
+enum TCallButtonState
+    {
+    ECallButtonCallStateIndex = 0,
+    ECallButtonLogStateIndex,
+    ECallButtonSendStateIndex
+    };
+static const CPhoneDialerController::TLocalButtonData KCallButtonDataTable[] =
     {
-    TInt iIconIndex;
-    TInt iMaskIndex;
-    TInt iCommandId;    
+        { EPhoneNumberAcqCmdSendCommand, 
+          EAknsMinorGenericQgnIndiButtonAnswerWhite,
+          EMbmPhoneuiQgn_indi_button_answer_white, 
+          EMbmPhoneuiQgn_indi_button_answer_white_mask,
+          R_PHONEUI_DIALER_TOOLTIP_CALL
+        },
+        { EPhoneDialerCmdLog,
+          EAknsMinorGenericQgnIndiButtonLogdialerWhite,
+          EMbmPhoneuiQgn_indi_button_logdialer_white,
+          EMbmPhoneuiQgn_indi_button_logdialer_white_mask,
+          R_PHONEUI_DIALER_TOOLTIP_RECENT_CALLS
+        },
+        { EPhoneNumberAcqCmdSendCommand, 
+          EAknsMinorGenericQgnIndiButtonAnswerWhite,
+          EMbmPhoneuiQgn_indi_button_answer_white, 
+          EMbmPhoneuiQgn_indi_button_answer_white_mask,
+          R_PHONEUI_DIALER_TOOLTIP_SEND
+        }
     };
+static const TInt KCallButtonDataTableCount = 
+    sizeof( KCallButtonDataTable ) / sizeof( CPhoneDialerController::TLocalButtonData );
+
 
-const SPhoneDialerToolbarButton bArray[KNumberOfButtons] =
-        {  
-            { EMbmPhoneuiQgn_indi_dialer_call_send,
-              EMbmPhoneuiQgn_indi_dialer_call_send_mask,
-              EPhoneDialerCmdLog
-            },
-            { EMbmPhoneuiQgn_indi_dialer_call_send,
-              EMbmPhoneuiQgn_indi_dialer_call_send_mask,
-              EPhoneNumberAcqCmdSendCommand
-            },        
-            
-            { EMbmPhoneuiQgn_indi_button_send_dtmf,
-              EMbmPhoneuiQgn_indi_button_send_dtmf_mask,
-              EPhoneCmdDtmfOk
-            },               
-            { EMbmPhoneuiQgn_indi_dialer_contacts,
-              EMbmPhoneuiQgn_indi_dialer_contacts_mask,
-              EPhoneDialerCmdContacts
-            },
-            { EMbmPhoneuiQgn_indi_dialer_add_contacts,
-              EMbmPhoneuiQgn_indi_dialer_add_contacts_mask,
-              EPhoneNumberAcqCmdAddToContacts
-            },            
-            { EMbmPhoneuiQgn_indi_dialer_clear,
-              EMbmPhoneuiQgn_indi_dialer_clear_mask,
-              EPhoneDialerCmdClear
-            }
-        }; 
+/** States for Phonebook button */
+enum TPhonebookButtonState
+    {
+    EPhonebookButtonContactsIndex = 0,
+    EPhonebookButtonAddContactIndex
+    };
+static const CPhoneDialerController::TLocalButtonData KPhonebookButtonDataTable[] =
+    {
+        { EPhoneDialerCmdContacts,
+          EAknsMinorGenericQgnIndiDialerContacts,
+          EMbmPhoneuiQgn_indi_dialer_contacts,
+          EMbmPhoneuiQgn_indi_dialer_contacts_mask,
+          R_PHONEUI_DIALER_TOOLTIP_CONTACTS
+        },
+        { EPhoneNumberAcqCmdAddToContacts,
+          EAknsMinorGenericQgnIndiDialerAddContacts,      
+          EMbmPhoneuiQgn_indi_dialer_add_contacts,
+          EMbmPhoneuiQgn_indi_dialer_add_contacts_mask,
+          R_PHONEUI_DIALER_TOOLTIP_ADD_TO_CONTACTS
+        }
+    };
+static const TInt KPhonebookButtonDataTableCount = 
+    sizeof( KPhonebookButtonDataTable ) / sizeof( CPhoneDialerController::TLocalButtonData );
 
-const TInt KDialerToolbarButtonCount = 6; 
-const TInt KDialerToolbarButtonKeyRepeatDelay = 300;
-const TInt KDialerToolbarKeyRepeatInterval = 75;
+
+/** States for Clear button */
+enum TClearButtonState
+    {
+    EClearButtonClearIndex = 0
+    };
+static const CPhoneDialerController::TLocalButtonData KClearButtonDataTable[] =
+    {
+        { EPhoneDialerCmdClear,
+          EAknsMinorGenericQgnIndiDialerClear,
+          EMbmPhoneuiQgn_indi_dialer_clear,
+          EMbmPhoneuiQgn_indi_dialer_clear_mask,
+          R_PHONEUI_DIALER_TOOLTIP_CLEAR
+        }
+    };
+static const TInt KClearButtonDataTableCount = 
+    sizeof( KClearButtonDataTable ) / sizeof( CPhoneDialerController::TLocalButtonData );
+
 
 // ======== MEMBER FUNCTIONS ========
 
@@ -89,14 +121,11 @@
 // Constructor
 // ---------------------------------------------------------------------------
 //
-CPhoneDialerController::CPhoneDialerController( 
-                                        CPhoneBubbleWrapper& aBubbleWrapper,
-                                        CCoeEnv& aCoeEnv,
-                                        CPhoneMenuController& aMenuController ):
-    iBubbleWrapper ( aBubbleWrapper ),
-    iCoeEnv ( aCoeEnv ),
-    iMenuController( aMenuController ),
-    iUpdateToolbar( EFalse )
+EXPORT_C CPhoneDialerController::CPhoneDialerController( 
+                                        CPhoneBubbleWrapper* aBubbleWrapper,
+                                        CCoeEnv& aCoeEnv ):
+    iCoeEnv( aCoeEnv ),
+    iBubbleWrapper( aBubbleWrapper )
     {
     }
 
@@ -104,114 +133,20 @@
 // Second phase constructor
 // ---------------------------------------------------------------------------
 //
-void CPhoneDialerController::ConstructL()
+EXPORT_C void CPhoneDialerController::ConstructL()
     {
-   
-    iBubbleWrapper.SetNumberEntryObserver( *this );
-   
-    if ( !iToolbar )
-        {
-        iToolbar = CAknToolbar::NewL( R_PHONEUI_TOOLBAR );
-        }
-  
-    CEikAppUiFactory* appUiFactory =
-        static_cast<CEikAppUiFactory*>( CEikonEnv::Static()->AppUiFactory() );  
-    appUiFactory->SetViewFixedToolbar( iToolbar );
-    
-    if( iToolbar )
-        {
-        iToolbar->SetToolbarObserver( 
-                        static_cast<MAknToolbarObserver*>( this ));  
-        iToolbar->SetWithSliding( EFalse );
-        iToolbar->SetCloseOnAllCommands( EFalse );
-        iToolbar->SetFocusing( EFalse );
-        
-        CAknButton* button( NULL );
-
-        for( TInt i = 0; i < KDialerToolbarButtonCount; i++ )
-            {
-            TAknsItemID skinId = SkinId( bArray[i].iIconIndex );
-            // Load tooltip text.
-            HBufC* tooltipText;
-            GetTooltipTextL ( bArray[i].iCommandId, tooltipText );  
-            CleanupStack::PushL( tooltipText );      
-         
-            button = CreateButtonLC(
-                bArray[i].iIconIndex, 
-                bArray[i].iMaskIndex, 
-                *tooltipText, 
-                skinId,
-                bArray[i].iCommandId );
-            // Takes ownership of the button                    
-            iToolbar->AddItemL( button, EAknCtButton, bArray[i].iCommandId,0 );
-           
-            CleanupStack::Pop( button );
-            CleanupStack::PopAndDestroy( tooltipText );
-            }
-       
-        // Hide 'Send dtmf' icon
-        iToolbar->HideItem( EPhoneCmdDtmfOk, ETrue, EFalse );
-        TRAP_IGNORE(iToolbar->DisableToolbarL( ETrue ));
-        }
     }
     
 // ---------------------------------------------------------------------------
-// CreateButtonL
-// ---------------------------------------------------------------------------
-//
-CAknButton* CPhoneDialerController::CreateButtonLC( 
-    TInt aNormalIconId,
-    TInt aNormalMaskId,
-    const TDesC& aTooltipText,
-    const TAknsItemID& aSkinIconId,
-    TInt aCommand )
-    {
-    TFileName mifPath( KDriveZ );
-    mifPath.Append( KDC_APP_BITMAP_DIR );
-    mifPath.Append( KPhoneMifFileName );
-
-   
-    CAknButton* button = CAknButton::NewLC( 
-        mifPath,
-        aNormalIconId,
-        aNormalMaskId,
-        -1, -1, // dimmed
-        -1, -1, // pressed
-        -1, -1, // hover
-        KDialerToolbarButtonEmptyStr(),
-        aTooltipText, // help
-        0, // flags
-        0, // state flags
-        aSkinIconId );
-                               
-    if( aCommand == EPhoneDialerCmdClear )
-        {
-        button->SetButtonFlags( KAknButtonKeyRepeat );
-        // delay 300 ms and repeat 75 ms interval   
-        button->SetKeyRepeatInterval( KDialerToolbarButtonKeyRepeatDelay,
-                                      KDialerToolbarKeyRepeatInterval );
-        }
-                                     
-    button->SetFocusing( EFalse );
-    button->SetBackground( iToolbar );
-
-    return button;
-    }
-    
-    
-// ---------------------------------------------------------------------------
 // Static constructor
 // ---------------------------------------------------------------------------
 //
 CPhoneDialerController* CPhoneDialerController::NewL( 
-                                    CPhoneBubbleWrapper& aBubbleWrapper,
-                                    CCoeEnv& aCoeEnv,
-                                    CPhoneMenuController& aMenuController  )
+                                    CPhoneBubbleWrapper* aBubbleWrapper,
+                                    CCoeEnv& aCoeEnv )
     {
-    CPhoneDialerController* self =  new (ELeave) CPhoneDialerController( 
-                                        aBubbleWrapper
-                                       , aCoeEnv
-                                       , aMenuController );
+    CPhoneDialerController* self = 
+        new (ELeave) CPhoneDialerController( aBubbleWrapper, aCoeEnv );
     CleanupStack::PushL( self );
     self->ConstructL();
     CleanupStack::Pop( self );
@@ -222,197 +157,11 @@
 // Destructor
 // ---------------------------------------------------------------------------
 //
-CPhoneDialerController::~CPhoneDialerController()
-    {
-    delete iToolbar;
-    }
-
-// ---------------------------------------------------------------------------
-// NumberEntryStateChanged
-// ---------------------------------------------------------------------------
-//
-void CPhoneDialerController::NumberEntryStateChanged( TBool aHidePromptText )
-    {
-    if( aHidePromptText != iPreviousHidePromptTextStatus )
-        {
-        iPreviousHidePromptTextStatus = aHidePromptText; 
-        iUpdateToolbar = ETrue;
-        }
-    
-    HandleNumberEntryChanged();
-    
-    }
-
-// ---------------------------------------------------------------------------
-// HandleNumberEntryChanged
-// ---------------------------------------------------------------------------
-//
-void CPhoneDialerController::HandleNumberEntryChanged()
-    {
-    if( iUpdateToolbar )
-        {
-        UpdateToolbar();
-        iUpdateToolbar = EFalse;        
-        }
-    
-    iBubbleWrapper.HandleNumberEntryChanged();
-    
-    } 
-
-// ---------------------------------------------------------------------------
-// HandleNumberEntryChanged
-// ---------------------------------------------------------------------------
-//
-void CPhoneDialerController::SetNumberEntryChangedCallBack( 
-        TPhoneCommandParam* aCommandParam )
+EXPORT_C CPhoneDialerController::~CPhoneDialerController()
     {
-    iBubbleWrapper.SetNumberEntryChangedCallBack( aCommandParam );
-    
-    }
-     
-// ---------------------------------------------------------------------------
-// CreateButtonSetNumberEntryEmpty
-// ---------------------------------------------------------------------------
-//
-void CPhoneDialerController::CreateButtonSetNumberEntryEmpty()
-    {
-    
-    if( iToolbar )
-        {
-        if( iDtmfDialerVisible )
-            {
-            // Dim 'Send dtmf' 
-            iToolbar->SetItemDimmed( EPhoneCmdDtmfOk, ETrue, EFalse );
-            }
-        else if ( iCustomizedDialer )
-            {
-            iCustomizedDialer->HandleNumberEntryIsEmpty( ETrue );
-            }
-        else
-            {         
-            // Show 'Logs ' and 'Contacts' items
-            iToolbar->HideItem( EPhoneDialerCmdLog, EFalse,EFalse );
-            iToolbar->HideItem( EPhoneDialerCmdContacts, EFalse, EFalse );
-            
-            if ( iRestrictedDialer )
-                {
-                // Dim 'Logs' 
-                iToolbar->SetItemDimmed( EPhoneDialerCmdLog, ETrue
-                                       , EFalse );
-                // Dim 'Contacts' 
-                iToolbar->SetItemDimmed( EPhoneDialerCmdContacts, ETrue
-                                       , EFalse );
-                }
-                            
-            // Hide 'Send' and 'Add to contacts'        
-            iToolbar->HideItem( EPhoneNumberAcqCmdSendCommand, ETrue
-                                , EFalse );
-            iToolbar->HideItem( EPhoneNumberAcqCmdAddToContacts, ETrue
-                                , EFalse );                
-            }        
-        }
     }
 
 // ---------------------------------------------------------------------------
-// CreateButtonSetNumberEntryNotEmpty
-// ---------------------------------------------------------------------------
-//
-void CPhoneDialerController::CreateButtonSetNumberEntryNotEmpty()
-    {
-    if( iToolbar )
-        {
-        if( iDtmfDialerVisible )
-            {
-            // Show 'Send dtmf' 
-            iToolbar->SetItemDimmed( EPhoneCmdDtmfOk, EFalse, EFalse );
-            }           
-        else if ( iCustomizedDialer )
-            {
-            iCustomizedDialer->HandleNumberEntryIsEmpty( EFalse );
-            }
-        else
-            {
-            // Show 'Send' and 'Add to contacts'
-            iToolbar->HideItem( EPhoneNumberAcqCmdAddToContacts, EFalse
-                              , EFalse );      
-            iToolbar->HideItem( EPhoneNumberAcqCmdSendCommand, EFalse
-                              , EFalse );  
-                    
-            if ( iRestrictedDialer )
-                {
-                // Dim 'Send' 
-                iToolbar->SetItemDimmed( EPhoneNumberAcqCmdSendCommand, ETrue
-                                       , EFalse );
-                // Dim 'Add to Contacts' 
-                iToolbar->SetItemDimmed( EPhoneNumberAcqCmdAddToContacts, ETrue
-                                       , EFalse );
-                }  
-                           
-            // Hide 'Logs ' and 'Contacts' 
-            iToolbar->HideItem( EPhoneDialerCmdLog, ETrue,EFalse );
-            iToolbar->HideItem( EPhoneDialerCmdContacts, ETrue, EFalse ); 
-            
-            TPhoneCmdParamCallStateData callStateData;
-            callStateData.SetCallState( EPEStateConnected );
-            iBubbleWrapper.GetCallIdByState( &callStateData );
-            TInt connected = callStateData.CallId();    
-             
-            //If there is a active emergency call, Send item must be dimmed.  
-            if ( connected == KEmergencyCallId )
-                {
-                //Dim Send
-                iToolbar->SetItemDimmed( EPhoneNumberAcqCmdSendCommand, ETrue
-                                        ,EFalse );                
-                }
-            else
-                {
-                //UnDim
-                iToolbar->SetItemDimmed( EPhoneNumberAcqCmdSendCommand, EFalse
-                                        ,EFalse );                     
-                }
-            }    
-        }
-    }
-
-// ---------------------------------------------------------------------------
-// SetDtmfDialerVisibleL
-// ---------------------------------------------------------------------------
-//
-void CPhoneDialerController::SetDtmfDialerVisibleL( TBool aVisible )
-    {
-    iDtmfDialerVisible = aVisible;
-    
-    if( iDtmfDialerVisible )
-        {
-        // Load prompt resource text to DTMF dialer.
-        TInt resourceId = CPhoneMainResourceResolver::Instance()->
-                    ResolveResourceID( EPhoneDtmfDialerNumberEntryPromptText ); 
-                    
-        HBufC* loadedText = StringLoader::LoadL( resourceId
-                                               , &iCoeEnv );
-
-        iBubbleWrapper.SetNumberEntryPromptText( loadedText->Des() );
-        
-        delete loadedText;
-        }
-    else        
-        { 
-        // Clear prompt text.    
-        iBubbleWrapper.SetNumberEntryPromptText( KNullDesC );  
-                 
-        // Hide
-        iToolbar->HideItem( EPhoneCmdDtmfOk, ETrue, EFalse );  
-           
-        // Show       
-        iToolbar->HideItem( EPhoneNumberAcqCmdSendCommand, EFalse, EFalse );
-        iToolbar->HideItem( EPhoneDialerCmdLog, EFalse, EFalse );            
-        iToolbar->HideItem( EPhoneNumberAcqCmdAddToContacts, EFalse, EFalse );    
-        // Dimming 
-        iToolbar->SetItemDimmed( EPhoneDialerCmdContacts, EFalse, EFalse );                
-        }
-    }
-    
-// ---------------------------------------------------------------------------
 // SetRestrictedDialerL
 // ---------------------------------------------------------------------------
 //
@@ -420,326 +169,272 @@
     {
     iRestrictedDialer = aRestricted;
     }
-// ---------------------------------------------------------------------------
-// UpdateToolbar
-// ---------------------------------------------------------------------------
-//
-void CPhoneDialerController::UpdateToolbar()
-    {
-    
-    TPhoneCmdParamInteger numberEntryCountParam;
-    iBubbleWrapper.GetNumberEntryCount( 
-                            (TPhoneCommandParam*) &numberEntryCountParam );
-    TInt neLength( numberEntryCountParam.Integer() );
-    
-    if ( neLength )
-        {
-        CreateButtonSetNumberEntryNotEmpty();
-        iToolbar->SetItemDimmed( EPhoneDialerCmdClear, EFalse, EFalse );  
-        iToolbar->DrawDeferred();     
-        
-        //Update also options menu via controller
-        iMenuController.SetNumberEntryEmptyFlag( EFalse );        
-        }
-        
-    else
-        {
-        CreateButtonSetNumberEntryEmpty();
-        iToolbar->SetItemDimmed( EPhoneDialerCmdClear, ETrue, EFalse );
-        iToolbar->DrawDeferred();
-        
-        //Update also options menu via controller
-        iMenuController.SetNumberEntryEmptyFlag( ETrue );                  
-        } 
 
-    }   
-
-// ---------------------------------------------------------------------------
-// OfferToolbarEventL
-// ---------------------------------------------------------------------------
-//
-void CPhoneDialerController::OfferToolbarEventL( TInt aCommand )
-    {
-    switch ( aCommand )
-        {
-        case EPhoneDialerCmdClear:
-            {
-            // Send key event.
-            TKeyEvent keyEvent;
-            keyEvent.iModifiers = 0;
-            keyEvent.iRepeats = 0;
-            keyEvent.iCode = EKeyBackspace;
-            keyEvent.iScanCode = EStdKeyBackspace;
-            iCoeEnv.SimulateKeyEventL( keyEvent, EEventKey );
-            }
-            break;   
-        default:
-            {
-            // Forward pressed toolbar button to the framework 
-            // so that we can handle it in active state            
-            static_cast<MEikCommandObserver*>( CEikonEnv::Static()->EikAppUi() )
-               ->ProcessCommandL( aCommand );            
-            }
-            break;    
-        }
-    } 
-   
-// ---------------------------------------------------------------------------
-// DynInitToolbarL
-// ---------------------------------------------------------------------------
-//
-void CPhoneDialerController::DynInitToolbarL( TInt aResourceId, 
-                                              CAknToolbar* /*aToolbar*/ )
-    { 
-    if ( aResourceId == R_PHONEUI_TOOLBAR )
-        {
-        if ( !iDtmfDialerVisible )
-            {
-            UpdateToolbar();
-            }
-        else
-            {
-            // initialize toolbar for dtmf dialer
-            //
-            // Show
-            iToolbar->HideItem( EPhoneCmdDtmfOk, EFalse, EFalse );
-            iToolbar->HideItem( EPhoneDialerCmdContacts, EFalse, EFalse );     
-            
-            // Hide
-            iToolbar->HideItem( EPhoneNumberAcqCmdSendCommand, ETrue, EFalse );
-            iToolbar->HideItem( EPhoneDialerCmdLog, ETrue, EFalse );            
-            iToolbar->HideItem( EPhoneNumberAcqCmdAddToContacts, ETrue
-                              , EFalse );     
-            
-            // Dimming
-            iToolbar->SetItemDimmed( EPhoneDialerCmdContacts, ETrue, EFalse ); 
-            iToolbar->SetItemDimmed( EPhoneCmdDtmfOk, ETrue, EFalse );                   
-            }
-        }     
-    }
-// ---------------------------------------------------------------------------
-// IsDTMFDialerVisible
-// ---------------------------------------------------------------------------
-//
-TBool CPhoneDialerController::IsDTMFDialerVisible() const
-    {
-    return iDtmfDialerVisible;
-    }
-
-
-// ---------------------------------------------------------------------------
-// GetTooltipText
-//
-// Tooltip texts for toolbar buttons
-// ---------------------------------------------------------------------------
-//
-void  CPhoneDialerController::GetTooltipTextL( TInt aCommandId, HBufC*& aText ) 
-    {
-    TInt resourceId = 0;
-    switch( aCommandId )
-        {
-        case EPhoneDialerCmdLog:
-            resourceId = R_PHONEUI_DIALER_TOOLTIP_RECENT_CALLS;
-            break;              
-                  
-        case EPhoneNumberAcqCmdSendCommand:
-            resourceId = R_PHONEUI_DIALER_TOOLTIP_CALL;
-            break;      
-                          
-        case EPhoneCmdDtmfOk:
-            resourceId = R_PHONEUI_DIALER_TOOLTIP_SEND;
-            break;   
-                             
-        case EPhoneDialerCmdContacts:
-            resourceId = R_PHONEUI_DIALER_TOOLTIP_CONTACTS;
-            break;   
-                             
-        case EPhoneNumberAcqCmdAddToContacts:
-            resourceId = R_PHONEUI_DIALER_TOOLTIP_ADD_TO_CONTACTS;
-            break;   
-                             
-        case EPhoneDialerCmdClear:
-            resourceId = R_PHONEUI_DIALER_TOOLTIP_CLEAR;
-            break;
-        default:
-            aText = KNullDesC().Alloc();
-            break;
-        }
-        
-    if( resourceId )
-        {
-        aText = StringLoader::LoadL( resourceId, &iCoeEnv );
-        }
-        
-    }
 // ---------------------------------------------------------------------------
 // SetServiceCodeFlagL
 //
-// Change call button tooltip text between 'Send' or 'Call'
+// The flag rules wether green key is called "Send" or "Call"
 // 
 // ---------------------------------------------------------------------------
 //
-void CPhoneDialerController::SetServiceCodeFlagL( 
+void CPhoneDialerController::SetServiceCodeFlag( 
     TPhoneCommandParam* aCommandParam )
     {
-    
     // Check is the given parameter valid
     if ( aCommandParam->ParamId() == TPhoneCommandParam::EPhoneParamIdBoolean )
-        {   
-        TInt resourceId = 0;
+        {
         TPhoneCmdParamBoolean* serviceCodeFlag = 
             static_cast<TPhoneCmdParamBoolean*>( aCommandParam );
-        // Sanity check
-        if( serviceCodeFlag->Boolean() == iServiceCodeFlag )
-            {
-            return;
-            }
-        // Get the toolbar button control
-        CAknButton* button = static_cast<CAknButton*>
-        ( iToolbar->ControlOrNull( EPhoneNumberAcqCmdSendCommand) );
-        
-        CAknButtonState* state = button->State();                              
-        if ( serviceCodeFlag->Boolean() )
-            {
-            iServiceCodeFlag = ETrue;
-            resourceId = R_PHONEUI_DIALER_TOOLTIP_SEND;
-            }
-        else
-            {
-            iServiceCodeFlag = EFalse;
-            resourceId = R_PHONEUI_DIALER_TOOLTIP_CALL;
-            }  
-                
-        if( resourceId )
-            {    
-            // Change text              
-            HBufC* tooltipText = StringLoader::LoadL( resourceId,
-                                             CCoeEnv::Static() );
-            CleanupStack::PushL( tooltipText );                                         
-            state->SetHelpTextL( *tooltipText );
-            CleanupStack::PopAndDestroy( tooltipText );   
-            }
+        iServiceCodeFlag = serviceCodeFlag->Boolean();
         }
     }
 
 // ---------------------------------------------------------------------------
-// ShowToolbar
+// SetEasyDialingController
+// ---------------------------------------------------------------------------
 //
+void CPhoneDialerController::SetEasyDialingController( 
+        CPhoneEasyDialingController* aController )
+    {
+    iEasyDialingController = aController;
+    }
+
+// ---------------------------------------------------------------------------
+// CbaResourceId
 // ---------------------------------------------------------------------------
 //
-void CPhoneDialerController::ShowToolbar()
+EXPORT_C TInt CPhoneDialerController::CbaResourceId() const
+    {
+    return KErrNotFound;
+    }
+
+// ---------------------------------------------------------------------------
+// MenuResourceId
+// ---------------------------------------------------------------------------
+//
+EXPORT_C TInt CPhoneDialerController::MenuResourceId() const
     {
-    if ( iToolbar )
-        {
-        if ( iToolbar->IsToolbarDisabled() )
-            {
-            TRAP_IGNORE(iToolbar->DisableToolbarL( EFalse ));
-            }
-        iToolbar->HideItemsAndDrawOnlyBackground( EFalse );
-        iToolbar->SetToolbarVisibility( ETrue, EFalse );
-        }
+    return KErrNotFound;
+    }
+
+// ---------------------------------------------------------------------------
+// NumberEntryPromptTextL
+// ---------------------------------------------------------------------------
+//
+EXPORT_C const TDesC& CPhoneDialerController::NumberEntryPromptTextL()
+    {
+    return KNullDesC;
     }
 
 // ---------------------------------------------------------------------------
-// HideToolbar
-//
+// GetButtonData
 // ---------------------------------------------------------------------------
 //
-void CPhoneDialerController::HideToolbar()
+EXPORT_C TInt CPhoneDialerController::GetButtonData( TButtonIndex aIndex, 
+        RPointerArray<CButtonData>& aData ) const
     {
-    if ( iToolbar )
+    TInt err = KErrNone;
+    
+    const TLocalButtonData* dataTable = NULL;
+    TInt count = 0;
+    
+    // Select correct data table
+    switch ( aIndex )
         {
-        if( iToolbar->IsShown() )
+        case ECallButton:
+            dataTable = KCallButtonDataTable;
+            count = KCallButtonDataTableCount;
+            break;
+        case EPhonebookButton:
+            dataTable = KPhonebookButtonDataTable;
+            count = KPhonebookButtonDataTableCount;
+            break;
+        case EClearButton:
+            dataTable = KClearButtonDataTable;
+            count = KClearButtonDataTableCount;
+            break;
+        default:
+            break;
+        }
+    
+    // Create data from the table
+    if ( dataTable )
+        {
+        // Construct MIF file path
+        TFileName mifPath( KDriveZ );
+        mifPath.Append( KDC_APP_BITMAP_DIR );
+        mifPath.Append( KPhoneMifFileName );
+        MAknsSkinInstance* skin = AknsUtils::SkinInstance();
+    
+        for ( TInt i = 0 ; i < count ; ++i )
             {
-            iToolbar->HideItemsAndDrawOnlyBackground( ETrue );
+            CButtonData* btnData = NULL;
+            TRAP( err, btnData = CreateButtonDataL( dataTable[i], skin, mifPath ) );
+            if ( !err )
+                {
+                err = aData.Append( btnData );
+                }
+            if ( err )
+                {
+                // free all memory and stop here if something went wrong
+                delete btnData;
+                aData.ResetAndDestroy();
+                i = count;
+                }
             }
-        else if ( iToolbar->IsToolbarDisabled() )
-            {
-            TRAP_IGNORE(iToolbar->DisableToolbarL( EFalse ));
-            iToolbar->HideItemsAndDrawOnlyBackground( ETrue );
-            iToolbar->SetToolbarVisibility( ETrue, EFalse );
-            }
-        }        
+        }
+    return err;
+    }
+
+// ---------------------------------------------------------------------------
+// SetNumberEntryEmptyIsEmpty
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CPhoneDialerController::SetNumberEntryIsEmpty( TBool aEmpty )
+    {
+    iNumberAvailable = !aEmpty;
     }
 
 // ---------------------------------------------------------------------------
-// ShowCustomizedDialerL
-//
-// Sets custom dialer buttons visible
-// 
+// ButtonState
 // ---------------------------------------------------------------------------
 //
-void CPhoneDialerController::ShowCustomizedDialerL( 
-    MPhoneDialerController* aCustomController )
-    {  
-    if ( aCustomController )
+EXPORT_C TInt CPhoneDialerController::ButtonState( TButtonIndex aIndex ) const
+    {
+    TInt state = 0;
+    // Figure out correct state for each key
+    switch ( aIndex )
         {
-        // Hide all buttons except clear button 
-        for ( TInt i = 0; i < KNumberOfButtons; i++ )
+        case ECallButton:
             {
-            if ( bArray[ i ].iCommandId != EPhoneDialerCmdClear )
+            state = ECallButtonCallStateIndex;
+            if ( !iNumberAvailable )
+                {
+                state = ECallButtonLogStateIndex;
+                }
+            else if ( iServiceCodeFlag )
                 {
-                iToolbar->HideItem( bArray[ i ].iCommandId, ETrue, EFalse );
+                // Set "Send" state unless Easy dialing is focused
+                TBool edFocused = EFalse;
+                if ( iEasyDialingController )
+                    {
+                    TInt commandResponse( EPhoneViewResponseFailed );
+                    TRAP_IGNORE( commandResponse = iEasyDialingController->HandleCommandL(
+                            EPhoneViewGetEasyDialingInFocusStatus) );
+                    edFocused = ( commandResponse == EPhoneViewResponseSuccess );
+                    }
+                if ( !edFocused )
+                    {
+                    state = ECallButtonSendStateIndex;
+                    }
                 }
             }
- 
-        aCustomController->InitializeL( *iToolbar );
-        iBubbleWrapper.SetNumberEntryPromptText( 
-            aCustomController->NumberEntryPromptTextL() );
-        aCustomController->ShowButtons( ETrue );
+            break;
+        case EPhonebookButton:
+            {
+            if ( !iNumberAvailable )
+                {
+                state = EPhonebookButtonContactsIndex;
+                }
+            else
+                {
+                state = EPhonebookButtonAddContactIndex;
+                }
+            }
+            break;
+        case EClearButton:
+            {
+            state = EClearButtonClearIndex;
+            }
+            break;
+        default:
+            break;
         }
-    iCustomizedDialer = aCustomController;
+    return state;
     }
 
 // ---------------------------------------------------------------------------
-// HideCustomizedDialerL
-//
-// Hides custom dialer buttons 
-// 
+// ButtonDimmed
 // ---------------------------------------------------------------------------
 //
-void CPhoneDialerController::HideCustomizedDialer()
-    {  
-    iCustomizedDialer->ShowButtons( EFalse );
-    iBubbleWrapper.SetNumberEntryPromptText( KNullDesC );              
-    iCustomizedDialer = NULL;
+EXPORT_C TBool CPhoneDialerController::ButtonDimmed( TButtonIndex aIndex ) const
+    {
+    TBool dimmed = EFalse;
+    // Figure out correct state for each key
+    switch ( aIndex )
+        {
+        case ECallButton:
+            dimmed = iRestrictedDialer;
+            if ( !dimmed )
+                {
+                // Prevent calling but don't prevent log during emergency call
+                dimmed = ( iNumberAvailable && EmergencyCallActive() );
+                }
+            break;
+        case EPhonebookButton:
+            dimmed = iRestrictedDialer;
+            break;
+        case EClearButton:
+            dimmed = !iNumberAvailable;
+            break;
+        default:
+            break;
+        }
+    return dimmed;
     }
 
 // ---------------------------------------------------------------------------
-// IsCustomizedDialerVisible
+// EasyDialingAllowed
 // ---------------------------------------------------------------------------
 //
-TBool CPhoneDialerController::IsCustomizedDialerVisible() const
+EXPORT_C TBool CPhoneDialerController::EasyDialingAllowed() const
     {
-    return ( NULL != iCustomizedDialer );
+    return !iRestrictedDialer && !EmergencyCallActive();
     }
 
 // ---------------------------------------------------------------------------
-// CustomizedCbaResourceId
+// EmergencyCallActive
 // ---------------------------------------------------------------------------
 //
-TInt CPhoneDialerController::CustomizedCbaResourceId() const
+EXPORT_C TBool CPhoneDialerController::EmergencyCallActive() const
     {
-    TInt resourceId = KErrNotFound;
-    if ( iCustomizedDialer )
+    TBool ret = EFalse;
+    if ( iBubbleWrapper )
         {
-        resourceId = iCustomizedDialer->CbaResourceId();
+        TPhoneCmdParamCallStateData callStateData;
+        callStateData.SetCallState( EPEStateConnected );
+        iBubbleWrapper->GetCallIdByState( &callStateData );
+        TInt connected = callStateData.CallId();    
+        ret = ( connected == KEmergencyCallId );
         }
-    return resourceId;
+    return ret;
     }
 
 // ---------------------------------------------------------------------------
-// CustomizedMenuResourceId
+// CreateButtonDataL
 // ---------------------------------------------------------------------------
 //
-TInt CPhoneDialerController::CustomizedMenuResourceId() const
+MPhoneDialerController::CButtonData* CPhoneDialerController::CreateButtonDataL( 
+        const TLocalButtonData& aSourceData, 
+        MAknsSkinInstance* aSkin, 
+        const TDesC& aMifFile ) const
     {
-    TInt resourceId = KErrNotFound;
-    if ( iCustomizedDialer )
-        {
-        resourceId = iCustomizedDialer->MenuResourceId();  
-        }
-    return resourceId;
+    // Create tooltip text
+    HBufC* tooltip = StringLoader::LoadLC( aSourceData.iTooltipResourceId );
+    
+    // Create icon
+    TAknsItemID skinId = { EAknsMajorGeneric, aSourceData.iSkinItemIdMinor };
+    CGulIcon* icon = AknsUtils::CreateGulIconL( aSkin, skinId, aMifFile, 
+            aSourceData.iBitmapIndex, aSourceData.iBitmapMaskIndex );
+    CleanupStack::PushL( icon );
+    
+    // Create button data object
+    CButtonData* buttonData =
+        new ( ELeave ) CButtonData( aSourceData.iCommandId, icon, tooltip );
+    CleanupStack::Pop( icon );
+    CleanupStack::Pop( tooltip );
+    
+    return buttonData;
     }
 
 // END