13 * |
13 * |
14 * Description: |
14 * Description: |
15 * |
15 * |
16 */ |
16 */ |
17 |
17 |
18 // User includes. |
18 |
|
19 |
|
20 // INCLUDE FILES |
19 #include "alarmutils.h" |
21 #include "alarmutils.h" |
|
22 |
20 #include "AlmAlertVariant.hrh" |
23 #include "AlmAlertVariant.hrh" |
21 #include "pim_trace.h" |
24 #include "pim_trace.h" |
|
25 |
22 #include "AlmAlarmPlayer.h" |
26 #include "AlmAlarmPlayer.h" |
23 #include "AlmAlarmControl.h" |
27 #include "AlmAlarmControl.h" |
24 #include "AlmAlarmInfo.h" |
28 #include "AlmAlarmInfo.h" |
25 #include "AlarmService.h" |
29 #include "AlarmService.h" |
26 #include "alarmremconeventshandler.h" |
30 #include "alarmremconeventshandler.h" |
27 #ifdef RD_ALMALERT__SENSOR_SUPPORT |
31 #ifdef RD_ALMALERT__SENSOR_SUPPORT |
28 #include "alarmcontextfwsupport.h" |
32 #include "alarmcontextfwsupport.h" |
29 #endif // RD_ALMALERT__SENSOR_SUPPORT |
33 #endif // RD_ALMALERT__SENSOR_SUPPORT |
30 #include "alarmalertwrapper.h" |
34 |
31 |
35 #include <w32std.h> |
32 // System includes. |
36 #include <almconst.h> |
33 // #include <almconst.h> |
|
34 #include <eikenv.h> |
37 #include <eikenv.h> |
35 #include <AknCapServer.h> |
38 #include <AknCapServer.h> |
36 #include <e32property.h> |
39 #include <e32property.h> |
37 #include <centralrepository.h> |
40 #include <centralrepository.h> |
38 #include <MProfileEngine.h> |
41 #include <MProfileEngine.h> |
39 #include <MProfile.h> |
42 #include <MProfile.h> |
40 #include <MProfileTones.h> |
43 #include <MProfileTones.h> |
41 #include <ProfileEngineDomainConstants.h> |
44 #include <ProfileEngineDomainConstants.h> |
42 #include <sbdefs.h> |
45 #include <sbdefs.h> |
43 #include <coreapplicationuisdomainpskeys.h> |
46 #include <coreapplicationuisdomainpskeys.h> |
|
47 #include <clockdomaincrkeys.h> |
|
48 #include <CalendarInternalCRKeys.h> |
44 #include <wakeupalarm.h> |
49 #include <wakeupalarm.h> |
45 #include <calalarm.h> // KUidAgendaModelAlarmCategory - the alarm category id for calendar alarms |
50 #include <calalarm.h> // KUidAgendaModelAlarmCategory - the alarm category id for calendar alarms |
46 #include <AknUtils.h> |
51 #include <AknUtils.h> |
|
52 #include <hwrmpowerstatesdkpskeys.h> |
|
53 #include <startupdomainpskeys.h> |
|
54 |
|
55 |
47 #ifndef SYMBIAN_CALENDAR_V2 |
56 #ifndef SYMBIAN_CALENDAR_V2 |
48 #include <agmalarm.h> // deprecated, use CalAlarm.h when SYMBIAN_CALENDAR_V2 flag is enabled |
57 #include <agmalarm.h> // deprecated, use CalAlarm.h when SYMBIAN_CALENDAR_V2 flag is enabled |
49 #endif // SYMBIAN_CALENDAR_V2 |
58 #endif // SYMBIAN_CALENDAR_V2 |
50 #include <calsession.h> |
59 #include <calsession.h> |
51 #include <calentryview.h> |
60 #include <calentryview.h> |
52 #include <clockdomaincrkeys.h> |
61 #include <calenlauncher.h> // for launching calendar entry view |
53 #include <calendardomaincrkeys.h> |
62 |
54 |
63 |
55 // Constants |
64 |
|
65 // CONSTANTS AND MACROS |
56 const TInt KAlmAlertMinSnooze( 100 ); |
66 const TInt KAlmAlertMinSnooze( 100 ); |
57 const TInt KAlmAlertMaxSnooze( 104 ); |
67 const TInt KAlmAlertMaxSnooze( 104 ); |
58 const TInt KDefaultSnoozeTime( 5 ); |
68 |
59 const TUint KAlarmAutoHide( 60000000 ); |
69 const TInt KDefaultSnoozeTime( 5 ); // 5 minutes |
60 const TUint KAlarmAutoHideCalendar( 30000000 ); |
70 |
61 const TUint KKeyBlockTime( 500000 ); |
71 const TUint KAlarmAutoHide( 60000000 ); // 60 s |
62 const TUint KShutdownTime( 1500000 ); |
72 const TUint KAlarmAutoHideCalendar( 30000000 ); // 30 s |
63 const TUint KAlarmDelayTime( 1000000 ); |
73 const TUint KKeyBlockTime( 500000 ); // 0.5 s |
64 const TUint KInactivityResetInterval( 1000000 ); |
74 const TUint KShutdownTime( 1500000 ); // 1.5 s |
|
75 const TUint KAlarmDelayTime( 1000000 ); // 1.0 s |
|
76 const TUint KInactivityResetInterval( 1000000 ); // 1.0 s |
|
77 |
65 const TInt KMaxProfileVolume( 10 ); |
78 const TInt KMaxProfileVolume( 10 ); |
66 const TInt KNoVolume(0); |
79 const TInt KVolumeRampPeriod( 3000000 ); // 3 seconds |
67 const TInt KVolumeRampPeriod( 3000000 ); |
|
68 const TUid KAlarmClockOne = { 0x101F793A }; |
|
69 const TUid KCRUidProfileEngine = {0x101F8798}; |
|
70 //const TUint32 KProEngActiveReminderTone = 0x7E00001C; |
|
71 const TUint32 KProEngActiveClockAlarmTone = 0x7E00001D; |
|
72 //const TUint32 KProEngActiveAlertVibra = 0x7E00001E; |
|
73 const TUint32 KProEngSilenceMode = {0x80000202}; |
|
74 const TUint32 KProEngActiveRingingType = {0x7E000002}; |
|
75 const TUint32 KProEngActiveRingingVolume = {0x7E000008}; |
|
76 |
|
77 // Literals |
|
78 _LIT( KRngMimeType, "application/vnd.nokia.ringing-tone" ); |
80 _LIT( KRngMimeType, "application/vnd.nokia.ringing-tone" ); |
|
81 |
79 |
82 |
80 // ========================================================== |
83 // ========================================================== |
81 // ================= MEMBER FUNCTIONS ======================= |
84 // ================= MEMBER FUNCTIONS ======================= |
82 |
85 |
83 |
86 |
107 User::LeaveIfError( iApaSession.Connect() ); |
110 User::LeaveIfError( iApaSession.Connect() ); |
108 |
111 |
109 iAlarmInfo = new( ELeave )CAlmAlarmInfo( this ); |
112 iAlarmInfo = new( ELeave )CAlmAlarmInfo( this ); |
110 |
113 |
111 // we can still work without profile engine |
114 // we can still work without profile engine |
112 // PIM_TRAPD_ASSERT( iProfileEng = CreateProfileEngineL(); ) |
115 PIM_TRAPD_ASSERT( iProfileEng = CreateProfileEngineL(); ) |
113 |
116 |
114 // iNotifierDialogController = ((CAknCapServer*)CEikonEnv::Static()->AppServer())->GlobalNoteControllerL(); |
117 iNotifierDialogController = ((CAknCapServer*)CEikonEnv::Static()->AppServer())->GlobalNoteControllerL(); |
115 // iNotifierDialogController->SetNoteObserver( iAlarmControl ); |
118 iNotifierDialogController->SetNoteObserver( iAlarmControl ); |
116 iAlarmAlert = new AlarmAlert(iAlarmControl); |
|
117 |
119 |
118 // create timers |
120 // create timers |
119 iShutdownTimer = CPeriodic::NewL( CActive::EPriorityStandard ); |
121 iShutdownTimer = CPeriodic::NewL( CActive::EPriorityStandard ); |
120 iAutoSnoozeTimer = CPeriodic::NewL( CActive::EPriorityStandard ); |
122 iAutoSnoozeTimer = CPeriodic::NewL( CActive::EPriorityStandard ); |
121 iKeyBlockTimer = CPeriodic::NewL( CActive::EPriorityStandard ); |
123 iKeyBlockTimer = CPeriodic::NewL( CActive::EPriorityStandard ); |
414 // ----------------------------------------------------------------------------- |
411 // ----------------------------------------------------------------------------- |
415 // Read alarm sound filenames from central repository. |
412 // Read alarm sound filenames from central repository. |
416 // ----------------------------------------------------------------------------- |
413 // ----------------------------------------------------------------------------- |
417 // |
414 // |
418 void CAlarmUtils::GetAlarmSoundFilenames() |
415 void CAlarmUtils::GetAlarmSoundFilenames() |
419 { |
416 { |
420 TRACE_ENTRY_POINT; |
417 TRACE_ENTRY_POINT; |
421 CRepository* profileRepository = NULL; |
418 CRepository* repository = NULL; |
422 CRepository* repository = NULL; |
419 |
423 |
420 if( IsClockAlarm() ) |
424 if( IsClockAlarm() ) |
421 { |
425 { |
422 PIM_TRAPD_ASSERT( repository = CRepository::NewL( KCRUidClockApp ); ) |
426 PIM_TRAPD_ASSERT( repository = CRepository::NewL( TUid::Uid(KCRUidClockApp) ); ) |
423 |
427 PIM_TRAPD_ASSERT( profileRepository = CRepository::NewL( |
424 if( repository ) |
428 KCRUidProfileEngine ); ) |
425 { |
429 |
426 PIM_ASSERT( repository->Get( KClockAppSoundFile, iAlarmData.iAlarmTone ); ) |
430 if( repository ) |
427 PIM_ASSERT( repository->Get( KClockAppDefaultSoundFile, iAlarmData.iDefaultAlarmTone ); ) |
431 { |
428 } |
432 PIM_ASSERT( repository->Get( KClockAppDefaultSoundFile, |
429 } |
433 iAlarmData.iDefaultAlarmTone ); ) |
430 else |
434 } |
431 { |
435 if( profileRepository ) |
432 PIM_TRAPD_ASSERT( repository = CRepository::NewL( KCRUidCalendar ); ) |
436 { |
433 |
437 // TODO: Need to use KProEngActiveClockAlarmTone once its released |
434 if( repository ) |
438 //PIM_ASSERT( profileRepository->Get( KProEngActiveClockAlarmTone , iAlarmData.iAlarmTone); ) |
435 { |
439 PIM_ASSERT( repository->Get( KClockAppDefaultSoundFile, |
436 PIM_ASSERT( repository->Get( KCalendarSoundFile, iAlarmData.iAlarmTone ); ) |
440 iAlarmData.iAlarmTone ); ) |
437 PIM_ASSERT( repository->Get( KCalendarDefaultSoundFile, iAlarmData.iDefaultAlarmTone ); ) |
441 } |
438 } |
442 } |
439 } |
443 else |
440 delete repository; |
444 { |
441 TRACE_EXIT_POINT; |
445 PIM_TRAPD_ASSERT( repository = |
442 } |
446 CRepository::NewL( TUid::Uid(KCRUidCalendar) ); ) |
|
447 PIM_TRAPD_ASSERT( profileRepository = |
|
448 CRepository::NewL( KCRUidProfileEngine ); ) |
|
449 |
|
450 if( repository ) |
|
451 { |
|
452 PIM_ASSERT( repository->Get( KCalendarDefaultSoundFile, |
|
453 iAlarmData.iDefaultAlarmTone ); ) |
|
454 } |
|
455 if( profileRepository ) |
|
456 { |
|
457 PIM_ASSERT( profileRepository->Get( KProEngActiveClockAlarmTone, iAlarmData.iAlarmTone ); ) |
|
458 } |
|
459 } |
|
460 delete repository; |
|
461 delete profileRepository; |
|
462 TRACE_EXIT_POINT; |
|
463 } |
|
464 |
443 |
465 // ----------------------------------------------------------------------------- |
444 // ----------------------------------------------------------------------------- |
466 // Check if the alarm sound file is a KRngMimeType file. |
445 // Check if the alarm sound file is a KRngMimeType file. |
467 // ----------------------------------------------------------------------------- |
446 // ----------------------------------------------------------------------------- |
468 // |
447 // |
507 iAlarmData.iRepeatValue = KMdaAudioToneRepeatForever; // KMdaRepeatForever |
486 iAlarmData.iRepeatValue = KMdaAudioToneRepeatForever; // KMdaRepeatForever |
508 iAlarmData.iVolume = KMaxProfileVolume; // clock alarms always ramp to maximum volume |
487 iAlarmData.iVolume = KMaxProfileVolume; // clock alarms always ramp to maximum volume |
509 iAlarmData.iVolumeRampTime = iAlarmData.iVolume * KVolumeRampPeriod; // volume ramp only for clock alarms |
488 iAlarmData.iVolumeRampTime = iAlarmData.iVolume * KVolumeRampPeriod; // volume ramp only for clock alarms |
510 |
489 |
511 if( !IsClockAlarm() ) |
490 if( !IsClockAlarm() ) |
512 { |
491 { |
513 CRepository* repository = NULL; |
492 if( iProfileEng ) |
514 PIM_TRAPD_ASSERT( repository = CRepository::NewL( KCRUidProfileEngine ); ) |
493 { |
515 |
494 MProfile* profile = NULL; |
516 TInt ringType; |
495 PIM_TRAPD_ASSERT( profile = iProfileEng->ActiveProfileL(); ) |
517 repository->Get( KProEngActiveRingingType , ringType); |
496 |
518 iAlarmData.iRingType = static_cast< TProfileRingingType >( ringType ); |
497 if( profile ) |
519 |
498 { |
520 TBool silentMode; |
499 const TProfileToneSettings& setting = profile->ProfileTones().ToneSettings(); |
521 TInt ringingVolume; |
500 iAlarmData.iRingType = setting.iRingingType; |
522 repository->Get( KProEngSilenceMode, silentMode); |
501 |
523 if(silentMode) |
502 // calendar alarms: if profile is "silent" -> set volume to zero |
524 { |
503 iAlarmData.iVolume = (iAlarmData.iRingType == EProfileRingingTypeSilent ? 0 : setting.iRingingVolume); |
525 ringingVolume = KNoVolume; |
504 |
526 } |
505 profile->Release(); |
527 else |
506 } |
528 { |
507 } |
529 // It seems the wrong key has been associated with calendar alarm tone |
508 |
530 // settings. It would be changed once it's rectified by profile team. |
509 if( iAlarmData.iRingType == EProfileRingingTypeRingingOnce ) |
531 repository->Get( KProEngActiveRingingVolume , ringingVolume ); |
510 { |
532 } |
511 iAlarmData.iRepeatValue = 1; |
533 |
512 } |
534 iAlarmData.iVolume = ringingVolume; |
513 iAlarmData.iVolumeRampTime = 0; |
535 |
514 } |
536 iAlarmData.iVolumeRampTime = 0; |
|
537 } else { |
|
538 TInt volumeOn = iAlarmData.iAlarm.ClientData2(); |
|
539 if (!volumeOn) { |
|
540 iAlarmData.iRingType = EProfileRingingTypeSilent; |
|
541 iAlarmData.iVolume = KNoVolume; |
|
542 } |
|
543 } |
|
544 TRACE_EXIT_POINT; |
515 TRACE_EXIT_POINT; |
545 } |
516 } |
546 |
517 |
547 // ----------------------------------------------------------------------------- |
518 // ----------------------------------------------------------------------------- |
548 // |
519 // |
1693 TBool CAlarmUtils::IsCalendarAlarmViewer() |
1672 TBool CAlarmUtils::IsCalendarAlarmViewer() |
1694 { |
1673 { |
1695 return iCalendarAlarmViewer; |
1674 return iCalendarAlarmViewer; |
1696 } |
1675 } |
1697 |
1676 |
1698 SAlarmInfo* CAlarmUtils::GetAlarmInfo() |
1677 // --------------------------------------------------------- |
1699 { |
1678 // Silence the notifying alarm |
1700 return iAlarmInfo->GetAlarmInfo(iAlarmData.iAlarm, |
1679 // --------------------------------------------------------- |
1701 iAlarmData.iAlarmType); |
1680 // |
1702 } |
1681 void CAlarmUtils::DoSilence() |
1703 |
1682 { |
|
1683 TRACE_ENTRY_POINT; |
|
1684 |
|
1685 // silence only if snoozing is possible |
|
1686 // this way user must hear the last "call" |
|
1687 if( CanSnooze() ) |
|
1688 { |
|
1689 TBool silenced( EFalse ); |
|
1690 if( IsCalendarAlarm() ) |
|
1691 { |
|
1692 // do silencing only if alarm is being played and silencing possible |
|
1693 if( iAlarmPlayer && !( IsRingingTypeSilent() || IsOffTone() ) ) |
|
1694 { |
|
1695 silenced = ETrue; |
|
1696 delete iAlarmPlayer; |
|
1697 iAlarmPlayer = NULL; |
|
1698 SetBackLight( EFalse ); |
|
1699 // calendar alarm needs extra handling due to having stop - silence |
|
1700 //simulate right softkey pressing |
|
1701 RWsSession wsSession=CCoeEnv::Static()->WsSession(); |
|
1702 TKeyEvent keyEvent; |
|
1703 keyEvent.iCode = EKeyCBA2; |
|
1704 keyEvent.iScanCode = EStdKeyDevice1; |
|
1705 keyEvent.iModifiers = 0; |
|
1706 keyEvent.iRepeats = 0; |
|
1707 wsSession.SimulateKeyEvent( keyEvent ); |
|
1708 wsSession.Flush(); |
|
1709 } |
|
1710 } |
|
1711 // clockalarm |
|
1712 else |
|
1713 { |
|
1714 silenced = ETrue; |
|
1715 delete iAlarmPlayer; |
|
1716 iAlarmPlayer = NULL; |
|
1717 SetBackLight( EFalse ); |
|
1718 StartAutoSnoozeTimer(); |
|
1719 } |
|
1720 |
|
1721 #if defined( RD_ALMALERT__SENSOR_SUPPORT ) |
|
1722 // notify the result through the context framework |
|
1723 if( iCFSupport && silenced ) |
|
1724 { |
|
1725 PIM_TRAPD_ASSERT( iCFSupport->PublishAlarmResultL( EResultAlarmSilenced ); ) |
|
1726 } |
|
1727 #endif // RD_ALMALERT__SENSOR_SUPPORT |
|
1728 } |
|
1729 TRACE_EXIT_POINT; |
|
1730 } |
|
1731 |
|
1732 // --------------------------------------------------------- |
|
1733 // Check if the alarm is duplicate calendar alarm |
|
1734 // Rest of the details in header file |
|
1735 // --------------------------------------------------------- |
|
1736 // |
|
1737 TBool CAlarmUtils::CheckForDuplicateAlarm() |
|
1738 { |
|
1739 TRACE_ENTRY_POINT; |
|
1740 TBool ret = EFalse; |
|
1741 if(IsCalendarAlarm()) |
|
1742 { |
|
1743 TTime currAlarmOrigExpTime = iAlarmData.iAlarm.OriginalExpiryTime(); |
|
1744 |
|
1745 if(currAlarmOrigExpTime == iPrevAlarmOriginalExpiryTime && iPrevLocalUid == iAlarmData.iLocalUid |
|
1746 && !iPrevCalFileName.CompareF(iAlarmData.iCalFileName) ) |
|
1747 { |
|
1748 TInt& count = iAlarmData.iAlarm.ClientData1(); |
|
1749 if( !(count >= KAlmAlertMinSnooze && |
|
1750 count <= KAlmAlertMaxSnooze )) |
|
1751 { |
|
1752 ret = ETrue; |
|
1753 } |
|
1754 } |
|
1755 } |
|
1756 TRACE_EXIT_POINT; |
|
1757 return ret; |
|
1758 } |
|
1759 |
|
1760 |
|
1761 // --------------------------------------------------------- |
|
1762 // Store details of current alarm for future comparison when next calendar alarm comes. |
|
1763 // Rest of the details in header file |
|
1764 // --------------------------------------------------------- |
|
1765 // |
|
1766 void CAlarmUtils::StoreCurrentCalendarAlarmData() |
|
1767 { |
|
1768 TRACE_ENTRY_POINT; |
|
1769 iPrevLocalUid = iAlarmData.iLocalUid; |
|
1770 iPrevCalFileName = iAlarmData.iCalFileName; |
|
1771 iPrevAlarmOriginalExpiryTime = iAlarmData.iAlarm.OriginalExpiryTime(); |
|
1772 TRACE_EXIT_POINT; |
|
1773 } |
|
1774 |
1704 // End of File |
1775 // End of File |