diff -r 000000000000 -r 2e3d3ce01487 coreapplicationuis/SysAp/Src/CenRepObservers/sysapcenrepmsgwaitingobserver.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/coreapplicationuis/SysAp/Src/CenRepObservers/sysapcenrepmsgwaitingobserver.cpp Tue Feb 02 10:12:00 2010 +0200 @@ -0,0 +1,339 @@ +/* +* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Message waiting CenRep-key observer implementation. +* +*/ + + +#include "sysapcenrepmsgwaitingobserver.h" +#include "SysApAppUi.h" +#include "SysApEtelConnector.h" + +static const TInt KCenRepKeyUninitialized = -1; + +// ========================== LOCAL FUNCTIONS ================================ +static TBool BitFieldChanged( TInt aNewValue, TInt aOldValue, TInt aBitField ) + { + return ( (aNewValue & aBitField) != (aOldValue & aBitField) ); + } + +// ========================== MEMBER FUNCTIONS ================================ + +// ---------------------------------------------------------------------------- +// CSysApCenRepMsgWaitingObserver* CSysApCenRepMsgWaitingObserver::NewL() +// ---------------------------------------------------------------------------- +// +CSysApCenRepMsgWaitingObserver* CSysApCenRepMsgWaitingObserver::NewL( CSysApAppUi& aSysApAppUi ) + { + TRACES( RDebug::Print( _L("CSysApCenRepMsgWaitingObserver::NewL" ) ) ); + CSysApCenRepMsgWaitingObserver* self = new ( ELeave ) CSysApCenRepMsgWaitingObserver( aSysApAppUi ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop(); //self + return self; + } + +// ---------------------------------------------------------------------------- +// CSysApCenRepMsgWaitingObserver::CSysApCenRepMsgWaitingObserver( CSysApAppUi& aSysApAppUi ) +// ---------------------------------------------------------------------------- +// +CSysApCenRepMsgWaitingObserver::CSysApCenRepMsgWaitingObserver( CSysApAppUi& aSysApAppUi ) + : iSysApAppUi( aSysApAppUi ), + iSession( NULL ), + iMessageWaitingHandler( NULL ), + iMessageWaitingDisplayStatus( 0 ), + iOldDisplayStatus( 0 ), + iUiReady( EFalse ) + { + TRACES( RDebug::Print( _L("CSysApCenRepMsgWaitingObserver::CSysApCenRepMsgWaitingObserver" ) ) ); + } + +// ---------------------------------------------------------------------------- +// CSysApCenRepMsgWaitingObserver::~CSysApCenRepMsgWaitingObserver() +// ---------------------------------------------------------------------------- +// +CSysApCenRepMsgWaitingObserver::~CSysApCenRepMsgWaitingObserver() + { + TRACES( RDebug::Print( _L("~CSysApCenRepMsgWaitingObserver") ) ); + if ( iMessageWaitingHandler ) + { + iMessageWaitingHandler->StopListening(); + } + delete iMessageWaitingHandler; + delete iSession; + } + +// ---------------------------------------------------------------------------- +// CSysApCenRepMsgWaitingObserver::ConstructL() +// ---------------------------------------------------------------------------- +// +void CSysApCenRepMsgWaitingObserver::ConstructL() + { + TRACES( RDebug::Print( _L("CSysApCenRepMsgWaitingObserver::ConstructL") ) ); + + iSession = CRepository::NewL( KCRUidCtsyMessageWaitingIndicator ); + + iMessageWaitingHandler = CCenRepNotifyHandler::NewL( *this, + *iSession, + CCenRepNotifyHandler::EIntKey, + KCtsyMessageWaitingDisplayStatus ); + + iMessageWaitingHandler->StartListeningL(); + + TInt err = iSession->Get( KCtsyMessageWaitingDisplayStatus, iMessageWaitingDisplayStatus ); + + if ( err == KErrNone ) + { + TRACES( RDebug::Print( _L("CSysApCenRepMsgWaitingObserver::ConstructL(): iMessageWaitingDisplayStatus=0x%x" ), + iMessageWaitingDisplayStatus ) ); + + if ( iMessageWaitingDisplayStatus == KCenRepKeyUninitialized ) + { + iMessageWaitingDisplayStatus = 0; + } + } + else + { + TRACES( RDebug::Print( _L("CSysApCenRepMsgWaitingObserver::ConstructL(): err=%d" ), err ) ); + } + } + +// ---------------------------------------------------------------------------- +// CSysApCenRepMsgWaitingObserver::HandleNotifyInt() +// ---------------------------------------------------------------------------- +// +void CSysApCenRepMsgWaitingObserver::HandleNotifyInt( TUint32 aId, TInt aNewValue ) + { + TRACES( RDebug::Print( _L("CSysApCenRepMsgWaitingObserver::HandleNotifyInt(): aId=0x%x, aNewValue=0x%x, iUiReady=%d" ), + aId, aNewValue, iUiReady ) ); + + if ( aId == KCtsyMessageWaitingDisplayStatus ) + { + iOldDisplayStatus = iMessageWaitingDisplayStatus; + + iMessageWaitingDisplayStatus = ( aNewValue == KCenRepKeyUninitialized ? 0 : aNewValue ); + + if ( iUiReady ) + { + TRAPD( err, UpdateMessageWaitingIndicatorsIfNeededL() ); + + if ( err != KErrNone ) + { + TRACES( RDebug::Print( _L("CSysApCenRepMsgWaitingObserver::HandleNotifyInt(): err=%d"), err ) ); + iMessageWaitingDisplayStatus = 0; // forced update on next notification + } + } + } + } + + +// ---------------------------------------------------------------------------- +// CSysApCenRepMsgWaitingObserver::HandleNotifyError() +// ---------------------------------------------------------------------------- +// +void CSysApCenRepMsgWaitingObserver::HandleNotifyError( TUint32 /* aId */, TInt /* error */, CCenRepNotifyHandler* /* aHandler */ ) + { + TRACES( RDebug::Print( _L("CSysApCenRepMsgWaitingObserver::HandleNotifyError()" ) ) ); + } + +// ---------------------------------------------------------------------------- +// CSysApCenRepMsgWaitingObserver::UpdateMessageWaitingIndicatorsL() +// ---------------------------------------------------------------------------- +// +void CSysApCenRepMsgWaitingObserver::UpdateMessageWaitingIndicatorsL() + { + TRACES( RDebug::Print( _L("CSysApCenRepMsgWaitingObserver::UpdateMessageWaitingIndicatorsL(): iMessageWaitingDisplayStatus=0x%x, iUiReady=%d" ), + iMessageWaitingDisplayStatus, iUiReady ) ); + + if ( !iUiReady ) + { + iUiReady = ETrue; // start updating indicators according to notifications + } + + // Update requested from outside of this class, forcibly update all indicators + UpdateVoiceMailWaitingIndicatorsL(); + UpdateFaxMessageWaitingIndicatorL(); + UpdateEmailMessageWaitingIndicatorL(); + UpdateOtherMessageWaitingIndicatorL(); + + TRACES( RDebug::Print( _L("CSysApCenRepMsgWaitingObserver::UpdateMessageWaitingIndicatorsL(): end" ) ) ); + } + +// ---------------------------------------------------------------------------- +// CSysApCenRepMsgWaitingObserver::UpdateMessageWaitingIndicatorsIfNeededL() +// ---------------------------------------------------------------------------- +// +void CSysApCenRepMsgWaitingObserver::UpdateMessageWaitingIndicatorsIfNeededL() const + { + if ( BitFieldChanged( iMessageWaitingDisplayStatus, iOldDisplayStatus, RMobilePhone::KDisplayVoicemailActive|RMobilePhone::KDisplayAuxVoicemailActive ) ) + { + UpdateVoiceMailWaitingIndicatorsL(); + } + + if ( BitFieldChanged( iMessageWaitingDisplayStatus, iOldDisplayStatus, RMobilePhone::KDisplayFaxActive ) ) + { + UpdateFaxMessageWaitingIndicatorL(); + } + + if ( BitFieldChanged( iMessageWaitingDisplayStatus, iOldDisplayStatus, RMobilePhone::KDisplayEmailActive ) ) + { + UpdateEmailMessageWaitingIndicatorL(); + } + + if ( BitFieldChanged( iMessageWaitingDisplayStatus, iOldDisplayStatus, RMobilePhone::KDisplayOtherActive ) ) + { + UpdateOtherMessageWaitingIndicatorL(); + } + } + +// ---------------------------------------------------------------------------- +// CSysApCenRepMsgWaitingObserver::UpdateFaxMessageWaitingIndicatorL() +// ---------------------------------------------------------------------------- +// +void CSysApCenRepMsgWaitingObserver::UpdateFaxMessageWaitingIndicatorL() const + { + if ( iMessageWaitingDisplayStatus & RMobilePhone::KDisplayFaxActive ) + { + iSysApAppUi.SetIndicatorStateL( EAknIndicatorFaxMessage, EAknIndicatorStateOn ); + } + else + { + iSysApAppUi.SetIndicatorStateL( EAknIndicatorFaxMessage, EAknIndicatorStateOff ); + } + } + +// ---------------------------------------------------------------------------- +// CSysApCenRepMsgWaitingObserver::UpdateEmailMessageWaitingIndicatorL() +// ---------------------------------------------------------------------------- +// +void CSysApCenRepMsgWaitingObserver::UpdateEmailMessageWaitingIndicatorL() const + { + + if ( iMessageWaitingDisplayStatus & RMobilePhone::KDisplayEmailActive ) + { + iSysApAppUi.SetIndicatorStateL( EAknIndicatorRemoteMailboxEmailMessage, EAknIndicatorStateOn ); + } + else + { + iSysApAppUi.SetIndicatorStateL( EAknIndicatorRemoteMailboxEmailMessage, EAknIndicatorStateOff ); + } + } + +// ---------------------------------------------------------------------------- +// CSysApCenRepMsgWaitingObserver::UpdateOtherMessageWaitingIndicatorL() +// ---------------------------------------------------------------------------- +// +void CSysApCenRepMsgWaitingObserver::UpdateOtherMessageWaitingIndicatorL() const + { + if ( iMessageWaitingDisplayStatus & RMobilePhone::KDisplayOtherActive ) + { + iSysApAppUi.SetIndicatorStateL( EAknIndicatorOtherMessage, EAknIndicatorStateOn ); + } + else + { + iSysApAppUi.SetIndicatorStateL( EAknIndicatorOtherMessage, EAknIndicatorStateOff ); + } + } + +// ---------------------------------------------------------------------------- +// CSysApCenRepMsgWaitingObserver::UpdateVoiceMailWaitingIndicatorsL() +// ---------------------------------------------------------------------------- +// +void CSysApCenRepMsgWaitingObserver::UpdateVoiceMailWaitingIndicatorsL() const + { + + switch( ResolveVoiceMailState() ) + { + case EWaiting: + iSysApAppUi.SetIndicatorStateL( EAknIndicatorVoiceMailWaitingOnLine1, EAknIndicatorStateOff ); + iSysApAppUi.SetIndicatorStateL( EAknIndicatorVoiceMailWaitingOnLine2, EAknIndicatorStateOff ); + iSysApAppUi.SetIndicatorStateL( EAknIndicatorVoiceMailWaitingOnBothLines, EAknIndicatorStateOff ); + iSysApAppUi.SetIndicatorStateL( EAknIndicatorVoiceMailWaiting, EAknIndicatorStateOn ); + break; + case EWaitingOnLine1: + iSysApAppUi.SetIndicatorStateL( EAknIndicatorVoiceMailWaitingOnLine2, EAknIndicatorStateOff ); + iSysApAppUi.SetIndicatorStateL( EAknIndicatorVoiceMailWaitingOnBothLines, EAknIndicatorStateOff ); + iSysApAppUi.SetIndicatorStateL( EAknIndicatorVoiceMailWaiting, EAknIndicatorStateOff ); + iSysApAppUi.SetIndicatorStateL( EAknIndicatorVoiceMailWaitingOnLine1, EAknIndicatorStateOn ); + break; + case EWaitingOnLine2: + iSysApAppUi.SetIndicatorStateL( EAknIndicatorVoiceMailWaitingOnLine1, EAknIndicatorStateOff ); + iSysApAppUi.SetIndicatorStateL( EAknIndicatorVoiceMailWaitingOnBothLines, EAknIndicatorStateOff ); + iSysApAppUi.SetIndicatorStateL( EAknIndicatorVoiceMailWaiting, EAknIndicatorStateOff ); + iSysApAppUi.SetIndicatorStateL( EAknIndicatorVoiceMailWaitingOnLine2, EAknIndicatorStateOn ); + break; + case EWaitingOnBothLines: + iSysApAppUi.SetIndicatorStateL( EAknIndicatorVoiceMailWaitingOnLine1, EAknIndicatorStateOff ); + iSysApAppUi.SetIndicatorStateL( EAknIndicatorVoiceMailWaitingOnLine2, EAknIndicatorStateOff ); + iSysApAppUi.SetIndicatorStateL( EAknIndicatorVoiceMailWaiting, EAknIndicatorStateOff ); + iSysApAppUi.SetIndicatorStateL( EAknIndicatorVoiceMailWaitingOnBothLines, EAknIndicatorStateOn ); + break; + case ENoVoiceMails: + iSysApAppUi.SetIndicatorStateL( EAknIndicatorVoiceMailWaitingOnLine1, EAknIndicatorStateOff ); + iSysApAppUi.SetIndicatorStateL( EAknIndicatorVoiceMailWaitingOnLine2, EAknIndicatorStateOff ); + iSysApAppUi.SetIndicatorStateL( EAknIndicatorVoiceMailWaitingOnBothLines, EAknIndicatorStateOff ); + iSysApAppUi.SetIndicatorStateL( EAknIndicatorVoiceMailWaiting, EAknIndicatorStateOff ); + break; + default: + break; + } + + } + +// --------------------------------------------------------------------------- +// CSysApCenRepMsgWaitingObserver::ResolveVoiceMailState() +// --------------------------------------------------------------------------- +// +CSysApCenRepMsgWaitingObserver::TVoiceMailWaitingState CSysApCenRepMsgWaitingObserver::ResolveVoiceMailState() const + { + TVoiceMailWaitingState voiceMailState(ENoVoiceMails); + + TBool alsSupported(EFalse); + + CSysApEtelConnector* etelConnector = iSysApAppUi.EtelConnector(); + + if ( etelConnector ) + { + alsSupported = etelConnector->AlsSupported(); + } + + if ( alsSupported ) // line specific indicator is shown if ALS is supported + { + if ( ( iMessageWaitingDisplayStatus & RMobilePhone::KDisplayAuxVoicemailActive ) + && ( iMessageWaitingDisplayStatus & RMobilePhone::KDisplayVoicemailActive ) ) + { + voiceMailState = EWaitingOnBothLines; + } + else if ( iMessageWaitingDisplayStatus & RMobilePhone::KDisplayVoicemailActive ) + { + voiceMailState = EWaitingOnLine1; + } + else if ( iMessageWaitingDisplayStatus & RMobilePhone::KDisplayAuxVoicemailActive ) + { + voiceMailState = EWaitingOnLine2; + } + } + else + { + if ( iMessageWaitingDisplayStatus & RMobilePhone::KDisplayVoicemailActive ) + { + voiceMailState = EWaiting; + } + } + + return voiceMailState; + } + +// End of File +