messagingappbase/ncnlist/src/NcnSNNotifier.cpp
changeset 0 72b543305e3a
child 5 4697dfb2d7ad
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/messagingappbase/ncnlist/src/NcnSNNotifier.cpp	Thu Dec 17 08:44:11 2009 +0200
@@ -0,0 +1,496 @@
+/*
+* 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 CNcnSNNotifier class.
+*
+*/
+
+
+
+// INCLUDE FILES
+#include    "NcnDebug.h"
+#include    "NcnSNNotifier.h"
+#include    <AknSoftNotifier.h>
+#include    <AknNotifyStd.h>
+#include    <AknSoftNotificationParameters.h>
+#include    <avkon.rsg>
+#include    <Ncnlist.rsg>
+#include    <aknSDData.h>
+#include    "NcnModel.h"
+#include    "CVoiceMailManager.h"
+
+// ================= DEFINITIONS ============================
+#define KSpeedDialViewId TVwsViewId( TUid::Uid( 0x1000590A ), TUid::Uid( 0x02 ) )
+#define KMceMailViewId TVwsViewId( TUid::Uid( 0x100058C5 ), TUid::Uid( 0x01 ) )
+#define KMceAudioMessageViewId TVwsViewId(TUid::Uid(0x100058C5),TUid::Uid(0x01) )
+
+// ================= LOCAL CONSTANTS ========================
+namespace
+    {
+    _LIT( KNcnResourceFile, "z:\\resource\\Ncnlist.rSC" );
+    const TInt KNcnNotificationPriority = 2200;
+    const TUid KNcnDefaultMessageUid = { 1 };
+    const TUid KNcnLine2MessageUid = { 2 };
+    const TUid KNcnAudioMessageUid = { 3 };
+    _LIT8( KNcnExternalLaunch, "outside" );
+    const TUint KNcnExternalizedNumberMaxLength = 8;
+    }
+    
+// ================= MEMBER FUNCTIONS =======================
+
+// ---------------------------------------------------------
+// CNcnSNNotifier default constructor
+// ---------------------------------------------------------
+//
+CNcnSNNotifier::CNcnSNNotifier()
+    {
+    }
+
+
+// ---------------------------------------------------------
+// CNcnSNNotifier::~CNcnSNNotifier
+// ---------------------------------------------------------
+//
+CNcnSNNotifier::~CNcnSNNotifier()
+    {
+    // Delete notifier
+    delete iNotifier;
+    iNotifier = NULL;
+    }
+
+
+// ---------------------------------------------------------
+// CNcnSNNotifier::NewL
+// ---------------------------------------------------------
+//
+CNcnSNNotifier* CNcnSNNotifier::NewL()
+    {
+    // Create the notifier instance
+    CNcnSNNotifier* self = new (ELeave) CNcnSNNotifier();
+
+    // Call the construct safely
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop();
+        
+    return self;
+    }
+
+
+// ---------------------------------------------------------
+// CNcnSNNotifier::ConstructL
+// ---------------------------------------------------------
+//
+void CNcnSNNotifier::ConstructL()
+    {
+    // Create notifier instance
+    iNotifier = CAknSoftNotifier::NewL();
+    }
+
+
+// ---------------------------------------------------------
+// CNcnSNNotifier::IdleState
+// ---------------------------------------------------------
+//
+void CNcnSNNotifier::IdleState( TBool aCurrentState )
+    {
+    TRAP_IGNORE( DoInformIdleStateL( aCurrentState ) );
+    }
+
+
+// ---------------------------------------------------------
+// CNcnSNNotifier::NewItems
+// ---------------------------------------------------------
+//
+void CNcnSNNotifier::NewItems( const MNcnNotifier::TNcnNotificationType aNotificationType, const TInt aAmount )
+    {
+    //Convert to avkon type
+    TAknSoftNotificationType aknType = ConvertNCNTypeToAvkonType(aNotificationType);
+
+	//Get the secondary display id for this note
+	SecondaryDisplay::TSecondaryDisplayNcnListDialogs dialogID = 
+		ConvertNCNTypeToSecondaryDisplayType(aNotificationType);
+	
+    // Amount needs to be stored to "additional parameter"
+    TBuf8<KNcnExternalizedNumberMaxLength> additionalData;
+    additionalData.Num(aAmount);
+    
+    // Encapsulate the sent data
+    CAknSDData* sdData = NULL;
+    TRAPD( status, sdData = CAknSDData::NewL(
+		    SecondaryDisplay::KCatNcnList, 
+		    dialogID, 
+		    additionalData) );
+    
+    // Send data to cover ui    
+    if ( status == KErrNone && sdData != NULL)
+	    {
+	    iNotifier->SetSecondaryDisplayData( sdData ); //Takes ownership	
+	    }
+    
+    // If there are problems with notifier, just catch the error and 
+    // try to finish the other processes.
+    TRAP( status, ShowNewItemsL( aknType, aAmount ) );
+    
+    NCN_RDEBUG_INT( _L("CNcnSNNotifier::NewItems: ShowNewItemsL returned %d"), status );    
+    }
+
+// ---------------------------------------------------------
+// CNcnSNNotifier::DoInformIdleStateL
+// ---------------------------------------------------------
+//
+void CNcnSNNotifier::DoInformIdleStateL( TBool aCurrentState )
+    {
+    NCN_RDEBUG_INT(_L("CNcnSNNotifier::DoInformIdleStateL aCurrentState = %d" ), aCurrentState );
+
+    // Inform the notifier component about new idle state status.
+    iNotifier->SetIdleStateL( aCurrentState );
+    }
+
+
+// ---------------------------------------------------------
+// CNcnSNNotifier::ShowNewItemsL
+// ---------------------------------------------------------
+//
+void CNcnSNNotifier::ShowNewItemsL( const TAknSoftNotificationType aNotificationType, const TInt aAmount )
+    {
+    NCN_RDEBUG_INT2(_L("CNcnSNNotifier::ShowNewItemsL: aNotificationType %d, aAmount: %d" ), aNotificationType, aAmount );
+
+    // Separate handling for voice mail notifications for now
+    switch( aNotificationType )
+        {
+        case ECustomSoftNotification:
+        	// Fallthrough
+        case ENewMailNotification:
+            // Fallthrough
+        case EVoiceMailNotification:
+            // Fallthrough
+        case ESeparateVoiceMailOnLine1Notification:
+            // Fallthrough
+        case ESeparateVoiceMailOnLine2Notification:
+            {
+            ShowCustomNotificationL( aNotificationType, aAmount );
+            break;
+            }            
+        default:
+            {
+            ShowDefaultNotificationL( aNotificationType, aAmount );
+            break;
+            }
+        }
+    }
+
+// ---------------------------------------------------------
+// CNcnSNNotifier::ShowVoiceMailNotificationL
+// ---------------------------------------------------------
+//
+void CNcnSNNotifier::ShowCustomNotificationL( const TAknSoftNotificationType aNotificationType, const TInt aAmount )
+    {
+    TBool amountKnown = ( aAmount <= CVoiceMailManager::EVMMaximumNumber );
+
+    NCN_RDEBUG_INT2(_L("CNcnSNNotifier::ShowCustomNotificationL: aNotificationType %d, amount known: %d" ), aNotificationType, amountKnown );
+
+    // fuzzy voicemail note and normal voice mail note should never exist at the same time. 
+    // Always cancel the other before adding new note.
+    if ( aNotificationType == EVoiceMailNotification
+        || aNotificationType == ESeparateVoiceMailOnLine1Notification
+        || aNotificationType == ESeparateVoiceMailOnLine2Notification )
+        {
+        CAknSoftNotificationParameters* params =
+            CreateNotificationParametersLC( aNotificationType, !amountKnown );
+        iNotifier->CancelCustomSoftNotificationL( *params );
+        CleanupStack::PopAndDestroy( params );
+        }
+
+    // create notification parameters
+    CAknSoftNotificationParameters* params =
+        CreateNotificationParametersLC( aNotificationType, amountKnown );
+        
+    if( aAmount <= 0 )
+        {
+        iNotifier->CancelCustomSoftNotificationL( *params );
+        }
+    else
+        {
+        iNotifier->SetCustomNotificationCountL( *params, aAmount );
+        }
+
+    // destroy parameters
+    CleanupStack::PopAndDestroy( params );
+    }
+     
+// ---------------------------------------------------------
+// CNcnSNNotifier::ShowDefaultNotificationL
+// ---------------------------------------------------------
+//
+void CNcnSNNotifier::ShowDefaultNotificationL( const TAknSoftNotificationType aNotificationType, const TInt aAmount )
+    {
+    NCN_RDEBUG_INT2(_L("CNcnSNNotifier::ShowDefaultNotificationL aNotificationType %d, aAmount: %d" ), aNotificationType, aAmount );
+    
+    if( aAmount <= 0 )
+        {
+        iNotifier->CancelSoftNotificationL( aNotificationType );
+        }
+    else
+        {
+        TRAPD( err, iNotifier->SetNotificationCountL( aNotificationType, aAmount ) );
+    	NCN_RDEBUG_INT(_L("CNcnSNNotifier::ShowDefaultNotificationL: SetNotificationCountL returned %d"  ), err );
+    	User::LeaveIfError( err );
+//      iNotifier->SetNotificationCountL( aNotificationType, aAmount );
+        }
+    }
+// ---------------------------------------------------------
+// CNcnSNNotifier::VoicemailNoteId
+// ---------------------------------------------------------
+//        
+CAknSoftNotificationParameters* CNcnSNNotifier::VoicemailNoteParametersL( 
+    const TAknSoftNotificationType aNotificationType, 
+    const TBool aAmountKnown )
+    {
+    NCN_RDEBUG_INT2(_L("CNcnSNNotifier::VoicemailNoteParametersL: aNotificationType %d, aAmountKnown: %d" ), aNotificationType, aAmountKnown );
+    
+    // note is different only for voice mails, if amount is known or not known.
+    TUid customMessageId = KNcnDefaultMessageUid; // default
+    TInt groupId(0);
+    TInt noteId(0);
+    switch( aNotificationType )
+        {
+        case EVoiceMailNotification:
+            {
+            noteId = aAmountKnown ? R_NCN_VOICE_MAIL_NOTE : R_NCN_VOICE_MAILS_UNK_AMOUNT;
+            groupId = aAmountKnown ? R_NCN_VOICE_MAIL_GROUPED : R_NCN_VOICE_MAILS_UNK_AMOUNT_GROUPED;
+            break;
+            }
+        case ESeparateVoiceMailOnLine1Notification:
+            {
+            noteId = aAmountKnown ? R_NCN_VOICE_MAIL_ON_LINE1_NOTE : R_NCN_VOICE_MAILS_UNK_AMOUNT_ON_LINE1;
+            groupId = aAmountKnown ? R_NCN_VOICE_MAIL_ON_LINE1_GROUPED : R_NCN_VOICE_MAILS_UNK_AMOUNT_ON_LINE1_GROUPED;
+            break;
+            }
+        case ESeparateVoiceMailOnLine2Notification:
+            {
+            noteId = aAmountKnown ? R_NCN_VOICE_MAIL_ON_LINE2_NOTE : R_NCN_VOICE_MAILS_UNK_AMOUNT_ON_LINE2;
+            groupId = aAmountKnown ? R_NCN_VOICE_MAIL_ON_LINE2_GROUPED : R_NCN_VOICE_MAILS_UNK_AMOUNT_ON_LINE2_GROUPED;
+            customMessageId = KNcnLine2MessageUid;
+            break;
+            }
+        default:
+            {
+            ASSERT( EFalse );
+            break;
+            }
+        }
+        
+        CAknSoftNotificationParameters* ret = CAknSoftNotificationParameters::NewL(
+                KNcnResourceFile,
+                noteId,
+                KNcnNotificationPriority,
+                R_AVKON_SOFTKEYS_LISTEN_EXIT,
+                CAknNoteDialog::ENoTone,
+                KSpeedDialViewId,
+                customMessageId,
+                EAknSoftkeyListen,
+                KNcnExternalLaunch );
+        ret->SetGroupedTexts( groupId );
+        return ret;
+    }
+    
+// ---------------------------------------------------------
+// CNcnSNNotifier::CreateNotificationParametersLC
+// ---------------------------------------------------------
+//    
+CAknSoftNotificationParameters* CNcnSNNotifier::CreateNotificationParametersLC(
+    const TAknSoftNotificationType aNotificationType,
+    TBool aAmountKnown )
+    {
+    NCN_RDEBUG_INT(_L("CNcnSNNotifier::CreateNotificationParametersLC: aNotificationType %d" ), aNotificationType );
+    // instantiate parameters    
+    CAknSoftNotificationParameters* ret = 0;
+        
+    // determine resource ids based on notification type
+    switch( aNotificationType )
+        {
+        // Notification for audio message
+        case ECustomSoftNotification:
+        	{
+        	ret = CAknSoftNotificationParameters::NewL(
+                KNcnResourceFile,
+                R_NCN_AUDIO_MESSAGE_NOTE,
+                KNcnNotificationPriority,
+                R_AVKON_SOFTKEYS_SHOW_EXIT,
+                CAknNoteDialog::ENoTone,
+                KMceAudioMessageViewId,
+                KNcnAudioMessageUid,
+                EAknSoftkeyShow,
+                KNullDesC8() );
+            ret->SetGroupedTexts( R_NCN_AUDIO_MESSAGE_GROUPED );
+            break;
+        	}
+        case ENewMailNotification:
+            {
+            ret = CAknSoftNotificationParameters::NewL(
+                KNcnResourceFile,
+                R_NCN_EMAIL_NOTE,
+                KNcnNotificationPriority,
+                R_AVKON_SOFTKEYS_SHOW_EXIT,
+                CAknNoteDialog::ENoTone,
+                KMceMailViewId,
+                KNcnDefaultMessageUid,
+                EAknSoftkeyShow,
+                KNullDesC8() );
+            ret->SetGroupedTexts( R_NCN_EMAIL_GROUPED );
+            break;
+            }
+        case EVoiceMailNotification:
+        case ESeparateVoiceMailOnLine1Notification:
+        case ESeparateVoiceMailOnLine2Notification:
+            {
+            ret = VoicemailNoteParametersL( aNotificationType, aAmountKnown );
+            break;
+            }
+        default:
+            {
+            // Not found.
+            User::Leave( KErrNotFound );
+            break;
+            }
+        }
+        
+    CleanupStack::PushL( ret );
+    return ret;
+    }
+    
+
+// ---------------------------------------------------------
+// CNcnSNNotifier::ConvertNCNTypeToAvkonType
+// ---------------------------------------------------------
+//   
+TAknSoftNotificationType CNcnSNNotifier::ConvertNCNTypeToAvkonType( 
+        	const MNcnNotifier::TNcnNotificationType aNotification ) const
+	{
+    // default to no notification
+    TAknSoftNotificationType aknNotificationType = ENoSoftNotification;
+            
+    // Map ncn specific notification to Akn notification type and update
+    // notification.
+    // Note that only the messages with valid Akn notification need to be
+    // mapped (ie. class0 needs no mapping)
+    switch( aNotification )
+        {
+        case MNcnNotifier::ENcnMessagesNotification:
+            {
+            aknNotificationType = ENewMessagesNotification;
+            break;
+            }
+	    case MNcnNotifier::ENcnAudioMessagesNotification:
+	        {
+	        aknNotificationType = ECustomSoftNotification;
+	        break;
+	        }
+        case MNcnNotifier::ENcnEmailNotification:
+            {
+            aknNotificationType = ENewMailNotification;
+            break;
+            }
+        case MNcnNotifier::ENcnVoiceMailNotification:
+            {
+            aknNotificationType = EVoiceMailNotification;
+            break;
+            }
+        case MNcnNotifier::ENcnVoiceMailOnLine1Notification:
+            {
+            aknNotificationType = ESeparateVoiceMailOnLine1Notification;
+            break;
+            }
+        case MNcnNotifier::ENcnVoiceMailOnLine2Notification:
+            {
+            aknNotificationType = ESeparateVoiceMailOnLine2Notification;
+            break;
+            }
+        case MNcnNotifier::ENcnMissedCallsNotification:
+            {
+            aknNotificationType = EMissedCallsNotification;
+            break;
+            }
+        default:
+            {
+            break;
+            }
+        }
+        
+    return aknNotificationType;
+	}    
+	
+// ---------------------------------------------------------
+// CNcnSNNotifier::ConvertNCNTypeToSecondaryDisplayType
+// ---------------------------------------------------------
+//   
+SecondaryDisplay::TSecondaryDisplayNcnListDialogs CNcnSNNotifier::ConvertNCNTypeToSecondaryDisplayType( 
+	const MNcnNotifier::TNcnNotificationType aNotification ) const
+	{
+    // default to no notification
+    SecondaryDisplay::TSecondaryDisplayNcnListDialogs secDisplayDialog = 
+    	SecondaryDisplay::ECmdNoNotification;
+            
+    //Get the corresbonding secondary display dialog id
+    switch( aNotification )
+        {
+        case MNcnNotifier::ENcnMessagesNotification:
+            {
+            secDisplayDialog = SecondaryDisplay::ECmdMessagesNotification;
+            break;
+            }
+        case MNcnNotifier::ENcnClass0MessageNotification:
+            {
+            secDisplayDialog = SecondaryDisplay::ECmdClass0MessageNotification;
+            break;
+            }
+	    case MNcnNotifier::ENcnAudioMessagesNotification:
+	        {
+	        secDisplayDialog = SecondaryDisplay::ECmdAudioMessagesNotification;
+	        break;
+	        }
+        case MNcnNotifier::ENcnEmailNotification:
+            {
+            secDisplayDialog = SecondaryDisplay::ECmdEmailNotification;
+            break;
+            }
+        case MNcnNotifier::ENcnVoiceMailNotification:
+            {
+            secDisplayDialog = SecondaryDisplay::ECmdVoiceMailNotification;
+            break;
+            }
+        case MNcnNotifier::ENcnVoiceMailOnLine1Notification:
+            {
+            secDisplayDialog = SecondaryDisplay::ECmdVoiceMailOnLine1Notification;
+            break;
+            }
+        case MNcnNotifier::ENcnVoiceMailOnLine2Notification:
+            {
+            secDisplayDialog = SecondaryDisplay::ECmdVoiceMailOnLine2Notification;
+            break;
+            }
+        case MNcnNotifier::ENcnMissedCallsNotification:
+            {
+            secDisplayDialog = SecondaryDisplay::ECmdMissedCallsNotification;
+            break;
+            }
+        default:
+            {
+            break;
+            }
+        }
+        
+    return secDisplayDialog;		
+	}
+//  End of File