eventsui/eventseditor/src/evtmgmtuiringtonecomponent.cpp
branchRCL_3
changeset 18 870918037e16
parent 0 522cd55cc3d7
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/eventsui/eventseditor/src/evtmgmtuiringtonecomponent.cpp	Wed Sep 01 12:31:27 2010 +0100
@@ -0,0 +1,591 @@
+/*
+* 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:   'Set Assigntone' component for retrieving ringtone.
+*
+*/
+
+#include <evtmgmteditorui.rsg>
+#include <StringLoader.h>
+#include <CFLDFileListContainer.h>  // Audio File List
+#include <DRMHelper.h>              // DRM
+#include <eikenv.h>
+#include <aknlistquerydialog.h>
+#include <pathinfo.h>
+#include <driveinfo.h>
+#include <f32file.h>
+#include <NewFileServiceClient.h>   // Voice Recorder
+#include <AiwGenericParam.h>    
+#include <AknIconArray.h>       // Icon Array
+#include <evteditor.mbg>
+#include <avkon.mbg>
+#include <AknsUtils.h>
+#include <AknsSkinInstance.h>
+#include <data_caging_path_literals.hrh>
+#include <gulicon.h>            // Gul Icon
+#include <eikapp.h>
+#include <eikappui.h>
+#include <CalendarDomainCRKeys.h>
+#include <centralrepository.h>
+#include <AknUtils.h>
+#include <collate.h>
+
+#include "evtmgmteditorui.hrh"
+#include "evtmgmtuiringtonecomponent.h"
+#include "evtdebug.h"
+#include "evteditorconsts.h"
+
+const TInt KSetToneGranularity = 2;
+
+// ---------------------------------------------------------------------------
+// CEvtEditor ::NewL()
+// ---------------------------------------------------------------------------
+//
+CEvtMgmtUiRingtoneComponent* CEvtMgmtUiRingtoneComponent::NewL(const TPtrC aPrevRingtone)
+    {
+    CEvtMgmtUiRingtoneComponent * self = CEvtMgmtUiRingtoneComponent::NewLC(aPrevRingtone);
+    CleanupStack::Pop(self);
+    return self;
+    }
+
+// ---------------------------------------------------------------------------
+// CEvtEditor ::NewLC()
+// ---------------------------------------------------------------------------
+//
+CEvtMgmtUiRingtoneComponent* CEvtMgmtUiRingtoneComponent::NewLC(const TPtrC aPrevRingtone)
+    {
+    CEvtMgmtUiRingtoneComponent * self = new (ELeave) CEvtMgmtUiRingtoneComponent();
+    CleanupStack::PushL(self);
+    self->ConstructL( aPrevRingtone );
+    return self;
+    }
+
+// ---------------------------------------------------------------------------
+// CEvtMgmtUiDescComponent ::~CEvtMgmtUiDescComponent()
+// ---------------------------------------------------------------------------
+//
+CEvtMgmtUiRingtoneComponent::~CEvtMgmtUiRingtoneComponent()
+    {    
+    delete iRingtone;
+    iRingtone = NULL;
+    
+    if( iRecorderClient ) 
+        {
+        delete iRecorderClient;        
+        iRecorderClient = NULL;
+        }
+        
+    if( iSelectRingtoneDlg )
+        {
+        delete iSelectRingtoneDlg;        
+        iSelectRingtoneDlg = NULL;
+        }  
+    }
+
+// ---------------------------------------------------------------------------
+// CEvtMgmtUiRingtoneComponent ::ConstructL()
+// ---------------------------------------------------------------------------
+//
+void CEvtMgmtUiRingtoneComponent ::ConstructL( const TPtrC aPrevRingtone )
+    {
+    iRingtone = aPrevRingtone.AllocL();
+    }
+
+// ---------------------------------------------------------------------------
+// CEvtMgmtUiRingtoneComponent ::CEvtMgmtUiRingtoneComponent()
+// ---------------------------------------------------------------------------
+//
+CEvtMgmtUiRingtoneComponent::CEvtMgmtUiRingtoneComponent()
+    {    
+    }
+
+// -----------------------------------------------------------------------------
+// CEvtMgmtUiRingtoneComponent::Ringtone()
+// It is used to retrieve the selected ringtone's absolute path.
+// @ret absolute path of the selected ringtone
+// -----------------------------------------------------------------------------
+TPtrC CEvtMgmtUiRingtoneComponent::Ringtone() const
+    {
+    // if ringtone, returns ringtone else empty string
+    if( iRingtone )
+        return *iRingtone;
+    else
+        return KNullDesC();
+    }
+
+// -----------------------------------------------------------------------------
+// CEvtMgmtUiRingtoneComponent::DefaultRingtoneL()
+// It is used to retrieve the path of the Default Tone.
+// @ret absolute path of the default ringtone
+// -----------------------------------------------------------------------------
+TPtrC CEvtMgmtUiRingtoneComponent::DefaultRingtoneL()
+    {
+    TFileName toneFileName;
+    CRepository* centralRepository = CRepository::NewLC(KCRUidCalendar);
+    User::LeaveIfError(centralRepository->Get(KCalendarSoundFile, toneFileName));
+    CleanupStack::PopAndDestroy(centralRepository);
+    if( iRingtone )
+        {
+        delete iRingtone;
+        iRingtone = NULL;
+        }
+    iRingtone = toneFileName.AllocL();   
+    
+    // if ringtone, returns ringtone else empty string
+    if( iRingtone )
+        return *iRingtone;
+    else
+        return KNullDesC();
+    }
+
+// -----------------------------------------------------------------------------
+// CEvtMgmtUiRingtoneComponent::DisplayAudioPopupDlgL()
+// It is used to display 'Set tone' popup dialog and to retrieve ringtone.
+// @ret error if there is any error
+//      KErrNone if it is successful  
+// -----------------------------------------------------------------------------
+TInt CEvtMgmtUiRingtoneComponent::DisplayAudioTonePopupDlgL()
+    {    
+    TInt response = KErrNone;   
+    
+    //display 'set tone' popup dialog   
+    TInt index = DisplayPopupDlgL();
+   
+    switch(index)
+        {        
+        case EEvtMgmtUiAssignedToneTone: // if 'select from exising' is selected
+            {
+            response = DisplayRingtoneSelectionDlgL();
+            break;
+            }
+        case EvtMgmtUiAssignedToneRecordNew: //if 'record new' is selected
+            {
+            response = RecordNewToneL();
+            break;
+            }
+        default:
+            {
+            response = KErrCancel;
+            Debug(_L("DisplayAudioTonePopupDlgL panic"));
+            break;
+            }
+        }    
+     return response;
+    }
+
+// -----------------------------------------------------------------------------
+// CEvtMgmtUiRingtoneComponent::DisplayRingtoneSelectionDlgL()
+// t is used display  system's 'select tone' dialog.
+// @ret error while displaying 'select tone' dialog and 
+//      retrieving ringtone from it. 
+//      KErrNone if it is successful
+// -----------------------------------------------------------------------------
+TInt CEvtMgmtUiRingtoneComponent::DisplayRingtoneSelectionDlgL()
+    {
+    TInt response = KErrNone;
+    
+    // Create instance of FileList using new FileList API
+    if(!iSelectRingtoneDlg)
+        iSelectRingtoneDlg = CFLDFileListContainer::NewL();
+
+    iSelectRingtoneDlg->SetAutomatedType( CDRMHelper::EAutomatedTypeRingingTone );
+
+    // Do not show videos, use new FileList API
+    iSelectRingtoneDlg->AddExclusiveMediaTypeL( ECLFMediaTypeVideo );
+    
+    HBufC* strOff = StringLoader::LoadLC( R_EVTUI_RINGTONESELECT_OFF );
+    
+    iSelectRingtoneDlg->InsertEndNullItemL( *strOff );
+    TFileName ringtone( *iRingtone );
+    
+    //launch selection dialog
+    if( iSelectRingtoneDlg->LaunchL( ringtone ) ) //if ringtone is selected
+        {        
+        delete iRingtone;
+        iRingtone = NULL;
+        iRingtone = ringtone.AllocL();   
+        }
+    else // if dialog is cancelled
+        response = KErrCancel;
+    
+    CleanupStack::PopAndDestroy(1 ); // strOff
+    delete iSelectRingtoneDlg;
+    iSelectRingtoneDlg = NULL;
+    
+    //return error code
+    return response;
+    }
+
+// -----------------------------------------------------------------------------
+// CEvtMgmtUiRingtoneComponent::DisplayPopupDlgL()
+// It is used to display generic popup dialog.
+// @ret index of item selected if OK is pressed
+//       KErrCancel if Cancel is pressed 
+// -----------------------------------------------------------------------------
+TInt CEvtMgmtUiRingtoneComponent::DisplayPopupDlgL()
+    {
+    TInt index = 0;
+    const TInt KToneIconIndex = 0;
+    const TInt KRecordNewIconIndex = 1;
+    const TInt KIconTextLength = 1;
+    const TInt KAssignToneGranularity =2;   
+    _LIT(KTab, "\t");  
+    HBufC* dummy = NULL;
+    
+    //title text
+    HBufC* title  = StringLoader::LoadLC( R_EVTUI_CREATENEW_FORM_ASSIGNTONEPOPUP_TITLE );
+     
+    //Tone
+    dummy = StringLoader::LoadLC(R_EVTUI_CREATENEW_FORM_ASSIGNTONEPOPUPOPTIONS_TONE);
+    HBufC* tone = HBufC::NewL( KIconTextLength + KTab().Length() + 
+                       dummy->Length() + KTab().Length( )+ KTab().Length() );
+    TPtr ptrDummy = tone->Des();
+    ptrDummy.Num(KToneIconIndex);
+    ptrDummy.Append(KTab);
+    ptrDummy.Append(*dummy);
+    ptrDummy.Append(KTab);
+    ptrDummy.Append(KTab);
+    CleanupStack::PopAndDestroy(dummy);
+    CleanupStack::PushL(tone);
+    
+    // Record new
+    dummy = StringLoader::LoadLC(R_EVTUI_CREATENEW_FORM_ASSIGNTONEPOPUPOPTIONS_RECORDNEW);
+    HBufC* recordNew = HBufC::NewL( KIconTextLength + KTab().Length() + 
+                      dummy->Length() + KTab().Length( )+ KTab().Length() );
+    ptrDummy.Set( recordNew->Des() );
+    ptrDummy.Num(KRecordNewIconIndex);
+    ptrDummy.Append(KTab);
+    ptrDummy.Append(*dummy);
+    ptrDummy.Append(KTab);
+    ptrDummy.Append(KTab);
+    CleanupStack::PopAndDestroy(dummy);
+    CleanupStack::PushL(recordNew);
+    
+    //array
+    CDesCArrayFlat* array = new(ELeave)CDesCArrayFlat( KAssignToneGranularity );
+    CleanupStack::PushL(array);
+    array->AppendL(*tone);
+    array->AppendL(*recordNew);
+    
+    //launch dialog
+    CAknListQueryDialog* dlg = new( ELeave ) CAknListQueryDialog( &index );
+    dlg->PrepareLC( R_EVTMGMTUI_LIST_QUERY );  
+    UpdateIconsL( *dlg );
+    dlg->SetItemTextArray( array ); 
+    dlg->SetOwnershipType( ELbmOwnsItemArray );  
+    dlg->QueryHeading()->SetTextL( *title );
+    if ( !dlg->RunLD() )     // if dialog is cancelled  
+       index = KErrCancel;   
+    
+    CleanupStack::Pop(array); //ownership was transferred to dialog
+    
+    CleanupStack::PopAndDestroy( 3 ); //recordNew, tone, title
+    return index;
+    }
+
+// -----------------------------------------------------------------------------
+// CEvtMgmtUiRingtoneComponent::RecordNewToneL()
+// It is used to record new ringtone.
+// @ret KErrNone if recording is succesful.
+//      error code if it is failed.
+// -----------------------------------------------------------------------------
+TInt CEvtMgmtUiRingtoneComponent::RecordNewToneL()
+    {
+    TInt err = KErrNone;
+    
+    TFileName fileName;
+    err = FileNameForRecordingL( fileName );
+    if(err!=KErrNone)
+        {
+        Debug( _L("Error while generating filename for recording =%d"), err );
+        return err;
+        }
+    
+    Debug( _L("Recording filename = ") );
+    Debug( fileName );
+    
+    RFs fs;
+    User::LeaveIfError( fs.Connect() );
+    CleanupClosePushL(fs);
+    fs.ShareProtected(); // The file server session must be in this mode
+
+    
+    // Record Audio Clip    
+    if(!iRecorderClient)
+        iRecorderClient = NewFileServiceFactory::NewClientL();  
+       
+    //create empty audio file
+    RFile file;
+    file.Replace( fs, fileName, EFileShareAny|EFileWrite  );
+    CleanupClosePushL(file);
+    
+ 
+    // launch recorder application to record tone.
+    TBool response = EFalse;
+    CAiwGenericParamList* params = CAiwGenericParamList::NewLC();
+    TAiwVariant variant;
+    variant.Set( _L("file" ) );
+    TAiwGenericParam param( EGenericParamURL, variant );
+    params->AppendL( param );
+    TRAP(err, response = iRecorderClient->NewFileL( file, params, ENewFileServiceAudio ) );   
+    Debug( _L( "Error while recording =%d, response =%d" ), err, response );
+    CleanupStack::PopAndDestroy( 2 ); // params, file
+    delete iRecorderClient;
+    iRecorderClient = NULL;
+   //if recording is successful, set ringtone.
+   if( response && err == KErrNone)
+       {
+       delete iRingtone;
+       iRingtone = NULL;
+       iRingtone = fileName.AllocL();
+       }
+   
+   //if recording is cancelled, set err to KErrCancel
+   if( !response )
+       err = KErrCancel;       
+   
+   //if there is error in recording or recording is cancelled, delete the file.
+   if( err!=KErrNone )
+       fs.Delete( fileName );
+   
+   CleanupStack::PopAndDestroy(); //fs
+   
+   return err;
+   }
+
+// -----------------------------------------------------------------------------
+// CEvtMgmtUiRingtoneComponent::RecordNewToneL()
+// It is used to generate filename for recording new file.
+// @param[out] aFileName - it will contain generated file-name
+// @ret KErrNone if recording is succesful.
+//      error code if it is failed.
+// -----------------------------------------------------------------------------
+TInt CEvtMgmtUiRingtoneComponent:: FileNameForRecordingL( TDes& aFileName )
+    { 
+    PathInfo::GetFullPath(aFileName, EDriveC, PathInfo::ESoundsPath );
+    
+    HBufC* recStr = StringLoader::LoadLC( R_LOCEV_LIST_VOREC_CLIP_NAME );
+    
+    //Open sound directory
+    RDir directory;
+    TInt err = directory.Open(CEikonEnv::Static()->FsSession(), aFileName, KEntryAttNormal);       
+    if( err!=KErrNone )
+       {     
+       return err;
+       }   
+    CleanupClosePushL(directory);
+    
+    //Retrieve files from directory
+    TEntryArray fileList;    
+    err = directory.Read(fileList);
+    
+    TInt maxValue = 0;
+    
+    if ( err == KErrNone || err == KErrEof )
+       {
+       err = KErrNone;
+       //Check folder's files and find last recent audio file    
+       for (TInt i = 0; i < fileList.Count(); ++i)
+           {
+           TEntry fileEntry = fileList[i];
+           
+           TCollationMethod cm = *Mem::CollationMethodByIndex( 0 ); // default collation method
+           cm.iFlags |= TCollationMethod::EIgnoreNone;
+           
+           //Check that file is valid audiofile                
+           if (!fileEntry.IsReadOnly() && 
+               !fileEntry.IsHidden() &&
+               !fileEntry.IsSystem() && 
+               !fileEntry.IsDir() &&
+               TDesC::EIsPrefix == fileEntry.iName.HasPrefixC(*recStr, 0, &cm) &&
+               fileEntry.iName.Find(*recStr) != KErrNotFound)
+               {
+               //Find out running number
+               TParse parser;
+               parser.Set( fileEntry.iName, NULL, NULL );
+               TFileName fileName = parser.Name();
+               fileName.Delete(0,recStr->Length());
+               fileName.Trim();
+
+               //Convert digits from any digit format to european digit format. 
+               AknTextUtils::ConvertDigitsTo( fileName, EDigitTypeWestern );
+                               
+               TInt multiplier = 1;
+               TInt count = 0;
+               for (TInt i = fileName.Length() - 1; i != -1;  --i)
+                   {
+                   TChar numberchar = fileName[i];
+                   //Check if the character is digit
+                   if( numberchar.IsDigit() )
+                       {
+                       TInt number = numberchar.GetNumericValue();
+                       
+                       count += number * multiplier;
+                       multiplier = multiplier * 10;
+                       }
+                   else
+                       {
+                       break;
+                       }
+                   }
+               
+               //Save current number of audio files
+               if (count > maxValue)
+                   {
+                   maxValue = count;
+                   }
+               }
+           }
+       }
+    
+    //Create a text containing the count to localize
+    TFileName num;
+    num.Zero();
+    num.AppendNum(maxValue+1);
+
+    //Converts between arabic-indic digits and european digits 
+    //based on existing language setting.
+    AknTextUtils::LanguageSpecificNumberConversion( num );
+    
+    //set recording filename
+    aFileName.Append(*recStr);
+    aFileName.Append(num);    
+    aFileName.Append(KRecorderFileEnd);
+    
+    CleanupStack::PopAndDestroy(2); // dir, recStr
+    
+    return err;           
+    }
+
+// -----------------------------------------------------------------------------
+// CEvtMgmtUiRingtoneComponent::UpdateIconsL
+// It update icons
+// -----------------------------------------------------------------------------
+void CEvtMgmtUiRingtoneComponent::UpdateIconsL( CAknListQueryDialog& aDialog )
+    {
+    Debug(_L("start CEvtMgmtUiPlaceComponent::UpdateIconsL()"));
+    
+    CAknIconArray* icons = new( ELeave ) CAknIconArray( KSetToneGranularity );
+    CleanupStack::PushL( icons );
+
+    TFileName *iconFile = IconFileNameLC();
+
+    AddIconL( *icons, 
+              *iconFile,
+              KAknsIIDQgnPropFmgrFileSound, 
+              EMbmEvteditorQgn_prop_fmgr_file_sound, EMbmEvteditorQgn_prop_fmgr_file_sound_mask);
+    
+    AddIconL( *icons, 
+             *iconFile,
+             KAknsIIDQgnPropFmgrFileVoicerec, 
+             EMbmEvteditorQgn_prop_fmgr_file_voicerec, EMbmEvteditorQgn_prop_fmgr_file_voicerec_mask);
+
+    CleanupStack::PopAndDestroy(iconFile);
+
+    //set new icons to array
+    aDialog.SetIconArrayL( icons );  
+    CleanupStack::Pop(icons);
+    
+    Debug(_L("end CEvtMgmtUiPlaceComponent::UpdateIconsL()"));
+        
+    }
+    
+// -----------------------------------------------------------------------------
+// CEvtMgmtUiRingtoneComponent::AddIconL
+// Append icon to icon array. CAknIconArray owns icons so it is 
+// easier to it leave safely.
+// @param aIcons icon array
+// @param aIconFileWithPath icon file name with path
+// @param aSkinID skin id of the icon
+// @param aIconGraphicsIndex picture index
+// @param aIconGraphicsMaskIndex mask index
+// -----------------------------------------------------------------------------
+void CEvtMgmtUiRingtoneComponent::AddIconL( CAknIconArray&  aIcons,
+                                           const TDesC&    aIconFileWithPath,
+                                           TAknsItemID     aSkinID,
+                                           TInt            aIconGraphicsIndex,
+                                           TInt            aIconGraphicsMaskIndex )
+    {
+    MAknsSkinInstance* skin = AknsUtils::SkinInstance();
+
+    EVTUIDEBUG( "AknsUtils::SkinInstance" );
+    
+    CFbsBitmap* bitmap = NULL;
+    CFbsBitmap* bitmapMask = NULL;
+    TRAPD( err, AknsUtils::CreateIconL( skin,
+                            aSkinID,
+                            bitmap,
+                            bitmapMask,
+                            aIconFileWithPath,
+                            aIconGraphicsIndex,
+                            aIconGraphicsMaskIndex ) );
+
+	
+    EVTUIDEBUG1( "AknsUtils::CreateIconL - %d", err );
+    if(err != KErrNone)
+	    {
+	    TRAP( err, AknIconUtils::CreateIconL( bitmap,
+	                            bitmapMask,
+	                            aIconFileWithPath,
+	                            aIconGraphicsIndex,
+	                            aIconGraphicsMaskIndex ) );
+    	EVTUIDEBUG1( "AknIconUtils::CreateIconL - %d", err );
+	    }
+    User::LeaveIfError( err );
+    
+    CleanupStack::PushL( bitmap );
+    CleanupStack::PushL( bitmapMask );
+    
+    CGulIcon* icon = CGulIcon::NewL( bitmap, bitmapMask );
+    
+    // Remove the Bitmap and the Bitmap Icon from the Clean up stack since 
+    // the ownership is taken over by the icon
+    CleanupStack::Pop( bitmapMask );
+    CleanupStack::Pop( bitmap ); 
+    
+    CleanupStack::PushL( icon );
+    aIcons.AppendL( icon );
+    CleanupStack::Pop( icon ); // icon
+    }
+
+// -----------------------------------------------------------------------------
+// CEvtMgmtUiRingtoneComponent::IconFileNameLC
+// Gets Events Management UI icon file path and name. Ownership
+// is transferred, item is left in the cleanup stack.
+// @return TFileName* The full name of the Events UI icon file.
+// -----------------------------------------------------------------------------
+TFileName* CEvtMgmtUiRingtoneComponent::IconFileNameLC() const
+    {
+    TFileName* fileName = new(ELeave) TFileName;
+    CleanupStack::PushL( fileName );
+    
+    TFileName* tmpName = new(ELeave) TFileName;
+    CleanupStack::PushL( tmpName );
+    
+    tmpName->Append( KDC_BITMAP_DIR );
+    tmpName->Append( KEvtMgmtUiIconFileName );
+
+    CEikAppUi *appUi = ( CEikAppUi *)( CEikonEnv::Static()->AppUi());
+    TFileName appDrive = appUi->Application()->AppFullName();
+    
+    TParse parse;
+    User::LeaveIfError( parse.Set( appDrive, NULL, NULL ) );
+    User::LeaveIfError( parse.Set( parse.Drive(), tmpName, NULL ) );
+    
+    fileName->Copy(parse.FullName());
+
+    CleanupStack::PopAndDestroy( tmpName );
+
+    return fileName;
+    }  
+//end of file