diff -r 000000000000 -r 72b543305e3a messagingappbase/ncnlist/src/CNcnNotifier.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/messagingappbase/ncnlist/src/CNcnNotifier.cpp Thu Dec 17 08:44:11 2009 +0200 @@ -0,0 +1,557 @@ +/* +* Copyright (c) 2004 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: Methods for CNcnNotifier class. +* +*/ + + + +// INCLUDE FILES +#include +#include +#include +#include + +#include "CNcnNotifier.h" +#include "NcnModelBase.h" +#include "MNcnUI.h" +#include "MNcnMsgWaitingManager.h" + + +// ================= LOCAL CONSTANTS ======================= + +// ================= MEMBER FUNCTIONS ======================= + +// ---------------------------------------------------- +// CNcnNotifier::CNcnNotifier +// ---------------------------------------------------- +// +CNcnNotifier::CNcnNotifier( MNcnUI& aNcnUI, CNcnModelBase& aModel ) : + iNcnUI( aNcnUI ), + iModel( aModel ) + { + // clear notification amount array + for( int i = 0; i < ENcnNoNotification; i++ ) + { + iNotificationAmounts[ i ] = 0; + } + } + +// ---------------------------------------------------- +// CNcnNotifier::ConstructL +// ---------------------------------------------------- +// +void CNcnNotifier::ConstructL() + { + + TInt state; + CRepository* repository = NULL; + iDisplayLightstate = 63; + TRAPD( err, repository = CRepository::NewL( KCRUidMuiuMessagingConfiguration ) ); + if( err == KErrNone && repository != NULL ) + { + CleanupStack::PushL( repository ); + + err = repository->Get( KMuiuDisplayLightsConfiguration, state ); + NCN_RDEBUG_INT( _L("CNcnNotifier::ConstructL() - iDisplayLightstate: %d"), state ); + if(err == KErrNone) + iDisplayLightstate = state; + } + CleanupStack::PopAndDestroy( repository ); + + } + +// ---------------------------------------------------- +// CNcnNotifier::NewL +// ---------------------------------------------------- +// +CNcnNotifier* CNcnNotifier::NewL( MNcnUI& aNcnUI, CNcnModelBase& aModel ) + { + CNcnNotifier* self = new (ELeave) CNcnNotifier( aNcnUI, aModel ); + + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + + return self; + } + +// ---------------------------------------------------- +// CNcnNotifier::~CNcnNotifier +// ---------------------------------------------------- +// +CNcnNotifier::~CNcnNotifier() + { + } + +// ---------------------------------------------------- +// CNcnNotifier::SetNotification +// ---------------------------------------------------- +// +void CNcnNotifier::SetNotification( + TNcnNotificationType aNotificationType, + TUint aAmount, + TBool aIcon, + TBool aTone, + TBool aNote ) + { + NCN_RDEBUG_INT( _L("CNcnNotifier::SetNotification() - aNotificationType: %d"), aNotificationType ); + + // if notification is one of the specified notifications + // (ENcnNoNotification is a special case with no amount) + if( aNotificationType != ENcnNoNotification ) + { + NCN_RDEBUG_INT( _L("CNcnNotifier::SetNotification() - prev: %d"), iNotificationAmounts[ aNotificationType ] ); + NCN_RDEBUG_INT( _L("CNcnNotifier::SetNotification() - curr: %d"), aAmount ); + + // update notification only if amount changes + if( iNotificationAmounts[ aNotificationType ] != aAmount || aAmount == 0 || + aNotificationType == MNcnNotifier::ENcnVoiceMailNotification || + aNotificationType == MNcnNotifier::ENcnVoiceMailOnLine1Notification || + aNotificationType == MNcnNotifier::ENcnVoiceMailOnLine2Notification ) + { + // store previous amount + TUint previousAmount = iNotificationAmounts[ aNotificationType ]; + + // change notification amount + iNotificationAmounts[ aNotificationType ] = aAmount; + + // update notification + HandleNotificationChange( + aNotificationType, + previousAmount, + aAmount, + aIcon, + aTone, + aNote ); + } + } + } + +// ---------------------------------------------------- +// CNcnNotifier::NotificationAmount +// ---------------------------------------------------- +// +TUint CNcnNotifier::NotificationAmount( + TNcnNotificationType aNotificationType ) + { + TUint amount = 0; + + // if notification is one of the specified notifications + // (ENcnNoNotification is a special case with no amount) + if( aNotificationType != ENcnNoNotification ) + { + amount = iNotificationAmounts[ aNotificationType ]; + } + + return amount; + } + + +// ---------------------------------------------------- +// CNcnNotifier::HandleNotificationChange +// ---------------------------------------------------- +// +void CNcnNotifier::HandleNotificationChange( + TNcnNotificationType aNotificationType, + TUint aPreviousAmount, + TUint aCurrentAmount, + TBool aIcon, + TBool aTone, + TBool aNote ) + { + TBool displaySN; + NCN_RDEBUG_INT( _L("CNcnNotifier::HandleNotificationChange() - notifType: %d"), aNotificationType ); + + + + // handles voice mail note as the correct amount of new + // voice mail messages isn't known + TBool amountUnknown( EFalse ); + + // determine notification type + switch( aNotificationType ) + { + case MNcnNotifier::ENcnClass0MessageNotification: + { + HandleClass0MessageNotificationChange( + aPreviousAmount, + aCurrentAmount ); + break; + } + case MNcnNotifier::ENcnMessagesNotification: + { + HandleMessageNotificationChange( + aPreviousAmount, + aCurrentAmount ); + break; + } + case MNcnNotifier::ENcnAudioMessagesNotification: + { + HandleAudioMessageNotificationChange( + aPreviousAmount, + aCurrentAmount ); + break; + } + case MNcnNotifier::ENcnVoiceMailNotification: + case MNcnNotifier::ENcnVoiceMailOnLine1Notification: + case MNcnNotifier::ENcnVoiceMailOnLine2Notification: + { + amountUnknown = ETrue; + + HandleVoiceMailNotificationChange( + aPreviousAmount, + aCurrentAmount ); + break; + } + + case MNcnNotifier::ENcnEmailNotification: + { + //Email define which notes they want + //others don't define it ATM. + HandleEMailNotificationChange( + aPreviousAmount, + aCurrentAmount, + aIcon, + aTone ); + break; + } + default: + { + break; + } + } + TRAP_IGNORE( displaySN = CheckSNStatusL( aNotificationType )); + TBool DisplayLight = CheckDLStatus( aNotificationType ); + NCN_RDEBUG_INT( _L("CNcnNotifier::HandleNotificationChange() - displaySN: %d"), displaySN ); + + // note is updated only if the count increases + // or if count remains the same as is the case with voice mail messages, + // where we don't know the actual message amount + if( ( aCurrentAmount > aPreviousAmount ) + && displaySN + && aNote ) + { + if(DisplayLight) + { + NCN_RDEBUG( _L( "CNcnNotifier::HandleNotificationChange - calling Flash Display" ) ); + iNcnUI.FlashDisplay(); + } + iNcnUI.UpdateSoftNotification( aNotificationType, aCurrentAmount ); + } + else + if( amountUnknown // This is ETrue only with voicemails + && displaySN + && aCurrentAmount > 0 + ) + { + if(DisplayLight) + { + NCN_RDEBUG( _L( "CNcnNotifier::HandleNotificationChange - calling Flash Display" ) ); + iNcnUI.FlashDisplay(); + } + iNcnUI.UpdateSoftNotification( aNotificationType, aCurrentAmount ); + } + //If the count decreases we must wipe it out + else + { + iNcnUI.UpdateSoftNotification( aNotificationType, 0 ); + } + } + +// ---------------------------------------------------- +// CNcnNotifier::HandleClass0MessageNotificationChange +// ---------------------------------------------------- +// +void CNcnNotifier::HandleClass0MessageNotificationChange( + TUint /*aPreviousAmount*/, + TUint /*aCurrentAmount*/ ) + { + // alert tone is always played for class0 + iNcnUI.PlayMessageAlertTone(); + + // Special: since we don't need to keep track of the amount of + // class0 messages reset in now. + iNotificationAmounts[ MNcnNotifier::ENcnClass0MessageNotification ] = 0; + } + +// ---------------------------------------------------- +// CNcnNotifier::HandleMessageNotificationChange +// ---------------------------------------------------- +// +void CNcnNotifier::HandleMessageNotificationChange( + TUint aPreviousAmount, + TUint aCurrentAmount ) + { + // update message icon + UpdateMessageIcon( aCurrentAmount ); + + // play message alert tone if there are new messages + if( aCurrentAmount > aPreviousAmount ) + { + iNcnUI.PlayMessageAlertTone(); + } + } + +// ---------------------------------------------------- +// CNcnNotifier::HandleAudioMessageNotificationChange +// ---------------------------------------------------- +// +void CNcnNotifier::HandleAudioMessageNotificationChange( + TUint aPreviousAmount, + TUint aCurrentAmount ) + { + // update message icon + UpdateMessageIcon( aCurrentAmount ); + + // play message alert tone if there are new audio messages + if( aCurrentAmount > aPreviousAmount ) + { + iNcnUI.PlayMessageAlertTone(); + } + } + +// ---------------------------------------------------- +// CNcnNotifier::HandleVoiceMailNotificationChange +// ---------------------------------------------------- +// +void CNcnNotifier::HandleVoiceMailNotificationChange( + TUint aPreviousAmount, + TUint aCurrentAmount ) + { + // play message alert tone always when messages are + // received and the count of them is more than 0 + if( aCurrentAmount > 0 && aCurrentAmount > aPreviousAmount ) + { + iNcnUI.PlayMessageAlertTone(); + } + } + +// ---------------------------------------------------- +// CNcnNotifier::HandleEMailNotificationChange +// ---------------------------------------------------- +// +void CNcnNotifier::HandleEMailNotificationChange( + TUint aPreviousAmount, + TUint aCurrentAmount, + TBool aIcon, + TBool aTone ) + { + // update icon + if ( aIcon == TRUE ) + { + UpdateEmailIcon( aCurrentAmount ); + } + + // play email alert tone if there are new messages + if( aCurrentAmount > aPreviousAmount && aTone == TRUE ) + { + iNcnUI.PlayEMailAlertTone(); + } + } + +// ---------------------------------------------------- +// CNcnNotifier::UpdateEmailIcon +// Updates email message indicator. It does not update +// remote mailbox email message indicator. +// ---------------------------------------------------- +// +void CNcnNotifier::UpdateEmailIcon( TInt aAmount ) + { + // default to messages waiting + TUint value = ECoreAppUIsNewEmail; + + // change the default if there are now messages waiting + if( !aAmount ) + { + value = ECoreAppUIsNoNewEmail; + } + + // update key value. SysApp will show @ icon based on this value + iModel.NotifyPublishAndSubscribe( + KPSUidCoreApplicationUIs, KCoreAppUIsNewEmailStatus, value ); + + } + +// ---------------------------------------------------- +// CNcnNotifier::UpdateMessageIcon +// ---------------------------------------------------- +// +void CNcnNotifier::UpdateMessageIcon( TInt aAmount ) + { + // default to inbox empty + TInt state = ESAInboxEmpty; + + // if there are any messages to be notified of + if( ( iModel.IsSupported( KNcnAudioMessaging ) && + ( iNotificationAmounts[ ENcnMessagesNotification ] > 0 || + iNotificationAmounts[ ENcnAudioMessagesNotification ] > 0 )) + || aAmount ) + { + NCN_RDEBUG( _L( "CNcnNotifier::UpdateMessageIcon - setting message icon on " ) ); + state = ESADocumentsInInbox; + } + else + { + NCN_RDEBUG( _L( "CNcnNotifier::UpdateMessageIcon - setting UpdateMessageIcon icon off " ) ); + } + + // set icon state through P&S variable + iModel.NotifyPublishAndSubscribe( + KUidSystemCategory, + KUidInboxStatusValue, + state ); + } + +TBool CNcnNotifier::CheckSNStatusL( const TNcnNotificationType& aNotificationType ) const + { + NCN_RDEBUG_INT( _L("CNcnNotifier::CheckSNStatusL() - aNotificationType: %d"), aNotificationType ); + TUint32 flag; + + switch ( aNotificationType ) + { + case ENcnMessagesNotification: + { + flag = KMuiuNewMessageSNFlag; + break; + } + case ENcnEmailNotification: + { + flag = KMuiuNewEmailSNFlag; + break; + } + case ENcnVoiceMailNotification: + // Fallthrough + case ENcnVoiceMailOnLine1Notification: + // Fallthrough + case ENcnVoiceMailOnLine2Notification: + { + flag = KMuiuNewVoiceMailSNFlag; + break; + } + case ENcnMissedCallsNotification: + { + flag = KMuiuMissedCallSNFlag; + break; + } + case ENcnInstantMessagesNotification: + { + flag = KMuiuInstantMessageSNFlag; + break; + } + case ENcnAudioMessagesNotification: + { + flag = KMuiuAudioMessageSNFlag; + break; + } + case ENcnClass0MessageNotification: + // Fallthrough + case ENcnNoNotification: + // Fallthrough + default: + return ETrue; // This is already default value for displaying SN + } + + TInt state; + CRepository* repository = NULL; + + TRAPD( err, repository = CRepository::NewL( KCRUidMuiuMessagingConfiguration ) ); + if( err == KErrNone && repository != NULL ) + { + CleanupStack::PushL( repository ); // CSI: 42 # Should not leave + + err = repository->Get( KMuiuSoftNotificationConfiguration, state ); + NCN_RDEBUG_INT( _L("CNcnNotifier::CheckSNStatusL() - state: %d"), state ); + + TBool result( EFalse ); + if( err == KErrNone && ( state & flag ) == flag ) + { + result = ETrue; + } + else if( err != KErrNone ) + { + // soft note is displayed if we fail to get SN config state + result = ETrue; + } + + CleanupStack::PopAndDestroy( repository ); + return result; + } + else + { + return ETrue; + } + } + + + +TBool CNcnNotifier::CheckDLStatus( const TNcnNotificationType& aNotificationType ) const + { + NCN_RDEBUG_INT( _L("CNcnNotifier::CheckDLStatus() - aNotificationType: %d"), aNotificationType ); + TUint32 flag; + + switch ( aNotificationType ) + { + case ENcnMessagesNotification: + { + flag = KMuiuDLNewMessageFlag; + break; + } + case ENcnEmailNotification: + { + flag = KMuiuDLNewEmailFlag; + break; + } + case ENcnVoiceMailNotification: + // Fallthrough + case ENcnVoiceMailOnLine1Notification: + // Fallthrough + case ENcnVoiceMailOnLine2Notification: + { + flag = KMuiuDLNewVoiceMailFlag; + break; + } + case ENcnMissedCallsNotification: + { + flag = KMuiuDLMissedCallFlag; + break; + } + case ENcnInstantMessagesNotification: + { + flag = KMuiuDLInstantMessageFlag; + break; + } + case ENcnAudioMessagesNotification: + { + flag = KMuiuDLAudioMessageFlag; + break; + } + case ENcnClass0MessageNotification: + // Fallthrough + case ENcnNoNotification: + // Fallthrough + default: + return ETrue; // This is already default value for displaying SN + } + + if((iDisplayLightstate & flag ) == flag) + return ETrue; + else + return EFalse; + + + } + +// End of File +