messagingappbase/ncnlist/src/CNcnNotifier.cpp
changeset 0 72b543305e3a
child 12 caea42e26caa
--- /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    <centralrepository.h>
+#include    <coreapplicationuisdomainpskeys.h>
+#include    <sacls.h>
+#include    <MessagingDomainCRKeys.h>
+
+#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
+