calendarui/server/CalenSvr/src/calensvrmissedalarmmanager.cpp
author Simon Howkins <simonh@symbian.org>
Mon, 22 Nov 2010 16:01:09 +0000
branchRCL_3
changeset 93 d216ae5a8733
parent 66 bd7edf625bdd
child 67 1539a383d7b6
permissions -rw-r--r--
Adjusted to avoid exports, etc, from a top-level bld.inf

/*
* Copyright (c) 2008 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:   An missed alarm handler class, CCalenSvrMissedAlarmManager.
 *                This class takes care of handling the UI and cenrep updation
 *                for missed alarms.
 *
*/



#include <avkon.rsg> 
#include <AknSmallIndicator.h>
#include <centralrepository.h>
#include <missedalarmstorecrkeys.h>
#include <CalendarInternalCRKeys.h>
#include <calensvrmissedalarmmanagerresource.rsg>

#include "calendarui_debug.h"
#include "calensvrmissedalarmmanager.h"
#include "calenmissedalarmconstants.h"

// -----------------------------------------------------------------------------
// CCalenSvrMissedAlarmManager::NewL
// First phase construction
// -----------------------------------------------------------------------------
//
CCalenSvrMissedAlarmManager* CCalenSvrMissedAlarmManager::NewL()
    {
    TRACE_ENTRY_POINT;
    CCalenSvrMissedAlarmManager* self = new( ELeave )CCalenSvrMissedAlarmManager();
    CleanupStack::PushL( self );
    self->ConstructL();
    CleanupStack::Pop( self );
    TRACE_EXIT_POINT;
    return self;
    }
    
// -----------------------------------------------------------------------------
// CCalenSvrMissedAlarmManager::CCalenSvrMissedAlarmManager
// Default constructor
// -----------------------------------------------------------------------------
//
CCalenSvrMissedAlarmManager::CCalenSvrMissedAlarmManager() :
		CActive(CActive::EPriorityLow),
    iNumOfMissedAlarms( KNoMissedAlarms ),
    iShowSoftNotification( EFalse )
    {
    TRACE_ENTRY_POINT;
    
    CActiveScheduler::Add(this);
    
    TRACE_EXIT_POINT;
    }

// -----------------------------------------------------------------------------
// CCalenSvrMissedAlarmManager::CCalenSvrMissedAlarmManager
// Second phase construction
// -----------------------------------------------------------------------------
//
void CCalenSvrMissedAlarmManager::ConstructL()
    {
    TRACE_ENTRY_POINT;
    
    iSoftNotifier = CAknSoftNotifier::NewL();

    iMissedAlarmStoreRepository = CRepository::NewL( KCRUidMissedAlarmStore );
    
    // Create missed alarm store
    iMissedAlarmStore = CMissedAlarmStore::NewL(*iMissedAlarmStoreRepository);
    
    iCenRepChangeNotifier = CCenRepNotifyHandler::NewL( *this, *iMissedAlarmStoreRepository );
    iCenRepChangeNotifier->StartListeningL();
   
    Start();
    
    TRACE_EXIT_POINT;
    }

// -----------------------------------------------------------------------------
// CCalenSvrMissedAlarmManager::~CCalenSvrMissedAlarmManager
// Destructor
// -----------------------------------------------------------------------------
//
CCalenSvrMissedAlarmManager::~CCalenSvrMissedAlarmManager()
    {
	TRACE_ENTRY_POINT;
	
	Cancel();
	
	delete iSoftNotifier;
    iSoftNotifier = NULL;
    
    if(iCenRepChangeNotifier)
        {
        iCenRepChangeNotifier->StopListening();
        delete iCenRepChangeNotifier;
        }
    
    delete iMissedAlarmStore;
    iMissedAlarmStore = NULL;
    
	TRACE_EXIT_POINT;
    }

// -----------------------------------------------------------------------------
// CCalenSvrMissedAlarmManager::Start
// Start the scheduler
// -----------------------------------------------------------------------------
//
void CCalenSvrMissedAlarmManager::Start()
	{
	TRACE_ENTRY_POINT;
	
	__ASSERT_ALWAYS(!IsActive(), User::Invariant());
	TRequestStatus* pStat = &iStatus;
    User::RequestComplete(pStat, KErrNone);
    SetActive();	
    
    TRACE_EXIT_POINT;
	}
	
