messagingappbase/ncnlist/src/CVoiceMailManager.cpp
changeset 0 72b543305e3a
child 25 fa1df4b99609
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/messagingappbase/ncnlist/src/CVoiceMailManager.cpp	Thu Dec 17 08:44:11 2009 +0200
@@ -0,0 +1,318 @@
+/*
+* Copyright (c) 2002 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:   Handles the notifications for voice mail messages
+*			   : Keeps track about the number of voice mail messages
+*			   : Has support for alternative line (ALS)
+*
+*/
+
+
+
+// INCLUDE FILES
+#include  <centralrepository.h>
+#include  <messagingvariant.hrh>      	// For CR key handling local variation flags
+#include  <centralrepository.h>			// For CR key handling
+#include  <NcnListInternalCRKeys.h>		// For CR key handling
+#include  <RSSSettings.h>				// For ALS detection
+#include  <startupdomainpskeys.h>
+
+#include "NcnDebug.h"
+#include "NcnCRHandler.h"
+#include "CVoiceMailManager.h"
+#include "CNcnNotifier.h"
+#include "NcnModelBase.h"
+#include "MNcnMsgWaitingManager.h"
+
+
+// -----------------------------------------------------------------
+// CVoiceMailManager::NewL
+// -----------------------------------------------------------------
+CVoiceMailManager* CVoiceMailManager::NewL( CNcnModelBase& aModel )
+    {
+    CVoiceMailManager* self = new (ELeave) CVoiceMailManager( aModel );
+
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+
+    return self;
+    }
+
+// -----------------------------------------------------------------
+// CVoiceMailManager::~CVoiceMailManager
+// -----------------------------------------------------------------
+CVoiceMailManager::~CVoiceMailManager()
+    {
+    }
+
+// -----------------------------------------------------------------
+// CVoiceMailManager::CVoiceMailManager
+// -----------------------------------------------------------------
+CVoiceMailManager::CVoiceMailManager( CNcnModelBase& aModel ) :
+	iIsALSSupported(EFalse),
+	iModel( aModel )
+    {
+	// EMPTY
+    }
+
+// -----------------------------------------------------------------
+// CVoiceMailManager::ConstructL
+// -----------------------------------------------------------------
+void CVoiceMailManager::ConstructL( )
+    {
+	NCN_RDEBUG( _L("CVoiceMailManager : Constructing") );
+	
+	//Clear soft notifications	that might be drawn automatically by avkon
+	//TSW Error TWOK-6PNT26	
+	ClearVoiceMailSoftNotes();
+			
+ 	//Get SIM change status at the startup. If the SIM will change after
+ 	//boot-up we get notifed by the Model so no need to subscribe for this key
+ 	//TSW ID EHCN-6NRAZE
+ 	TInt simValue = 0;
+	TInt status = RProperty::Get( KPSUidStartup, KPSSimChanged, simValue );
+	NCN_RDEBUG_INT2(_L("CVoiceMailManager : Requested SIM change! status: %d value: %d"), status, simValue );
+	    	    
+	//Handle SIM change in a separate method
+	//no need to continue in constructor after this
+    if( status == KErrNone && simValue == ESimChanged )
+	    {
+	    NotifyAboutSIMChange();
+	    return;
+	    }
+
+	//Get the ALS status
+	iIsALSSupported = UpdateALSStatus();
+		        
+	///////////////////////////////////////////////////////////////////////////////////////
+	// Soft notification must be drawn and the right icon triggered at the boot 
+	// if there are active voice mail messages waiting
+	///////////////////////////////////////////////////////////////////////////////////////
+    }
+
+// ---------------------------------------------------------
+// CVoiceMailManager::VMReceived
+// Received a voice mail message to line 1 or 2
+// ---------------------------------------------------------
+//
+void CVoiceMailManager::VMMessageReceived( MNcnMsgWaitingManager::TNcnMessageType aLineType, TUint aAmount )
+	{
+	//Check the value. It must be between 0 - 254 (0xfe) or fuzzy note will be used
+	if( aAmount > EVMMaximumNumber )
+		{
+		aAmount	= EVMExistsButCountNotKnown;
+		}
+		
+	//The amount might be an exact value 0-254 or a special value EVMExistsButCountNotKnown
+	iModel.MsgWaitingManager().SetMessageCount( aLineType, aAmount, EFalse );				
+	
+	//Update notifications
+	UpdateVMNotifications();	
+	}
+
+
+// ---------------------------------------------------------
+// CVoiceMailManager::NotifyAboutSIMChange()
+// SIM has changed so we will need to erase old notes.
+// Model uses this method to notify voice mail manager
+// We also use this in the ConstructL if we notice that
+// the SIM has changed in boot-up
+// ---------------------------------------------------------
+//
+void CVoiceMailManager::NotifyAboutSIMChange()
+	{
+	NCN_RDEBUG(_L("CVoiceMailManager::NotifyAboutSIMChange - SIM has changed!"));
+
+	//Get the ALS status. ALS status can change if SIM changes
+	iIsALSSupported = UpdateALSStatus();
+	
+	//Update notifications
+	UpdateVMNotifications();
+	}
+	
+// ---------------------------------------------------------
+// CVoiceMailManager::HandlePropertyChangedL()
+// Handles the subscribed PS property changes.
+// ---------------------------------------------------------
+//
+void CVoiceMailManager::HandlePropertyChangedL( const TUid& /*aCategory*/, TInt /*aKey*/ )
+    {
+    // Empty
+    }
+
+// ---------------------------------------------------------
+// CVoiceMailManager::ClearVoiceMailSoftNotes
+// In boot-up Avkon automatically draws the soft notes that
+// were present at the time of the shut down. This is not
+// wanted for the voice mails so we manually null them during
+// the boot.
+// ---------------------------------------------------------
+//
+void CVoiceMailManager::ClearVoiceMailSoftNotes()
+	{
+    NCN_RDEBUG(_L("CVoiceMailManager::ClearVoiceMailSoftNotes") );
+	iModel.NcnNotifier().SetNotification( MNcnNotifier::ENcnVoiceMailNotification, 0 );
+	iModel.NcnNotifier().SetNotification( MNcnNotifier::ENcnVoiceMailOnLine1Notification, 0 );
+	iModel.NcnNotifier().SetNotification( MNcnNotifier::ENcnVoiceMailOnLine2Notification, 0 );	
+	}
+
+
+// ---------------------------------------------------------
+// Indication message updates status only for one line at a time.
+// Both lines need to be updated.
+// ---------------------------------------------------------
+//
+void CVoiceMailManager::UpdateNoteAndIndicationWithALS( TInt aVoiceMailsInLine1,  TInt aVoiceMailsInLine2 )
+    {
+    //Soft notifications
+    NCN_RDEBUG_INT(_L("CVoiceMailManager : %d voice mails in line 1 (ALS supported)"), aVoiceMailsInLine1 );
+    NCN_RDEBUG_INT(_L("CVoiceMailManager : %d voice mails in line 2 (ALS supported)"), aVoiceMailsInLine2 );
+    
+    iModel.NcnNotifier().SetNotification( MNcnNotifier::ENcnVoiceMailOnLine1Notification, aVoiceMailsInLine1 );
+    iModel.NcnNotifier().SetNotification( MNcnNotifier::ENcnVoiceMailOnLine2Notification, aVoiceMailsInLine2 );
+    
+    // Indications
+    // SysApp checks ALS support and decides whether to use o_o or O_o (left O full), if ALS supported
+    iModel.MsgWaitingManager().SetIndicator( MNcnMsgWaitingManager::ENcnIndicatorVMLine1, aVoiceMailsInLine1 ? ETrue : EFalse );
+    iModel.MsgWaitingManager().SetIndicator( MNcnMsgWaitingManager::ENcnIndicatorVMLine2, aVoiceMailsInLine2 ? ETrue : EFalse );      
+    }
+            
+// ---------------------------------------------------------
+// Update soft notification and trigger icon drawing to
+// reflect the current state of the lines
+// ---------------------------------------------------------
+//
+void CVoiceMailManager::UpdateVMNotifications()
+	{
+	//We now need a conversion from our internally held voice mail count number
+	//to a format that is used in soft notifications.
+	//
+	
+	if ( !iModel.MsgWaitingManager().ConstructionReady() )
+	    {
+	    return;
+	    }
+	
+	TUint voiceMailsInLine1 = 0;
+	TUint voiceMailsInLine2 = 0;
+	
+	//Internally we use value EVMExistsButCountNotKnown to specify a case where the
+	//exact count of the voice mails is not know. However, the soft notes are designed
+	//so that voice mail strings are either exact or "fuzzy", meaning that the expression
+	//used in the string does not imply the exact number.
+	//The "fuzzy" string is the singular string in the voice mail's soft note. To
+	//use the singular form of the string we need to give voice mail count 1 in case the
+	//internal value is EVMExistsButCountNotKnown.
+	TBool line1(EFalse);
+	TBool line2(EFalse);
+	
+	iModel.MsgWaitingManager().GetIndicator( MNcnMsgWaitingManager::ENcnIndicatorVMLine1, line1 );
+	iModel.MsgWaitingManager().GetMessageCount( MNcnMsgWaitingManager::ENcnMessageTypeVMLine1, voiceMailsInLine1 );
+	NCN_RDEBUG_INT2(_L("CVoiceMailManager : line 1 indicator %d, count %d"), line1, voiceMailsInLine1 );
+	
+	if ( line1 && voiceMailsInLine1 == 0)
+	    {
+	    voiceMailsInLine1 = EVMExistsButCountNotKnown;
+	    }
+	
+	iModel.MsgWaitingManager().GetIndicator( MNcnMsgWaitingManager::ENcnIndicatorVMLine2, line2 );	
+	iModel.MsgWaitingManager().GetMessageCount( MNcnMsgWaitingManager::ENcnMessageTypeVMLine2, voiceMailsInLine2 );	
+	NCN_RDEBUG_INT2(_L("CVoiceMailManager : line 2 indicator %d, count %d"), line2, voiceMailsInLine2 );
+	
+	if ( line2 && voiceMailsInLine2 == 0)
+	    {
+	    voiceMailsInLine2 = EVMExistsButCountNotKnown;
+	    }
+				
+	//The most common case. ALS is not supported in the terminal
+	//Notifications show no line information. Only the information in
+	//iVoiceMailCountInLine1 matters
+	if( iIsALSSupported == EFalse && 
+		voiceMailsInLine1 > 0)
+		{
+		NCN_RDEBUG_INT(_L("CVoiceMailManager : %d voice mails in line 1 (ALS not supported)"), voiceMailsInLine1 );
+		
+		//Soft notification. The SN must not contain any reference to line numbers
+		iModel.NcnNotifier().SetNotification( MNcnNotifier::ENcnVoiceMailNotification, voiceMailsInLine1 );	
+
+		// SysApp checks ALS support and decides whether to use o_o or O_o (left O full), if ALS supported
+		// ENcnIndicatorVMLine1 is mapped to KDisplayVoicemailActive in CNcnMsgWaitingManager
+		iModel.MsgWaitingManager().SetIndicator( MNcnMsgWaitingManager::ENcnIndicatorVMLine1, ETrue );
+		}
+	else if( iIsALSSupported == TRUE )		
+	    {
+	    UpdateNoteAndIndicationWithALS( voiceMailsInLine1, voiceMailsInLine2 );
+	    }	
+
+	//No voice mails waiting. Clear the messages
+	else
+		{
+		NCN_RDEBUG( _L("CVoiceMailManager : No voice mails in line 1 nor in line 2") );
+		
+		//Clear soft notifications		
+		ClearVoiceMailSoftNotes();
+		
+		iModel.MsgWaitingManager().SetIndicator( MNcnMsgWaitingManager::ENcnIndicatorVMLine1, EFalse );
+		iModel.MsgWaitingManager().SetIndicator( MNcnMsgWaitingManager::ENcnIndicatorVMLine2, EFalse );				
+		}	
+	}
+	
+// -------------------------------------------------------------------
+// Find out if alternative line subscription is active in the terminal
+// -------------------------------------------------------------------
+//
+TBool CVoiceMailManager::UpdateALSStatus()
+	{
+	//Open the information settings
+	RSSSettings settings;
+	TInt status = settings.Open();
+	NCN_RDEBUG_INT( _L("CVoiceMailManager.UpdateALSStatus() : Opened RSSSettings! status %d"), status );
+			
+	//Get the ALS information, 
+	// ALS is supported, if:
+	// 1. supported by the device (ALS PP enabled) 
+	// 2. CSP enabled and SIM supports alternative service line (line2)
+	TInt alsValue = KErrUnknown;
+	status = settings.Get( ESSSettingsAls, alsValue );
+	NCN_RDEBUG_INT2( _L("CVoiceMailManager.UpdateALSStatus() : Got ALS info Status: %d Value: %d"), status, alsValue);
+	
+	//Close the settings, they are no longer needed
+	settings.Close();
+		
+	//Meaning of the ALS values
+	// ESSSettingsAlsNotSupported - ALS not supported, always primary line.
+	// ESSSettingsAlsPrimary - ALS supported, primary line selected.
+	// ESSSettingsAlsAlternate - ALS supported, alternate line selected.
+	
+	//Value read OK and ALS not supported
+	if( status == KErrNone && alsValue == ESSSettingsAlsNotSupported )
+		{
+		NCN_RDEBUG( _L("ALS value read properly! ALS not supported!") );	
+		return EFalse;
+		}
+	//Value read OK and ALS is supported
+	else if( status == KErrNone && 
+			( alsValue == ESSSettingsAlsPrimary || alsValue == ESSSettingsAlsAlternate ) )
+		{
+		NCN_RDEBUG( _L("ALS value read properly! ALS is supported!") );	
+		return ETrue;
+		}
+	//Default value. ALS not supported. Returned if ALS status can't be read properly!
+	else
+		{
+		NCN_RDEBUG_INT2( _L("ALS value NOT read properly! Status: %d Value: %d"), status, alsValue );		
+		return EFalse;		
+		}
+	}
+//  End of File