alarmui/src/AlmAlarmInfo.cpp
changeset 0 f979ecb2b13e
child 29 12af337248b1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/alarmui/src/AlmAlarmInfo.cpp	Tue Feb 02 10:12:19 2010 +0200
@@ -0,0 +1,521 @@
+/*
+* Copyright (c) 2006-2006 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:   This class provides the text for an alarm notification.
+*
+*/
+
+
+
+// INCLUDE FILES
+#include "pim_trace.h"
+#include "AlmAlarmInfo.h"
+
+#include <asshdalarm.h>
+#include <calentry.h>
+#include <StringLoader.h>
+#include <AknUtils.h>
+#include <akndialogcontroller.h>
+
+#include <AlmAlert.rsg>
+
+const TInt KAlarmNoteTextLength( 256 ); // KGlobalNoteTextLength
+const TInt KDateTimeDescLen( 20 ); // enough space for // "16:54" or "1:56 am" or "10.10.2010"
+const TInt KClockAlarmType( -1 );
+_LIT( KWesternSubjectSeparator, ", " );
+_LIT( KArabicSubjectSeparator, " \x060c" );
+_LIT( KNewLine, "\n" );
+_LIT( KSpace, " " );
+
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// constructor
+CAlmAlarmInfo::CAlmAlarmInfo(CAlarmUtils* aAlarmUtils)
+: iAlarmUtils( aAlarmUtils )
+{
+    TRACE_ENTRY_POINT;
+    TRACE_EXIT_POINT;
+}
+
+// destructor
+CAlmAlarmInfo::~CAlmAlarmInfo(void)
+{
+    TRACE_ENTRY_POINT;
+    delete iSubject;
+    delete iLocation;
+    delete iDate;
+    delete iTime;
+    TRACE_EXIT_POINT;
+}
+
+// -----------------------------------------------------------------------------
+// Get the text for the alarm query.
+// -----------------------------------------------------------------------------
+//
+void CAlmAlarmInfo::GetAlarmLabelL( const TASShdAlarm& aAlarm, 
+                                    HBufC*& aText, 
+                                    const CAlarmUtils::TAlarmType& aAlarmType )
+{
+    /**
+     *  Clock alarm:                  Other/unknown alarms:
+     *  ---------------------------   --------------------------- 
+     *  | Clock alarm:     :::::: |   | 01.01.2010       :::::: | 
+     *  | 12:00            :icon: |   | 12:00            :icon: | 
+     *  | DescriptionDesc  :::::: |   | DescriptionDesc  :::::: | 
+     *  | riptionDescriptionDescr |   | riptionDescriptionDescr | 
+     *  | iptionDescriptionDes... |   | iptionDescriptionDes... | 
+     *  ---------------------------   --------------------------- 
+     *
+     *  Meeting or reminder alarm:   Event or anniversary alarm:   To-Do alarm:
+     *  ---------------------------  ---------------------------   --------------------------- 
+     *  | 01.01.2010       :::::: |  | 01.01.2010       :::::: |   | To-Do Task:      :::::: | 
+     *  | 12:00            :icon: |  | SubjectSubjectS  :icon: |   | Due: 01.01.2010  :icon: | 
+     *  | SubjectSubjectS  :::::: |  | ubjectSubjectSu  :::::: |   | SubjectSubjectS  :::::: | 
+     *  | ubject, LocationLocatio |  | ubject, LocationLocatio |   | ubject, LocationLocatio | 
+     *  | nLocationLocationLoc... |  | nLocationLocationLoc... |   | nLocationLocationLoc... | 
+     *  ---------------------------  ---------------------------   --------------------------- 
+     *
+     *  Cover UI parameters:
+     *  ====================
+     *   Clock:       time: "12:00", date: "",           subject: "Description", location: ""
+     *   Unknown:     time: "12:00", date: "01.01.2010", subject: "Description", location: ""
+     *
+     *   Meeting:     time: "12:00", date: "01.01.2010", subject: "Subject",     location: "Location"
+     *   Reminder:    time: "12:00", date: "01.01.2010", subject: "Subject",     location: "Location"
+     *
+     *   Anniversary: time: "",      date: "01.01.2010", subject: "Subject",     location: "Location"
+     *   Event:       time: "",      date: "01.01.2010", subject: "Subject",     location: "Location"
+     *   To-Do:       time: "",      date: "01.01.2010", subject: "Subject",     location: "Location"
+     */
+    TRACE_ENTRY_POINT;
+
+    // cover UI params...
+    TInt coverUIAlarmType( KClockAlarmType );
+
+    switch( aAlarmType )
+    {
+        case CAlarmUtils::EAlarmTypeClock:
+        {
+            GetCoverUIParamsForClockAndOtherL( aAlarm, CAlarmUtils::EAlarmTypeClock );
+            SetupClockAlarmL( aText );
+        }
+        break;
+
+        case CAlarmUtils::EAlarmTypeOther:
+        {
+            // For Cover UI - unknown alarms are handled as calendar meetings
+            coverUIAlarmType = CCalEntry::EAppt;
+
+            GetCoverUIParamsForClockAndOtherL( aAlarm, CAlarmUtils::EAlarmTypeOther );
+            SetupUnknownAlarmL( aText );
+        }
+        break;
+
+        case CAlarmUtils::EAlarmTypeCalendar:
+        {
+            // check phone restore mode before creating agenda session
+            if( iAlarmUtils->IsPhoneInRestoreMode() )
+            {
+                User::Leave( KErrCancel );  // trapped in CAlmAlarmControl
+            }
+
+            // fetch the calendar entry and instance time
+            //
+            CCalEntry* entry = NULL;
+            iAlarmUtils->FetchEntryL( entry );
+            CleanupStack::PushL( entry );
+            CleanupStack::PushL( aText );
+
+            // entry type
+            CCalEntry::TType type = entry->EntryTypeL();
+            coverUIAlarmType = type;
+
+            GetCoverUIParamsForCalendarL( entry );
+
+            switch( type )
+            {
+                case CCalEntry::EAppt: // Appointment
+                case CCalEntry::EReminder: // Reminder
+                {
+                    SetupAppointmentAlarmL( aText );
+                }
+                break;
+
+                case CCalEntry::ETodo: // To-Do
+                {
+                    SetupToDoAlarmL( aText );
+                }
+                break;
+
+                //case CCalEntry::EAnniv: // Anniversary
+                //case CCalEntry::EEvent: // Day note / All day event
+                default:
+                {
+                    SetupAnniversaryAlarmL( aText );
+                }
+                break;
+            }
+
+            CleanupStack::Pop(); // aText
+            CleanupStack::PopAndDestroy( entry );
+        }
+        break;
+
+        default:
+            __ASSERT_DEBUG( EFalse, User::Invariant() );
+    }
+
+    // Set information for cover UI...
+    //
+    iAlarmUtils->NotifierDialogController()->AddAlarmAdditionalInfo( coverUIAlarmType, 
+                                                                     *iCoverTime, 
+                                                                     *iCoverDate, 
+                                                                     *iSubject, 
+                                                                     *iLocation );
+    // ... and cleanup
+    delete iSubject;   iSubject = NULL;
+    delete iLocation;  iLocation = NULL;
+    delete iDate;      iDate = NULL;
+    delete iTime;      iTime = NULL;
+    delete iCoverDate; iCoverDate = NULL;
+    delete iCoverTime; iCoverTime = NULL;
+
+    TRACE_EXIT_POINT;
+}
+
+// -----------------------------------------------------------------------------
+// Get the text for the wake-up query.
+// -----------------------------------------------------------------------------
+//
+void CAlmAlarmInfo::GetWakeupLabelL(HBufC*& aLabel)
+{
+    TRACE_ENTRY_POINT;
+    aLabel = StringLoader::LoadL( R_EIKALARM_CONFIRMATION );
+    TRACE_EXIT_POINT;
+}
+
+// =============================================================================
+// ALARM SETUP METHODS
+// =============================================================================
+
+// -----------------------------------------------------------------------------
+// Create alarm notification string for Clock alarm.
+// "[Clock alarm:][\n][time][\n][Description]"
+// -----------------------------------------------------------------------------
+//
+void CAlmAlarmInfo::SetupClockAlarmL(HBufC*& aText)
+{
+    TRACE_ENTRY_POINT;
+    // default text for clock alarm
+    HBufC* clockText = StringLoader::LoadLC( R_EIKALARM_CLOCK_ALARM_TYPE );
+
+    aText = HBufC::NewLC(  clockText->Length()
+                         + KNewLine().Length()
+                         + iTime->Length()
+                         + KNewLine().Length()
+                         + iSubject->Length() );
+
+    // add default clock alarm text
+    *aText = *clockText;
+    TPtr ptr = aText->Des();
+    ptr.Append( KNewLine );
+
+    // add time
+    ptr.Append( *iTime );
+
+    // add description
+    if( iSubject->Length() )
+    {
+        ptr.Append( KNewLine );
+        ptr.Append( *iSubject );
+    }
+
+    CleanupStack::Pop( aText );
+    CleanupStack::Pop( clockText );
+    TRACE_EXIT_POINT;
+}
+
+// -----------------------------------------------------------------------------
+// Create alarm notification string for an unknown alarm type.
+// "[date][\n][time][\n][Description]"
+// -----------------------------------------------------------------------------
+//
+void CAlmAlarmInfo::SetupUnknownAlarmL(HBufC*& aText)
+{
+    TRACE_ENTRY_POINT;
+    aText = HBufC::NewLC(  iDate->Length()
+                         + KNewLine().Length()
+                         + iTime->Length()
+                         + KNewLine().Length()
+                         + iSubject->Length() );
+    // add date
+    *aText = *iDate;
+    TPtr ptr = aText->Des();
+    ptr.Append( KNewLine );
+
+    // add time
+    ptr.Append( *iTime );
+
+    // add description
+    if( iSubject->Length() )
+    {
+        ptr.Append( KNewLine );
+        ptr.Append( *iSubject );
+    }
+
+    CleanupStack::Pop( aText );
+    TRACE_EXIT_POINT;
+}
+
+// -----------------------------------------------------------------------------
+// Create alarm notification string for a calendar appointment alarm.
+// "[date][\n][time][\n][Subject][, ][Location]"
+// -----------------------------------------------------------------------------
+//
+void CAlmAlarmInfo::SetupAppointmentAlarmL(HBufC*& aText)
+{
+    TRACE_ENTRY_POINT;
+    const TDesC& separator( User::Language() == ELangArabic ? 
+                            KArabicSubjectSeparator : 
+                            KWesternSubjectSeparator );
+
+    aText = HBufC::NewLC(  iDate->Length()
+                         + KNewLine().Length()
+                         + iTime->Length()
+                         + KNewLine().Length()
+                         + iSubject->Length()
+                         + separator.Length()
+                         + iLocation->Length() );
+
+    // add date
+    *aText = *iDate;
+    TPtr ptr = aText->Des();
+    ptr.Append( KNewLine );
+
+    // add time
+    ptr.Append( *iTime );
+    ptr.Append( KNewLine );
+
+    // subject and location
+    AppendSubjectLocationText( ptr, separator );
+
+    CleanupStack::Pop( aText );
+    TRACE_EXIT_POINT;
+}
+
+// -----------------------------------------------------------------------------
+// Create alarm notification string for a calendar to-do alarm.
+// "[To-Do Task:][\n][Due:][ ][date][\n][Subject][, ][Location]"
+// -----------------------------------------------------------------------------
+//
+void CAlmAlarmInfo::SetupToDoAlarmL(HBufC*& aText)
+{
+    TRACE_ENTRY_POINT;
+    HBufC* todoStr1 = StringLoader::LoadLC( R_EIKALARM_TODO_TITLE ); // "To-Do Task:"
+    HBufC* todoStr2 = StringLoader::LoadLC( R_EIKALARM_TODO_DUE ); // "Due:"
+    const TDesC& separator( User::Language() == ELangArabic ? 
+                            KArabicSubjectSeparator : 
+                            KWesternSubjectSeparator );
+
+    aText = HBufC::NewLC(  todoStr1->Length()
+                         + KNewLine().Length()
+                         + todoStr2->Length()
+                         + KSpace().Length()
+                         + iDate->Length()
+                         + KNewLine().Length()
+                         + iSubject->Length()
+                         + separator.Length()
+                         + iLocation->Length() );
+
+    // add default to-do alarm text
+    *aText = *todoStr1;
+    TPtr ptr = aText->Des();
+    ptr.Append( KNewLine );
+    ptr.Append( *todoStr2 );
+    ptr.Append( KSpace );
+
+    // add date
+    ptr.Append( *iDate );
+    ptr.Append( KNewLine );
+
+    // subject and location
+    AppendSubjectLocationText( ptr, separator );
+
+    CleanupStack::Pop( aText );
+    CleanupStack::PopAndDestroy( todoStr2 );
+    CleanupStack::PopAndDestroy( todoStr1 );
+    TRACE_EXIT_POINT;
+}
+
+// -----------------------------------------------------------------------------
+// Create alarm notification string for a calendar anniversary alarm.
+// "[date][\n][Subject][, ][Location]"
+// -----------------------------------------------------------------------------
+//
+void CAlmAlarmInfo::SetupAnniversaryAlarmL(HBufC*& aText)
+{
+    TRACE_ENTRY_POINT;
+    const TDesC& separator( User::Language() == ELangArabic ? 
+                            KArabicSubjectSeparator : 
+                            KWesternSubjectSeparator );
+
+    aText = HBufC::NewLC(  iDate->Length()
+                         + KNewLine().Length()
+                         + iSubject->Length()
+                         + separator.Length()
+                         + iLocation->Length() );
+    // add date
+    *aText = *iDate;
+    TPtr ptr = aText->Des();
+    ptr.Append( KNewLine );
+
+    // subject and location
+    AppendSubjectLocationText( ptr, separator );
+
+    CleanupStack::Pop( aText );
+    TRACE_EXIT_POINT;
+}
+
+
+
+// =============================================================================
+// STRING UTILITY FUNCTIONS
+// =============================================================================
+
+// -----------------------------------------------------------------------------
+// Append subject and location strings into aText.
+// -----------------------------------------------------------------------------
+//
+void CAlmAlarmInfo::AppendSubjectLocationText(TPtr& aDest, const TDesC& aSeparator)
+{
+    TRACE_ENTRY_POINT;
+    aDest.Append( *iSubject );
+
+    if( iLocation->Length() )
+    {
+        if( iSubject->Length() )
+        {
+            // add ", " if we have both subject and location
+            aDest.Append( aSeparator );
+        }
+        // add locaton
+        aDest.Append( *iLocation );
+    }
+    TRACE_EXIT_POINT;
+}
+
+// -----------------------------------------------------------------------------
+// Create strings needed for calendar alarms.
+// AVKON global note can't (currently) show more than 256 characters.  So no 
+// need to use more than KAlarmNoteTextLength -KDateTimeDescLen for subject 
+// and location strings.
+// -----------------------------------------------------------------------------
+//
+void CAlmAlarmInfo::GetCoverUIParamsForCalendarL(const CCalEntry* aEntry)
+{
+    TRACE_ENTRY_POINT;
+    HBufC* dateFormat = StringLoader::LoadLC( R_QTN_DATE_USUAL_WITH_ZERO );
+    HBufC* timeFormat = StringLoader::LoadLC( R_QTN_TIME_USUAL_WITH_ZERO );
+    const TTime instanceTime( iAlarmUtils->AlarmData().iInstanceTime.TimeLocalL() );
+
+    // subject
+    iSubject = HBufC::NewL( KAlarmNoteTextLength -KDateTimeDescLen );
+    iSubject->Des().Append( aEntry->SummaryL().Left( iSubject->Des().MaxLength() ) );
+    iSubject->Des().TrimAll();
+
+    // location
+    iLocation = HBufC::NewL( Max( 0, KAlarmNoteTextLength -KDateTimeDescLen -iSubject->Length() ) );
+    iLocation->Des().Append( aEntry->LocationL().Left( iLocation->Des().MaxLength() ) );
+    iLocation->Des().TrimAll();
+
+    // date
+    iDate = HBufC::NewL( KDateTimeDescLen );
+    TPtr datePtr = iDate->Des();
+    instanceTime.FormatL( datePtr, *dateFormat );
+    iCoverDate = iDate->AllocL();
+    AknTextUtils::LanguageSpecificNumberConversion( datePtr ); // digit conversion
+
+    // time
+    if( aEntry->EntryTypeL() == CCalEntry::EAppt || 
+        aEntry->EntryTypeL() == CCalEntry::EReminder )
+    {
+        iTime = HBufC::NewL( KDateTimeDescLen );
+        TPtr timePtr = iTime->Des();
+        instanceTime.FormatL( timePtr, *timeFormat );
+        iCoverTime = iTime->AllocL();
+        AknTextUtils::LanguageSpecificNumberConversion( timePtr ); // digit conversion
+    }
+    else // no time for other calendar types
+    {
+        iTime = HBufC::NewL( 0 );
+        iCoverTime = HBufC::NewL( 0 );
+    }
+
+    CleanupStack::PopAndDestroy( timeFormat );
+    CleanupStack::PopAndDestroy( dateFormat );
+    TRACE_EXIT_POINT;
+}
+
+// -----------------------------------------------------------------------------
+// Create strings needed for clock alarm and unknown alarms.
+// -----------------------------------------------------------------------------
+//
+void CAlmAlarmInfo::GetCoverUIParamsForClockAndOtherL( const TASShdAlarm& aAlarm, 
+                                                       const CAlarmUtils::TAlarmType aType )
+{
+    TRACE_ENTRY_POINT;
+    HBufC* dateFormat = StringLoader::LoadLC( R_QTN_DATE_USUAL_WITH_ZERO );
+    HBufC* timeFormat = StringLoader::LoadLC( R_QTN_TIME_USUAL_WITH_ZERO );
+
+    // alarm description
+    iSubject = aAlarm.Message().AllocL();
+    iSubject->Des().TrimAll();
+
+    // no location for clock alarms
+    iLocation = HBufC::NewL( 0 );
+
+    TTime alarmTime( aType == CAlarmUtils::EAlarmTypeClock ?
+                     aAlarm.NextDueTime() :
+                     aAlarm.OriginalExpiryTime() );
+
+    // alarm time
+    iTime = HBufC::NewL( KDateTimeDescLen );
+    TPtr timePtr = iTime->Des();
+    alarmTime.FormatL( timePtr, *timeFormat );
+    iCoverTime = iTime->AllocL();
+    AknTextUtils::LanguageSpecificNumberConversion( timePtr ); // digit conversion
+
+    if( aType == CAlarmUtils::EAlarmTypeClock )
+    {
+        // no date for clock alarms
+        iDate = HBufC::NewL( 0 );
+        iCoverDate = HBufC::NewL( 0 );
+    }
+    else // other alarm types
+    {
+        // date
+        iDate = HBufC::NewL( KDateTimeDescLen );
+        TPtr datePtr = iDate->Des();
+        alarmTime.FormatL( datePtr, *dateFormat );
+        iCoverDate = iDate->AllocL();
+        AknTextUtils::LanguageSpecificNumberConversion( datePtr ); // digit conversion
+    }
+
+    CleanupStack::PopAndDestroy( timeFormat );
+    CleanupStack::PopAndDestroy( dateFormat );
+    TRACE_EXIT_POINT;
+}
+
+
+// End of File