--- /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