// ----------------------------------------------------------------------------
// CCalenSvrMissedAlarmManager::HandleNotifyGeneric
// From MCenRepNotifyHandlerCallback
// Generic notification that one of our central repository keys has changed
// If any keys change we broadcast a settings changed notification
// (other items were commented in a header).
// ----------------------------------------------------------------------------
//
void CCalenSvrMissedAlarmManager::HandleNotifyGeneric( TUint32 aCenrepKeyId )
    {
    TRACE_ENTRY_POINT;
    
    if(aCenrepKeyId <= KMissedAlarmsMaxValue)
        {
        TRAP_IGNORE(HandleMissedAlarmL());
        }
    
    TRACE_EXIT_POINT;
    } 

// -----------------------------------------------------------------------------
// CCalenSvrMissedAlarmManager::HandleMissedAlarmL
// Handles the change in missed alarm store.
// updates soft notification and indicator plugins
// -----------------------------------------------------------------------------
//
void CCalenSvrMissedAlarmManager::HandleMissedAlarmL()
    {
	TRACE_ENTRY_POINT;
	//If the value of supressnotification is 1 then supress the missed alarm soft notification
	//If the value of supressnotification is 0 then show the missed alarm soft notification
	CRepository* repository = CRepository::NewL( KCRUidCalendar );
    TBool supressnotification = EFalse;
    repository->Get( KCalendarSupressMissedAlarmSoftNotification, supressnotification );
    
    if( supressnotification )
        {
        TRACE_EXIT_POINT;
        return;
        }
	//Update with the count from the metadata
	GetCountOfMissedAlarmsL();
	
	// Update Soft Notifications 
	HandleMissedAlarmSoftNotificationL();
	
    TRACE_EXIT_POINT;
    }

// -----------------------------------------------------------------------------
// CCalenSvrMissedAlarmManager::DoCancel
// For cancel
// -----------------------------------------------------------------------------
//
void CCalenSvrMissedAlarmManager::DoCancel()
	{
	TRACE_ENTRY_POINT;
	TRACE_EXIT_POINT;
	}

// -----------------------------------------------------------------------------
// CCalenSvrMissedAlarmManager::RunError
// ?implementation_description
// (other items were commented in a header).
// -----------------------------------------------------------------------------
//	
TInt CCalenSvrMissedAlarmManager::RunError(TInt /*aError*/)
	{
	TRACE_ENTRY_POINT;
	TRACE_EXIT_POINT;

	return 0;	
	}

// -----------------------------------------------------------------------------
// CCalenSvrMissedAlarmManager::RunL
// Handle missed alarms on RunL
// -----------------------------------------------------------------------------
//	
void CCalenSvrMissedAlarmManager::RunL()
	{
	TRACE_ENTRY_POINT;

	HandleMissedAlarmL();

	TRACE_EXIT_POINT;	
	}

// -----------------------------------------------------------------------------
// CCalenSvrMissedAlarmManager::GetCountOfMissedAlarms
// Get count of missed alarms from cenrep
// -----------------------------------------------------------------------------
//
void CCalenSvrMissedAlarmManager::GetCountOfMissedAlarmsL()
    {
	TRACE_ENTRY_POINT;
	
	TUint32 newCount = 0;
	iMissedAlarmStore->CountL(newCount);
	
	if(TInt(newCount) <= KNoMissedAlarms)
	    {
		iNumOfMissedAlarms = KNoMissedAlarms;
		iShowSoftNotification = EFalse;	
	    }
	else
	    {
		/*if(iNumOfMissedAlarms > TInt(newCount))
		    {
		    iShowSoftNotification = EFalse;
		    }
		else
		    {
		    iShowSoftNotification = ETrue;
		    }*/
		
	// changes done for missing popup in idle screen when alarm expires in editor mode
		iNumOfMissedAlarms = TInt(newCount);
		iShowSoftNotification = ETrue;
	    }
	
	TRACE_EXIT_POINT;
    }

