diff -r c84cf270c54f -r 8871b09be73b phoneapp/phoneuiview/src/cphonedialercontroller.cpp --- 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 #include #include -#include -#include #include +#include #include +#include #include #include #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( CEikonEnv::Static()->AppUiFactory() ); - appUiFactory->SetViewFixedToolbar( iToolbar ); - - if( iToolbar ) - { - iToolbar->SetToolbarObserver( - static_cast( 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( 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( aCommandParam ); - // Sanity check - if( serviceCodeFlag->Boolean() == iServiceCodeFlag ) - { - return; - } - // Get the toolbar button control - CAknButton* button = static_cast - ( 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& 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