// -----------------------------------------------------------------------------
// CCalenSvrMissedAlarmManager::HandleMissedAlarmSoftNotificationL
// Update soft notification/status pane indicator
// -----------------------------------------------------------------------------
//
void CCalenSvrMissedAlarmManager::HandleMissedAlarmSoftNotificationL()
    {
	TRACE_ENTRY_POINT;	
	
	//Update indicator 
	HandleMissedAlarmSmallIndicatorL(
	        (iNumOfMissedAlarms > KNoMissedAlarms ? ETrue : EFalse));
	
	CAknSoftNotificationParameters* softNotificationParameters = 
	                        CreateNotificationParametersLC( aNotificationType );
	
	if(!iShowSoftNotification )
	    {
	    iSoftNotifier->CancelCustomSoftNotificationL( *softNotificationParameters );
	    }
	else
	    { 
	    if(iNumOfMissedAlarms > KNoMissedAlarms) //check for -ve
	        {
	        iSoftNotifier->SetCustomNotificationCountL(
	                                *softNotificationParameters, iNumOfMissedAlarms );	
	        }
	    }
	
	CleanupStack::PopAndDestroy( softNotificationParameters );		
	
	TRACE_EXIT_POINT;	
    }

// -----------------------------------------------------------------------------
// CCalenSvrMissedAlarmManager::HandleMissedAlarmCoverUISoftNotificationL
// ?implementation_description
// (other items were commented in a header).
// -----------------------------------------------------------------------------
//
void CCalenSvrMissedAlarmManager::HandleMissedAlarmCoverUISoftNotificationL()
    {
    TRACE_ENTRY_POINT;
    TRACE_EXIT_POINT;
    }

// -----------------------------------------------------------------------------
// CCalenSvrMissedAlarmManager::CreateNotificationParametersLC
// Initialise soft notification parameters. 
// -----------------------------------------------------------------------------
//
CAknSoftNotificationParameters* CCalenSvrMissedAlarmManager::
                                CreateNotificationParametersLC(
                       			const TAknSoftNotificationType aNotificationType  )
    {
	TRACE_ENTRY_POINT;
	
	// instantiate parameters
	CAknSoftNotificationParameters* softNotificationParameters = NULL;
	
	switch( aNotificationType )
	    {
        case ECustomSoftNotification: //Notification for missed alarm message
			{
            TUint32 newCount = 0;
            iMissedAlarmStore->CountL(newCount);
			
            if(newCount>1)
                {
                // if count is more than one,launch missed alarms view
                const TDesC8& viewActivationMsg = _L8("MAV");
                softNotificationParameters = CAknSoftNotificationParameters::NewL(
                        KMissedAlarmResourceFile,
                        R_MISSED_ALARM_SOFT_NOTIFICATION ,
                        KMissedAlarmNotificationPriority,
                        R_AVKON_SOFTKEYS_SHOW_EXIT,                             
                        CAknNoteDialog::ENoTone,
                        KMissedAlarmsViewId,
                        KCommandUid,
                        EAknSoftkeyShow,
                        viewActivationMsg);
                
                softNotificationParameters->SetGroupedTexts( R_MISSED_ALARM_UI_GROUPED );
                }
            else
                {
                // if count is one,launch missed event view
                const TDesC8& viewActivationMsg = _L8("MEV");
                softNotificationParameters = CAknSoftNotificationParameters::NewL(
                        KMissedAlarmResourceFile,
                        R_MISSED_ALARM_SOFT_NOTIFICATION ,
                        KMissedAlarmNotificationPriority,
                        R_AVKON_SOFTKEYS_SHOW_EXIT,                             
                        CAknNoteDialog::ENoTone,
                        KMissedEventViewId,
                        KCommandUid,
                        EAknSoftkeyShow,
                        viewActivationMsg);
                softNotificationParameters->SetGroupedTexts( R_MISSED_ALARM_UI_GROUPED );
                }
			break;
			}
         default:
			{
			// No other notification type is supported for now.
			User::Leave( KErrNotFound );
			break;
			}
	  }
  CleanupStack::PushL( softNotificationParameters );

  TRACE_EXIT_POINT;
  return softNotificationParameters;
}

// -----------------------------------------------------------------------------
// CCalenSvrMissedAlarmManager::HandleMissedAlarmSmallIndicatorL
// For Handling calendar's status pane indicator
// -----------------------------------------------------------------------------
//
void CCalenSvrMissedAlarmManager::HandleMissedAlarmSmallIndicatorL(TBool aArg)
    {
    TRACE_ENTRY_POINT;
	CAknSmallIndicator* indicator = CAknSmallIndicator::NewL(
	                            TUid::Uid( EAknIndicatorMissedCalendarAlarm ) );
	CleanupStack::PushL(indicator);
	indicator->SetIndicatorStateL( aArg );	
	CleanupStack::PopAndDestroy(); // indicator
    TRACE_EXIT_POINT;
    }   

// End of file