Revision: 201009 RCL_3
authorDremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Mon, 15 Mar 2010 12:40:34 +0200
branchRCL_3
changeset 8 3cb097cb90f8
parent 7 108d9820af01
child 11 95ac6b0f7f5b
Revision: 201009 Kit: 201010
fmradio/fmradio/data/fmradio.rss
fmradio/fmradio/inc/fmradioappui.h
fmradio/fmradio/inc/fmradiochannellistview.h
fmradio/fmradio/inc/fmradiodefines.h
fmradio/fmradio/inc/fmradiopreset.h
fmradio/fmradio/inc/mchannellisthandler.h
fmradio/fmradio/src/fmradioalfvisualizer.cpp
fmradio/fmradio/src/fmradioappui.cpp
fmradio/fmradio/src/fmradiochannellistcontainer.cpp
fmradio/fmradio/src/fmradiochannellistview.cpp
fmradio/fmradio/src/fmradiologo.cpp
fmradio/fmradio/src/fmradiomaincontainer.cpp
fmradio/fmradio/src/fmradiomainview.cpp
fmradio/fmradio/src/fmradiopreset.cpp
fmradio/fmradio/src/fmradioscanlocalstationsview.cpp
fmradio/fmradioengine/bwins/fmradioengineacu.def
fmradio/fmradioengine/eabi/fmradioengineacu.def
fmradio/fmradioengine/group/fmradioengine.mmp
fmradio/fmradioengine/inc/fmradioengine.h
fmradio/fmradioengine/src/fmradioaccessoryobserver.cpp
fmradio/fmradioengine/src/fmradioengine.cpp
fmradio/fmradiomcpplugin/src/fmradiomcpplugin.cpp
--- a/fmradio/fmradio/data/fmradio.rss	Fri Mar 12 15:42:47 2010 +0200
+++ b/fmradio/fmradio/data/fmradio.rss	Mon Mar 15 12:40:34 2010 +0200
@@ -45,7 +45,7 @@
 #include <fmradio.loc>
 
 #define KFMRadioBitmapFile APP_BITMAP_DIR "\\fmradio.mif"
-
+#define KAvkonBitmapFile APP_BITMAP_DIR "\\avkon2.mif"
 // RESOURCE DEFINITIONS 
 //
 RESOURCE RSS_SIGNATURE { }
@@ -118,18 +118,18 @@
 RESOURCE AKN_ICON_ARRAY r_fmradio_channel_list_icon_array
     {
     type = EAknIconArraySimple;
-    bmpfile = KFMRadioBitmapFile;
+    bmpfile = KAvkonBitmapFile;
     icons =
         {
         AKN_ICON
             {
-            iconId = EMbmFmradioQgn_indi_radio_playing;
-            maskId = EMbmFmradioQgn_indi_radio_playing_mask;
+            iconId = EMbmAvkonQgn_indi_speaker;
+            maskId = EMbmAvkonQgn_indi_speaker_mask;
             },
         AKN_ICON
             {
-            iconId = EMbmFmradioQgn_indi_marked_add;
-            maskId = EMbmFmradioQgn_indi_marked_add_mask;
+            iconId = EMbmAvkonQgn_indi_marked_add;
+            maskId = EMbmAvkonQgn_indi_marked_add_mask;
             }
         };
     }
--- a/fmradio/fmradio/inc/fmradioappui.h	Fri Mar 12 15:42:47 2010 +0200
+++ b/fmradio/fmradio/inc/fmradioappui.h	Mon Mar 15 12:40:34 2010 +0200
@@ -17,7 +17,6 @@
 *
 */
 
-
 #ifndef FMRADIOAPPUI_H
 #define FMRADIOAPPUI_H
 
@@ -66,17 +65,14 @@
 *    @since 2.6
 */
 class MInformationNoteInterface
-	{
-	public:
-		
-		/**
+    {
+    public:
+        /**
         * tells when dialog was terminated
         */
-		virtual void DialogTerminated() = 0;
-	
-	};
-	
-	
+        virtual void DialogTerminated() = 0;
+    };
+
 /**
 * Information note for headset key events. Enabling functionality to disable new dialog creation 
 * when dialog is active
@@ -84,27 +80,25 @@
 *    @since 2.6
 */
 class CFMInformationNote: public CAknInformationNote
-	{
-	public:
-	
-		/**
+    {
+    public:
+    
+        /**
         * default constructor.
         */
-		CFMInformationNote( MInformationNoteInterface& aObserver);
-		
-		/**
+        CFMInformationNote( MInformationNoteInterface& aObserver);
+        
+        /**
         * Destructor.
         */
-		virtual ~CFMInformationNote();
-		
-	private:
-		
-		// Dialog event observer
-		MInformationNoteInterface& iDialogObserver;
-	
-	};
-
- 
+        virtual ~CFMInformationNote();
+        
+    private:
+        
+        // Dialog event observer
+        MInformationNoteInterface& iDialogObserver;
+    
+    };
 
 /**
 * Instantiates the application views. It also acts as the default command handler for the
@@ -131,12 +125,35 @@
             EDirectionNone,
             EDirectionDown
             };
+        
+        enum TRadioState
+            {
+            EFMRadioStateOff = 0,            // Radio off
+            EFMRadioStateOffForPhoneCall,    // Radio off because a phone call
+            EFMRadioStateOffBeforePhoneCall, // Radio was off + phone call going on -> no resume
+            EFMRadioStateOn,
+            EFMRadioStateRecording,
+            EFMRadioStateBusyRadioOn,
+            EFMRadioStateBusyRadioOff,
+            EFMRadioStateBusySeek,
+            EFMRadioStateBusyMute,
+            EFMRadioStateBusyVolume,
+            EFMRadioStateBusyManualTune,
+            EFMRadioStateBusyScanLocalStations,
+            EFMRadioStateExiting
+            };
 
     public: // Constructors and destructor
         /**
         * EPOC default constructor.
         */
         void ConstructL();
+        
+        /**
+         * C++ default constructor.
+         */
+        CFMRadioAppUi();
+        
         /**
         * Destructor.
         */
@@ -164,7 +181,7 @@
         * @param aCommand command to be handled
         */
         void HandleCommandL( TInt aCommand );
-        
+
         /**
         * Notification interface from RadioEngine. Used to inform
         * us when requests have completed.
@@ -174,38 +191,38 @@
         */
         void HandleRadioEngineCallBack( MRadioEngineStateChangeCallback::TFMRadioNotifyEvent aEventCode, TInt aErrorCode );
     public: // new functions 
-    	/**
-		* Returns a pointer to the radio engine
-	    *
-	    * @return Radio engine
-		*/
-    	CRadioEngine* RadioEngine();
-    	
+        /**
+        * Returns a pointer to the radio engine
+        *
+        * @return Radio engine
+        */
+        CRadioEngine* RadioEngine();
+
         /**
          * Returns a reference to Back Stepping wrapper
          * 
          * @return Reference to Back Stepping wrapper
          */
         CFMRadioBackSteppingServiceWrapper& BackSteppingWrapper() const;
-    	
-    	/**
-	     * Returns a pointer to FMRadio's document, cannot be null.
-	     *
-	     * @return A pointer to a CFMRadioDocument object.
-	     */
-    	CFMRadioDocument* Document() const;
+
+        /**
+         * Returns a pointer to FMRadio's document, cannot be null.
+         *
+         * @return A pointer to a CFMRadioDocument object.
+         */
+        CFMRadioDocument* Document() const;
         /**
-		* Checks if current screen orientation is landscape
-	    *
-	    * @return ETrue if orientation is landscape, otherwise EFalse
-		*/
-		TBool IsLandscapeOrientation() const;
-		
-    	/**
-     	* Handles offline mode at startup.
-     	*/
-     	void HandleOfflineModeAtStartUpL();
-     	
+        * Checks if current screen orientation is landscape
+        *
+        * @return ETrue if orientation is landscape, otherwise EFalse
+        */
+        TBool IsLandscapeOrientation() const;
+
+        /**
+        * Handles offline mode at startup.
+        */
+        void HandleOfflineModeAtStartUpL();
+
         /**
         * Handles start up foreground event.
         */		
@@ -214,25 +231,25 @@
         * Nunber of channels stored in presets.
         * @return number of channels in presets
         */ 
-        TInt NumberOfChannelsStored() const;           
+        TInt NumberOfChannelsStored() const;
+        /**
+        * Returns the UID of the currently active local view. KNullUid if none 
+        * active (construction/destruction).
+        * @return UID of the currently active local view, KNullUid if none 
+        * active.
+        */
+        TUid ActiveView() const;
         /**
-    	 * Returns the UID of the currently active local view. KNullUid if none 
-    	 * active (construction/destruction).
-    	 * @return UID of the currently active local view, KNullUid if none 
-    	 * active.
-    	 */
-    	TUid ActiveView() const;
-    	/**
-    	* Return startup scanning wizard status.
-    	* @return running status
-    	*/
-    	TBool IsStartupWizardRunning() const;
-    	/**
-    	* Set startup scanning wizard status.
-    	* @param aRunningState running state
-    	*/
-    	void SetStartupWizardRunning( const TBool aRunningState );
-    	/**
+        * Return startup scanning wizard status.
+        * @return running status
+        */
+        TBool IsStartupWizardRunning() const;
+        /**
+        * Set startup scanning wizard status.
+        * @param aRunningState running state
+        */
+        void SetStartupWizardRunning( const TBool aRunningState );
+        /**
         * Tune to the specified frequency
         * @since 2.6
         * @param aFrequency the frequency to be tuned
@@ -242,37 +259,37 @@
         * @return mirrored layout state
         */
         TBool IsLayoutMirrored() const;
-		/**
-		* Show currently active volume popup control
-		*/
-		void ShowVolumePopupL();
+        /**
+        * Show currently active volume popup control
+        */
+        void ShowVolumePopupL();
+
+        /**
+         * From MChannelListHandler 
+         * Updates channels array in appui 
+         * @param aOperation tells which operation is made to array
+         * @param aIndex tells affecting index
+         * @param aMovedToNewIndex optional during move operation
+         */
+        void UpdateChannelsL( TMoveoperations aOperation, 
+                TInt aIndex, 
+                TInt aMovedToNewIndex  );
 
-		/**
-		 * From MChannelListHandler 
-		 * Updates channels array in appui 
-		 * @param aOperation tells which operation is made to array
-		 * @param aIndex tells affecting index
-		 * @param aMovedToNewIndex optional during move operation
-		 */	
-		void UpdateChannelsL( TMoveoperations aOperation, 
-				TInt aIndex, 
-				TInt aMovedToNewIndex  );
-		
-		/**
-		 * From MChannelListHandler
-		 * Add a new channel to list of channels
-		 * @param aChannelName Name of the channel to be saved
-		 * @param aChannelFreq Channel frequency
-		 */	
-		void AddChannelToListL( const TDesC& aChannelName, TInt aChannelFreq );
-		
-		/**
-		 * From MChannelListHandler
-		 * Accessory method to channels array
-		 */
-		CArrayFixFlat<TChannelInformation>* Channels();
-		
-		void AutoTuneInMainView ( TBool aTune );
+        /**
+         * From MChannelListHandler
+         * Add a new channel to list of channels
+         * @param aChannelName Name of the channel to be saved
+         * @param aChannelFreq Channel frequency
+         */
+        void AddChannelToListL( const TDesC& aChannelName, TInt aChannelFreq );
+
+        /**
+         * From MChannelListHandler
+         * Accessory method to channels array
+         */
+         RPointerArray<CFMRadioPreset>& Channels();
+
+        void AutoTuneInMainView ( TBool aTune );
         /**
          * status of the startup wizard state
          * @return wizard status
@@ -300,31 +317,36 @@
          * @return active volume popup
          */
         CAknVolumePopup* ActiveVolumePopup() const;
+        
+        /*
+         * Get current radio state.
+		 * @return TRadioState state of the radio
+         */
+        CFMRadioAppUi::TRadioState CFMRadioAppUi::RadioState() const;
 
     protected:
         /**
         * From CEikAppUi HandleWsEventL
         */
         void HandleWsEventL(const TWsEvent& aEvent,CCoeControl* aDestination);
-        
+
         /**
         * From base class CCoeAppUi    
-    	*/
-    	void HandleForegroundEventL( TBool aForeground );
-    	
+        */
+        void HandleForegroundEventL( TBool aForeground );
+
     private: // Functions from base classes
-
         /**
         * Handles a change to the application's resources
         * @param aType The type of changed resource
         */
         void HandleResourceChangeL( TInt aType );
         /**
-		* Updates the landscape data. This is done separately 
-		* and not in IsLandscapeOrientation method as
-		* IsLandscapeOrientation MUST NOT do a window server flush
-		*/
-		void UpdateLandscapeInformation();
+        * Updates the landscape data. This is done separately 
+        * and not in IsLandscapeOrientation method as
+        * IsLandscapeOrientation MUST NOT do a window server flush
+        */
+        void UpdateLandscapeInformation();
      private: // new functions
 
         /**
@@ -409,14 +431,14 @@
         * @param aErrorNote id of the text to display in the error note
         */
         void DisplayErrorNoteL( TInt aErrorNote );
-        
+
         /**
         * Displays an information note with the text contained in the passed in reference
         * @since 2.6
         * @param aInfoNote id of the text to display in the error note
         */
         void DisplayInformationNoteL( TInt aInfoNote );
-        
+
         /**
         * Return the numeric key value corresponding to the key code
         * @since 2.6
@@ -468,7 +490,7 @@
         * Processes "volume update failed" callback
         * @since 2.6
         */
-        void HandleVolumeUpdateFailedCallback();                
+        void HandleVolumeUpdateFailedCallback();
         /**
         * Handles mute keypress from main view
         * 
@@ -529,15 +551,15 @@
         
         /**
         * Request tuner control from engine
-        */        
+        */
         void RequestTunerControl() const;
-        
+
         /**
         * Is offline profile activated when radio audio was disabled.
         * @return ETrue, if offline profile activated when radio 
-        *         audio was disabled. EFalse otherwise.
+        * audio was disabled. EFalse otherwise.
         */
-        TBool IsOfflineProfileActivatedWhenRadioAudioDisabled() const;        
+        TBool IsOfflineProfileActivatedWhenRadioAudioDisabled() const;
 
         /**
         * Sets the toolbar visibility.
@@ -581,11 +603,9 @@
         *
         * @param aSelfPtr  Pointer to self.
         * @return Always 0.
-        */        
-        static TInt StaticStartupForegroundCallback( TAny* aSelfPtr );     
-        
+        */
+        static TInt StaticStartupForegroundCallback( TAny* aSelfPtr );
     private:
-
         /**
         * Called when volume level should be changed.
         * Set volume control visible.
@@ -593,7 +613,6 @@
         *                       -1 change volume down
         */
         void FMRadioSvkChangeVolumeL( TInt aVolumeChange );
-
         /**
         * Called when volume was changed last time 2 seconds ago or
         * timer was started 2 seconds ago. The remove control timer
@@ -601,45 +620,40 @@
         * or when started through CMmsSvkEvents::StartRemoveTimerL()
         */
         void FMRadioSvkRemoveVolumeL( );
-
         void FMRadioHeadsetEvent(TAccessoryEvent aEvent);
-        
         /**
          * From MFMRadioGlobalConfirmationQueryObserver
          * 
          * @see MFMRadioGlobalConfirmationQueryObserver::GlobalConfirmationQueryDismissedL(TInt aSoftKey)
          */
         void GlobalConfirmationQueryDismissedL( TInt aSoftKey );
-        
         /**
         *From MCoeControlObserver. To handle the volume events.
         */
         void HandleControlEventL( CCoeControl* aControl, TCoeEvent aEventType );
-        
         /**
         * From MInformationNoteInterface. To handle dialog terminated events.
         */
         void DialogTerminated();
-        
         /**
         * Gets the Channels array
         */
         void GetChannelsArrayL();
-		/**
-		* Check available IAD updates
-		*/
-		void HandleIADUpdateCheckL();
-		// from base class MIAUpdateObserver
-    	void CheckUpdatesComplete( TInt aErrorCode, TInt aAvailableUpdates );
-    	void UpdateComplete( TInt aErrorCode, CIAUpdateResult* aResultDetails );
-    	void UpdateQueryComplete( TInt aErrorCode, TBool aUpdateNow );
-        
-    	/**
-    	 * Processes the tail of the command
-    	 * @param aTail The tail to be processed
-    	 */
-    	void ProcessCommandTailL( const TDesC8& aTail );
-    	
+        /**
+        * Check available IAD updates
+        */
+        void HandleIADUpdateCheckL();
+        // from base class MIAUpdateObserver
+        void CheckUpdatesComplete( TInt aErrorCode, TInt aAvailableUpdates );
+        void UpdateComplete( TInt aErrorCode, CIAUpdateResult* aResultDetails );
+        void UpdateQueryComplete( TInt aErrorCode, TBool aUpdateNow );
+
+        /**
+         * Processes the tail of the command
+         * @param aTail The tail to be processed
+         */
+        void ProcessCommandTailL( const TDesC8& aTail );
+
         // from base class CEikAppUi	
         MCoeMessageObserver::TMessageResponse HandleMessageL(
             TUint32 aClientHandleOfTargetWindowGroup, 
@@ -649,14 +663,14 @@
         TBool ProcessCommandParametersL( TApaCommand aCommand, 
                                          TFileName& aDocumentName, 
                                          const TDesC8& aTail );
-	    
+
         /**
         * Check if Active Idle app is on foreground.
         *
         * @return ETrue if idle app is in the foreground, EFalse otherwise.
-        */	
+        */
         TBool IsIdleAppForeground();
-	
+
         /**
         * Check if Active Idle is enabled.
         *
@@ -668,27 +682,8 @@
          * Handles the possibly pending view activation 
          */
         void HandlePendingViewActivationL();
-        
+
     private:
-
-        enum TInterfaceState
-            {
-            EFMRadioStateOff = 0, 			// Radio off
-            EFMRadioStateOffForPhoneCall,	// Radio off because a phone call
-            EFMRadioStateOffBeforePhoneCall,// Radio was off + phone call going on -> no resume
-            EFMRadioStateOn,
-            EFMRadioStateRecording,
-            EFMRadioStateBusyRadioOn,
-            EFMRadioStateBusyRadioOff,
-            EFMRadioStateBusyScanUp,
-            EFMRadioStateBusyScanDown,
-            EFMRadioStateBusySeek,
-            EFMRadioStateBusyMute,
-            EFMRadioStateBusyVolume,
-            EFMRadioStateBusyManualTune,
-            EFMRadioStateBusyScanLocalStations,
-            EFMRadioStateExiting
-            };
             
         /**
          * State to indicate the mute status
@@ -699,14 +694,14 @@
             EFMUnmuted,                 // Unmute state
             EFMMuted                    // Mute state
             };
-        
+
         // System's volume indicator
         CAknVolumePopup* iIhfVolumePopupControl;
         CAknVolumePopup* iHeadsetVolumePopupControl;
         CAknVolumePopup* iActiveVolumePopupControl;
                         
         CRadioEngine*   iRadioEngine;
-        TInt iCurrentRadioState;
+        TRadioState iCurrentRadioState;
         CFMRadioScanLocalStationsView* iScanLocalStationsView;
         CFMRadioChannelListView* iChannelListView;
         CFMRadioMainView* iMainView;
@@ -753,18 +748,18 @@
         
         /**
         * Is the local or global offline query activated.
-    	*/
+        */
         TBool iOfflineQueryDialogActivated;
         
-    	/** 
-    	* Is the start up of application ongoing. 
-    	*/
-    	TBool iStartUp;
+        /** 
+         * Is the start up of application ongoing.
+         */
+        TBool iStartUp;
         
-        /** 
-		* Is the screen orientation landscape 
-		*/
-		TBool iLandscape;
+        /**
+        * Is the screen orientation landscape
+        */
+        TBool iLandscape;
         CAlfEnv* iAlfEnv; // Owned
         // flag to indicate wizard handling
         TBool iStartupWizardHandled;
@@ -773,23 +768,21 @@
         // connect headset query
         CAknQueryDialog* iConnectHeadsetQuery;
         // flag to indicate if automatic tune is activated from startup wizard
-        TBool iTuneFromWizardActivated;    
-       	// akn information note ptr to check that dialog has dismissed from display
-       	TBool iInfoNoteOn;
-       	// global note for headset status when radio is background
-       	CAknGlobalNote* iConnectHeadsetGlobalNote;
-       	// flag for previous mute status 
+        TBool iTuneFromWizardActivated;
+        // akn information note ptr to check that dialog has dismissed from display
+        TBool iInfoNoteOn;
+        // global note for headset status when radio is background
+        CAknGlobalNote* iConnectHeadsetGlobalNote;
+        // flag for previous mute status 
         TFMMuteStatus iMuteStatusBeforeRadioInit;
-       	// Channels list
-       	CArrayFixFlat<TChannelInformation>* iChannels; 	  
-       	// IAD client object. Owned.
-       	CIAUpdate* iUpdate; 	  
-       	// Parameters for IAD update. Owned.
-       	CIAUpdateParameters* iParameters;       	
-       	TBool iAutoTune;
-       	TBool iAutoTuneUnmute;
+        // Channels list
+        RPointerArray<CFMRadioPreset> iChannels;
+        // IAD client object. Owned.
+        CIAUpdate* iUpdate;
+        // Parameters for IAD update. Owned.
+        CIAUpdateParameters* iParameters;
         // The backstepping wrapper. Owned.
-        CFMRadioBackSteppingServiceWrapper* iBsWrapper;       	
+        CFMRadioBackSteppingServiceWrapper* iBsWrapper;
         // Is feature manager initialized, used for uninitializing feature manager
         TBool iFeatureManagerInitialized;
         // own, for active idle setting
--- a/fmradio/fmradio/inc/fmradiochannellistview.h	Fri Mar 12 15:42:47 2010 +0200
+++ b/fmradio/fmradio/inc/fmradiochannellistview.h	Mon Mar 15 12:40:34 2010 +0200
@@ -177,7 +177,7 @@
         void RdsDataProgrammeService( const TDesC& aProgramService );
         void RdsDataPsNameIsStatic( TBool aStatic );
         void RdsDataRadioText( const TDesC& aRadioText );
-        void RdsDataRadioTextPlus( const TInt /*aRTPlusClass*/, const TDesC& /*aRadioText*/ ){};
+        void RdsDataRadioTextPlus( const TInt aRTPlusClass, const TDesC& aRadioText );
         void RdsAfSearchBegin();
         void RdsAfSearchEnd( TUint32 aFrequency, TInt aError );
         void RdsAfSearchStateChange( TBool aEnabled );
--- a/fmradio/fmradio/inc/fmradiodefines.h	Fri Mar 12 15:42:47 2010 +0200
+++ b/fmradio/fmradio/inc/fmradiodefines.h	Mon Mar 15 12:40:34 2010 +0200
@@ -180,6 +180,8 @@
 // Channel list icon index in the icon array
 const TInt KNowPlayingIconIndexChList = 0;
 const TInt KMoveIconIndexChList = 1;
+// RDS text max length
+const TInt KFMRadioWebLinkMaxLength = 64;
 
 #endif
 
--- a/fmradio/fmradio/inc/fmradiopreset.h	Fri Mar 12 15:42:47 2010 +0200
+++ b/fmradio/fmradio/inc/fmradiopreset.h	Mon Mar 15 12:40:34 2010 +0200
@@ -51,7 +51,7 @@
          * Returns preset name 
          * @return name
          */
-        TDesC& PresetName();
+        const TDesC& PresetName();
         /*
          * Set of the preset valid
          * @param aValid ETrue is the name is set valid
@@ -73,6 +73,18 @@
          */
         TInt PresetFrequency();
         
+        /*
+         * set station web url
+         * @param aUrl url to set
+         */
+        void SetPresetUrlL( const TDesC& aUrl );
+        
+        /*
+         * Gets station web url
+         * @return url
+         */
+        const TDesC& PresetUrl();
+        
     private:
         /**
          * C++ default constructor.
@@ -90,6 +102,9 @@
          TInt iStationFrequency;
          // Validity of the station name
          TBool iNameIsValid;
+         // station web url
+         RBuf iStationUrl;
+         
     };
 
 
--- a/fmradio/fmradio/inc/mchannellisthandler.h	Fri Mar 12 15:42:47 2010 +0200
+++ b/fmradio/fmradio/inc/mchannellisthandler.h	Mon Mar 15 12:40:34 2010 +0200
@@ -20,6 +20,8 @@
 
 #define MCHANNELLISTHANDLER_H
 
+#include "fmradiopreset.h"
+
 /**
 *	Operations to main list
 *    @since 2.6
@@ -34,15 +36,6 @@
 	ERemoveAllFromRepository
 	};
 
-/**
-*	Holder for the channel information and channel frequency
-*    @since 2.6
-*/
-struct TChannelInformation
-	{
-	TBuf<32> iChannelInformation;
-	TInt iChannelFrequency;
-	};
 
 /**
 * Interface to update channel list
@@ -60,7 +53,7 @@
 		
 		virtual void AddChannelToListL( const TDesC& aChannelName, TInt aChannelFreq ) = 0;
 		
-		virtual CArrayFixFlat<TChannelInformation>* Channels() = 0;
+		virtual RPointerArray<CFMRadioPreset>& Channels() = 0;
 		
 	};
 
--- a/fmradio/fmradio/src/fmradioalfvisualizer.cpp	Fri Mar 12 15:42:47 2010 +0200
+++ b/fmradio/fmradio/src/fmradioalfvisualizer.cpp	Mon Mar 15 12:40:34 2010 +0200
@@ -537,8 +537,9 @@
     FTRACE( FPrint( _L("CFMRadioAlfVisualizer::HandleGestureL(eventCode=%d)"), eventCode ) );
     
     CFMRadioAppUi* appUi = static_cast<CFMRadioAppUi*>( CCoeEnv::Static()->AppUi() );
-    // handle gestures only if there is no call ongoing
-    if ( !appUi->RadioEngine()->IsInCall() )
+    // handle gestures only if there is no call or tuning ongoing
+    if ( !appUi->RadioEngine()->IsInCall() &&
+            appUi->RadioState() != CFMRadioAppUi::EFMRadioStateBusySeek )
         {
         switch ( eventCode )
             {
@@ -682,7 +683,7 @@
         }
     else
         {
-        FTRACE(FPrint(_L("CFMRadioAlfVisualizer::HandleGestureL() call ongoing -> gestures ignored")));
+        FTRACE(FPrint(_L("CFMRadioAlfVisualizer::HandleGestureL() call or tuning ongoing -> gestures ignored")));
         }
     }
 // ----------------------------------------------------------------------------
@@ -724,7 +725,7 @@
         }
     if ( aEvent.IsPointerEvent() )
         {
-        CGestureControl::OfferEventL( aEvent );
+        return CGestureControl::OfferEventL( aEvent );
         }
     return EFalse;
     }
--- a/fmradio/fmradio/src/fmradioappui.cpp	Fri Mar 12 15:42:47 2010 +0200
+++ b/fmradio/fmradio/src/fmradioappui.cpp	Mon Mar 15 12:40:34 2010 +0200
@@ -73,26 +73,37 @@
 // CFMInformationNote::CFMInformationNote
 // ---------------------------------------------------------------------------------
 CFMInformationNote::CFMInformationNote( MInformationNoteInterface& aObserver ) :
-	CAknInformationNote ( EFalse ),
-	iDialogObserver( aObserver )
-	{
-	
-	}
-
-
+    CAknInformationNote ( EFalse ),
+    iDialogObserver( aObserver )
+    {
+    
+    }
 // ---------------------------------------------------------------------------------
 // CFMInformationNote::~CFMInformationNote
 // ---------------------------------------------------------------------------------
 //
 CFMInformationNote::~CFMInformationNote()
-	{
-	iDialogObserver.DialogTerminated();
-	}
+    {
+    iDialogObserver.DialogTerminated();
+    }
+// ================= MEMBER FUNCTIONS =======================
 
-
+// ---------------------------------------------------------------------------------
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// ---------------------------------------------------------------------------------
+//
+CFMRadioAppUi::CFMRadioAppUi() :
+    iStartUp( ETrue ),
+    iStartupWizardHandled( EFalse ),
+    iStartupWizardRunning( EFalse ),
+    iTuneFromWizardActivated( EFalse ),
+    iInfoNoteOn( EFalse ),
+    iPendingViewId( KNullUid ),
+    iRegionChanged( EFalse )
+    {
+    }
 
-// ================= MEMBER FUNCTIONS =======================
-//
 // ---------------------------------------------------------------------------------
 // CFMRadioAppUi::ConstructL
 // 2nd phase constructor. Instanciates all member objects
@@ -102,22 +113,11 @@
     {
     FTRACE( FPrint( _L("CFMRadioAppUi::ConstructL()") ) );
     
-    iPendingViewId = TUid::Null();
-    iStartUp = ETrue;
-    iStartupWizardHandled = EFalse;
-    iStartupWizardRunning = EFalse;
-    iTuneFromWizardActivated = EFalse;
-    iInfoNoteOn = EFalse;
-    iAutoTune = EFalse;
-    iAutoTuneUnmute = EFalse;
-    iRegionChanged = EFalse;
-
-   	BaseConstructL( EAknEnableSkin | EAknEnableMSK | EAknSingleClickCompatible );
+    BaseConstructL( EAknEnableSkin | EAknEnableMSK | EAknSingleClickCompatible );
+    
     FeatureManager::InitializeLibL();
     iFeatureManagerInitialized = ETrue;
 
-    iChannels = new( ELeave ) CArrayFixFlat<TChannelInformation>( 1 );
-    
     // initialise local variation key with all features disabled.
     iFMRadioVariationFlags = 0;
     iAudioResourceAvailable = ETrue;
@@ -154,9 +154,9 @@
     {
     FTRACE( FPrint( _L("CFMRadioAppUi::SecondaryConstructL()") ) );
     
-	iLayoutChangeObserver = iMainView;
+    iLayoutChangeObserver = iMainView;
 
-    iRadioEngine->PubSubL().PublishPresetCountL( iChannels->Count() );
+    iRadioEngine->PubSubL().PublishPresetCountL( iChannels.Count() );
     
     // Create vertical volume popup for speaker and headset
     iIhfVolumePopupControl = CAknVolumePopup::NewL( NULL, ETrue );
@@ -179,22 +179,22 @@
     // For monitoring side volume key events
     iSvkEvents = CFMRadioSvkEvents::NewL(*this);
 
-	iRadioEngine->PubSubL().PublishApplicationRunningStateL( EFMRadioPSApplicationRunning );
-	
-	UpdateLandscapeInformation();	
-	
-	// Create alfred environment
+    iRadioEngine->PubSubL().PublishApplicationRunningStateL( EFMRadioPSApplicationRunning );
+
+    UpdateLandscapeInformation();	
+
+    // Create alfred environment
     iAlfEnv = CAlfEnv::NewL();
-	
-	// Create alfred display
-	TRect rect;
-	AknLayoutUtils::LayoutMetricsRect(AknLayoutUtils::EMainPane, rect);	
-	if( !IsLandscapeOrientation() )
-		{
-		TRect toolBarRect = iMainView->Toolbar()->Rect();
-		rect.SetHeight( rect.Height() - toolBarRect.Height() );	
-		}
-	iAlfEnv->NewDisplayL( rect, CAlfEnv::ENewDisplayAsCoeControl );
+
+    // Create alfred display
+    TRect rect;
+    AknLayoutUtils::LayoutMetricsRect(AknLayoutUtils::EMainPane, rect);	
+    if( !IsLandscapeOrientation() )
+        {
+        TRect toolBarRect = iMainView->Toolbar()->Rect();
+        rect.SetHeight( rect.Height() - toolBarRect.Height() );	
+        }
+    iAlfEnv->NewDisplayL( rect, CAlfEnv::ENewDisplayAsCoeControl );
     }
 
 // ---------------------------------------------------------------------------
@@ -203,7 +203,7 @@
 // ---------------------------------------------------------------------------
 //
 void CFMRadioAppUi::HandleTunerReadyCallback()
-    {        
+    {
     iRadioEngine->InitializeRadio();
     }
 
@@ -258,53 +258,46 @@
         {
         delete iSvkEvents;
         }
-    
     if (iGlobalOfflineQuery)
         {
         delete iGlobalOfflineQuery;
         }
-    
     if (iLocalActivateOfflineQuery)
         {
         delete iLocalActivateOfflineQuery;
         }
-    
     if (iLocalContinueOfflineQuery)
         {
         delete iLocalContinueOfflineQuery;
         }
-    
     delete iControlEventObserver;
     delete iAlfEnv;
     
     iAlreadyClean = ETrue;
     
-    if ( iConnectHeadsetGlobalNote )    
-    	{
-    	delete iConnectHeadsetGlobalNote;
-    	iConnectHeadsetGlobalNote = NULL;
-    	}
-    	
-	if ( iConnectHeadsetQuery )
-    	{
-    	delete iConnectHeadsetQuery;
-    	iConnectHeadsetQuery = NULL;	
-    	}   
-	if ( iChannels )
-		{
-		iChannels->Reset();
-		delete iChannels;
-		iChannels = NULL;
-		}
-	if ( iUpdate )
-		{
-		delete iUpdate;
-		iUpdate = NULL;		
-		}
-	if ( iParameters )
-		{
-		delete iParameters;		
-		iParameters = NULL;
+    if ( iConnectHeadsetGlobalNote )
+        {
+        delete iConnectHeadsetGlobalNote;
+        iConnectHeadsetGlobalNote = NULL;
+        }
+    if ( iConnectHeadsetQuery )
+        {
+        delete iConnectHeadsetQuery;
+        iConnectHeadsetQuery = NULL;
+        }
+
+     iChannels.ResetAndDestroy();
+     iChannels.Close();
+        
+    if ( iUpdate )
+        {
+        delete iUpdate;
+        iUpdate = NULL;
+        }
+    if ( iParameters )
+        {
+        delete iParameters;
+        iParameters = NULL;
         }
     if ( iSettingsRepository )
         {
@@ -346,21 +339,20 @@
                 ScanDownL();
                 break;
             case EFMRadioCmdSaveChannel:
-            	SaveChannelToLastIntoListL();
+                SaveChannelToLastIntoListL();
                 break;
             case EFMRadioCmdScanLocalStations:
-            	ActivateLocalViewL(iScanLocalStationsView->Id());
-            	break;
+                ActivateLocalViewL( iScanLocalStationsView->Id() );
+                break;
             case EFMRadioCmdScanLocalStationsScan:
-            	// continue scanning
-            	StartLocalStationsSeekL();
-        		break;
+                // continue scanning
+                StartLocalStationsSeekL();
+                break;
             case EFMRadioCmdListenCh:
-            	
-            	if ( iChannels->Count() > 0 )
-            		{
-                	PlayChannel( iChannelListView->CurrentlySelectedChannel() );
-            		}
+                if ( iChannels.Count() > 0 )
+                    {
+                    PlayChannel( iChannelListView->CurrentlySelectedChannel() );
+                    }
                 break;
             case EFMRadioCmdRename:
                 RenameCurrentChannelL();
@@ -372,22 +364,22 @@
                 SetAudioOutput( CRadioEngine::EFMRadioOutputHeadset );
                 break;
             case EFMRadioCmdEnableRdsAfSearch:
-        		iRadioEngine->SetRdsAfSearchEnable( ETrue );
-            	break;
+                iRadioEngine->SetRdsAfSearchEnable( ETrue );
+                break;
             case EFMRadioCmdDisableRdsAfSearch:
-        		iRadioEngine->SetRdsAfSearchEnable( EFalse );
+                iRadioEngine->SetRdsAfSearchEnable( EFalse );
                 break;
             case EFMRadioCmdUpdateVolume:
                 UpdateVolume( EDirectionNone );
                 break;
             case EFMRadioCmdNextChannel:
                 {
-                TInt channelCount = iChannels->Count();
+                TInt channelCount = iChannels.Count();
                 if ( channelCount >= 1 )
-					{
-            		iMainView->SetStationChangeType( EFMRadioStationChangeNext );
-	            	PlayChannel( iChannelListView->NextChannel() );
-					}
+                    {
+                    iMainView->SetStationChangeType( EFMRadioStationChangeNext );
+                    PlayChannel( iChannelListView->NextChannel() );
+                    }
                 else
                     {
                     if ( AknLayoutUtils::PenEnabled() )
@@ -399,12 +391,12 @@
                 }
             case EFMRadioCmdPrevChannel:
                 {
-                TInt channelCount = iChannels->Count();
+                TInt channelCount = iChannels.Count();
                 if ( channelCount >= 1 )
-					{
-            		iMainView->SetStationChangeType( EFMRadioStationChangePrevious );
-	                PlayChannel( iChannelListView->PreviousChannel() );
-					}
+                    {
+                    iMainView->SetStationChangeType( EFMRadioStationChangePrevious );
+                    PlayChannel( iChannelListView->PreviousChannel() );
+                    }
                 else
                     {
                     if ( AknLayoutUtils::PenEnabled() )
@@ -428,42 +420,31 @@
                 {
 #if defined __SERIES60_HELP || defined FF_S60_HELPS_IN_USE
                 if ( ActiveView() == KFMRadioMainViewId )
-                	{	
-                	HlpLauncher::LaunchHelpApplicationL( iCoeEnv->WsSession(), GetCurrentHelpContextL() );
-                	}
+                    {
+                    HlpLauncher::LaunchHelpApplicationL( iCoeEnv->WsSession(), GetCurrentHelpContextL() );
+                    }
                 else
-                	{
+                    {
                     CArrayFix<TCoeHelpContext>* buf = CCoeAppUi::AppHelpContextL();
                     HlpLauncher::LaunchHelpApplicationL( iCoeEnv->WsSession(), buf );
-                	}
+                    }
 #endif
                 }
                 break;
             case EFMRadioCmdScanLocalStationsViewActive:
-            	iLayoutChangeObserver = iScanLocalStationsView;
-            	break;
+                iLayoutChangeObserver = iScanLocalStationsView;
+                break;
             case EFMRadioCmdChannelListViewActive:
                 iLayoutChangeObserver = iChannelListView;
                 break;
             case EFMRadioCmdMainViewActive:
                 iLayoutChangeObserver = iMainView;
-            if ( iAutoTune &&
-               ( iScanLocalStationsView->CancelType() == EFMRadioCancelScanBySoftkey ||
-                 iScanLocalStationsView->CancelType() == EFMRadioCancelScanDefault))
-           		{
-            	ScanUpL();
-            	iAutoTune = EFalse;
-            	iAutoTuneUnmute = ETrue;
-            	}
                 break;
-
             default:
                 break;
             }
         }
-    else if( iCurrentRadioState == EFMRadioStateBusyScanUp ||
-             iCurrentRadioState == EFMRadioStateBusyScanDown ||
-             iCurrentRadioState == EFMRadioStateBusySeek ||
+    else if ( iCurrentRadioState == EFMRadioStateBusySeek ||
              iCurrentRadioState == EFMRadioStateBusyScanLocalStations )
         {
         switch ( aCommand )
@@ -502,9 +483,9 @@
 // ---------------------------------------------------------------------------
 //
 CRadioEngine* CFMRadioAppUi::RadioEngine()
-	{
-	return iRadioEngine;
-	}
+    {
+    return iRadioEngine;
+    }
 
 // ---------------------------------------------------------------------------
 // CFMRadioAppUi::Document
@@ -548,11 +529,11 @@
                 iMuteStatusBeforeRadioInit = EFMUnmuted;
                 }
             }
-	    iCurrentRadioState = EFMRadioStateBusyRadioOn;
-	    // use mute here so we have no audio until tune event
-	    iRadioEngine->SetMuteOn( ETrue );
-	    iRadioEngine->RadioOn();
-    	}
+        iCurrentRadioState = EFMRadioStateBusyRadioOn;
+        // use mute here so we have no audio until tune event
+        iRadioEngine->SetMuteOn( ETrue );
+        iRadioEngine->RadioOn();
+        }
     }
 
 // ---------------------------------------------------------------------------
@@ -614,7 +595,7 @@
         channelIndex = iRadioEngine->GetPresetIndex();
         }
     // Display the text query
-    CRadioEngine::TStationName channelName = iChannels->At(channelIndex).iChannelInformation;
+    CRadioEngine::TStationName channelName = iChannels[ channelIndex ]->PresetName();
    
     CAknTextQueryDialog* dlg = new (ELeave) CAknTextQueryDialog( channelName, CAknQueryDialog::ENoTone );
     
@@ -622,12 +603,11 @@
         {
         FTRACE(FPrint(_L("CFMRadioAppUi::RenameCurrentChannelL()")));
         
-        iChannels->At(channelIndex).iChannelInformation = channelName;
+        iChannels[channelIndex]->SetPresetNameL( channelName );
         
-                
         iChannelListView->UpdateChannelListContentL( channelIndex,
-        				iChannels->At(channelIndex).iChannelInformation,
-        				iChannels->At(channelIndex).iChannelFrequency );
+                        iChannels[ channelIndex ]->PresetName(),
+                        iChannels[ channelIndex ]->PresetFrequency() );
         
         UpdateChannelsL( EStoreIndexToRepository, channelIndex, 0 );
         
@@ -650,7 +630,7 @@
 void CFMRadioAppUi::SaveChannelToLastIntoListL()
     {
     FTRACE( FPrint( _L("CFMRadioAppUi::SaveChannelToLastIntoListL()") ) );
-    SaveChannelL( iChannels->Count() + 1 );   
+    SaveChannelL( iChannels.Count() + 1 );
     }
 
 // ---------------------------------------------------------------------------
@@ -688,7 +668,7 @@
         UpdateChannelsL( EStoreAllToRepository, 0, 0 );
         
         iMainView->SetStationChangeType( EFMRadioStationChangeNone );
-        PlayChannel( iChannels->Count() - 1 );
+        PlayChannel( iChannels.Count() - 1 );
         }
     }
 
@@ -707,16 +687,16 @@
     RBuf channelData;
     channelData.CleanupClosePushL();
     
-    if ( iChannels->At( aIndex ).iChannelInformation.Length() )
+    if ( iChannels[ aIndex ]->PresetName().Length() )
         {
         stringResourceId = R_QTN_FMRADIO_QUERY_DELETE;
-        channelData.CreateL( iChannels->At( aIndex ).iChannelInformation );
+        channelData.CreateL( iChannels[ aIndex ]->PresetName() );
         }
     else
         {
         stringResourceId = R_QTN_FMRADIO_QUERY_DELETE_MHZ;
         TInt maxDecimalPlaces = iRadioEngine->DecimalCount();
-        TInt channelfreq = iChannels->At( aIndex ).iChannelFrequency;
+        TInt channelfreq = iChannels[ aIndex ]->PresetFrequency();
         TReal realFrequency = static_cast<TReal>( channelfreq / static_cast<TReal>( KHzConversionFactor ));
         
         channelData.CreateL( KFrequencyMaxLength );
@@ -725,7 +705,6 @@
         channelData.Num( realFrequency, format );
         AknTextUtils::LanguageSpecificNumberConversion( channelData );
         }
-    
     // Excecute a confirmation query with string and query resource id
     HBufC* prompt = StringLoader::LoadLC( stringResourceId, channelData, iCoeEnv );
     CAknQueryDialog* queryDlg = CAknQueryDialog::NewL();
@@ -745,8 +724,8 @@
     FTRACE( FPrint( _L("CFMRadioAppUi::ScanUpL()") ) );
     // Frequency is always 0 when asking engine for automatical tuning. Frequency
     // parameter is then ignored by engine when automatical tuning (seek) is requested.
-    iCurrentRadioState = EFMRadioStateBusyScanUp;
-    
+    iCurrentRadioState = EFMRadioStateBusySeek;
+
     if ( iMainView->IsForeground() )
         {
         iMainView->SetStationChangeType( EFMRadioStationChangeScanUp );
@@ -765,7 +744,7 @@
     FTRACE( FPrint( _L("CFMRadioAppUi::ScanDownL()") ) );
     // Frequency is always 0 when asking engine for automatical tuning. Frequency
     // parameter is then ignored by engine when automatical tuning (seek) is requested.
-    iCurrentRadioState = EFMRadioStateBusyScanDown;
+    iCurrentRadioState = EFMRadioStateBusySeek;
     
     if ( iMainView->IsForeground() )
         {
@@ -786,12 +765,10 @@
     // Frequency is always 0 when asking engine for automatical tuning. Frequency
     // parameter is then ignored by engine when automatical tuning (seek) is requested.
     iCurrentRadioState = EFMRadioStateBusySeek;
-
     if (iMainView->IsForeground())
-    	{
-    	iMainView->SeekL(); // Show seek wait note
-    	}
-        
+        {
+        iMainView->SeekL(); // Show seek wait note
+        }
     iRadioEngine->Tune(aFrequency);
     }
 
@@ -803,11 +780,11 @@
 void CFMRadioAppUi::UpdateVolume( CFMRadioAppUi::TFMRadioDirections aDirection )
     {
     FTRACE( FPrint( _L("CFMRadioAppUi::UpdateVolume(%d)"), UpdateVolume ) );
-    
+
     if ( !iRadioEngine->IsInCall() )
         {
         TInt volumeControlLevel = iRadioEngine->GetVolume();
-    
+
         TInt newVol = 0;
         if ( aDirection == EDirectionDown )
             {
@@ -870,8 +847,7 @@
 void CFMRadioAppUi::CancelSeek()
     {
     FTRACE( FPrint( _L("CFMRadioAppUi::CancelSeek()") ) );
-    if( iCurrentRadioState == EFMRadioStateBusyScanUp ||
-            iCurrentRadioState == EFMRadioStateBusyScanDown )
+    if ( iCurrentRadioState == EFMRadioStateBusySeek )
         {
         iRadioEngine->CancelScan(); // Seek request to engine
         }
@@ -944,12 +920,12 @@
 // ---------------------------------------------------------------------------
 //
 void CFMRadioAppUi::HandleForegroundEventL( TBool aForeground )
-	{
-	FTRACE( FPrint( _L("CFMRadioAppUi::HandleForegroundEventL(%d)"), aForeground ) );
-	CAknViewAppUi::HandleForegroundEventL( aForeground );
-	
-	if ( aForeground )
-		{
+    {
+    FTRACE( FPrint( _L("CFMRadioAppUi::HandleForegroundEventL(%d)"), aForeground ) );
+    CAknViewAppUi::HandleForegroundEventL( aForeground );
+    
+    if ( aForeground )
+        {
         if ( iStartUp )
             {
             iStartUp = EFalse;
@@ -960,58 +936,58 @@
             iStartupForegroundCallback->CallBack();
             }
         else
-        	{
-        	// Restores all resources that were released with a call to Release().
-    		// After this the Hitchcock user interface should be in the same state
-     		// in terms of resources as it was prior to the Release() call.
-        	//iAlfEnv->RestoreL();
-        	
-        	// Check if offline profile is activated after/when playing e.g. music player.
-			// In that case we didn't show the offline query as global, so we need
-			// to show it now.
-			if ( IsOfflineProfileActivatedWhenRadioAudioDisabled() )
-				{
-				// Do not re-show the offline query if user hasn't yet answered to it.
-				if ( !iShowingLocalOfflineContinueQuery )
-					{
-					iRadioEngine->RadioOff();
-					TInt res(0);
-					iShowingLocalOfflineContinueQuery = ETrue;
-																					
-					iOfflineQueryDialogActivated = ETrue;
-					
-					if ( !iLocalContinueOfflineQuery )
-						{
-						iLocalContinueOfflineQuery = CAknQueryDialog::NewL();
-						}
-								        
-					res = iLocalContinueOfflineQuery->ExecuteLD( R_FMRADIO_CONTINUE_IN_OFFLINE_QUERY );
-					
-					iLocalContinueOfflineQuery = NULL;
-					iOfflineQueryDialogActivated = EFalse;
-				  	iShowingLocalOfflineContinueQuery = EFalse;
-															
-					if ( res )
-						{
-						iOfflineProfileActivatedWhenRadioAudioDisabled = EFalse;
-						iRadioEngine->RadioOn();
-						HandlePendingViewActivationL();
-						}
-					else
-						{
-						Exit();
-						}
-					}
-				}
-			TryToResumeAudioL();
-	        }  
-		}
-	else 
-		{
-		// Releases as many resources of the Hitchcock as possible. 
-		//iAlfEnv->Release( ETrue );
-		}
-	}
+            {
+            // Restores all resources that were released with a call to Release().
+            // After this the Hitchcock user interface should be in the same state
+            // in terms of resources as it was prior to the Release() call.
+            //iAlfEnv->RestoreL();
+            
+            // Check if offline profile is activated after/when playing e.g. music player.
+            // In that case we didn't show the offline query as global, so we need
+            // to show it now.
+            if ( IsOfflineProfileActivatedWhenRadioAudioDisabled() )
+                {
+                // Do not re-show the offline query if user hasn't yet answered to it.
+                if ( !iShowingLocalOfflineContinueQuery )
+                    {
+                    iRadioEngine->RadioOff();
+                    TInt res(0);
+                    iShowingLocalOfflineContinueQuery = ETrue;
+                                                                                    
+                    iOfflineQueryDialogActivated = ETrue;
+                    
+                    if ( !iLocalContinueOfflineQuery )
+                        {
+                        iLocalContinueOfflineQuery = CAknQueryDialog::NewL();
+                        }
+                                        
+                    res = iLocalContinueOfflineQuery->ExecuteLD( R_FMRADIO_CONTINUE_IN_OFFLINE_QUERY );
+                    
+                    iLocalContinueOfflineQuery = NULL;
+                    iOfflineQueryDialogActivated = EFalse;
+                    iShowingLocalOfflineContinueQuery = EFalse;
+                                                            
+                    if ( res )
+                        {
+                        iOfflineProfileActivatedWhenRadioAudioDisabled = EFalse;
+                        iRadioEngine->RadioOn();
+                        HandlePendingViewActivationL();
+                        }
+                    else
+                        {
+                        Exit();
+                        }
+                    }
+                }
+            TryToResumeAudioL();
+            }  
+        }
+    else 
+        {
+        // Releases as many resources of the Hitchcock as possible. 
+        //iAlfEnv->Release( ETrue );
+        }
+    }
 
 // ---------------------------------------------------------------------------
 // CFMRadioAppUi::HandleRadioEngineCallBack
@@ -1030,63 +1006,64 @@
         switch ( aEventCode )
             {
             case EFMRadioEventTunerReady:
-            	HandleTunerReadyCallback();
+                HandleTunerReadyCallback();
                 break;
             case EFMRadioEventRadioOn:
-            	iCurrentRadioState = EFMRadioStateOn;
-            	TRAPD( err, HandleStartupWizardL() );   
-            	iStartupWizardHandled = ETrue;//FirstRadioInitCall = EFalse;
-            	if ( iAutoTune && 
-                     iScanLocalStationsView->CancelType() == EFMRadioCancelScanByHeadsetDisconnect)
-        			{
-                    TRAP_IGNORE( ScanUpL() );
-                    iAutoTune = EFalse;
-                    iAutoTuneUnmute = ETrue;
-        			}
-        		else if( !IsStartupWizardRunning() || err != KErrNone )
-            		{
-            	 	//we use method because the behaviour we require is the same.
-            	 	if ( !iTuneFromWizardActivated && iMuteStatusBeforeRadioInit != EFMUninitialized )
-            	 		{
+                {
+                iCurrentRadioState = EFMRadioStateOn;
+                TRAPD( err, HandleStartupWizardL() );
+                iStartupWizardHandled = ETrue;
+                const TUid activeViewTuid = ActiveView();
+                
+                if ( activeViewTuid == KFMRadioChannelListViewId )
+                    {
+                    CAknToolbar* toolbar = iChannelListView->Toolbar();
+                    if ( toolbar )
+                        {
+                        iChannelListView->UpdateToolbar();
+                        toolbar->DrawDeferred();
+                        }
+                    }
+                if( !IsStartupWizardRunning() || err != KErrNone )
+                    {
+                    //we use method because the behaviour we require is the same.
+                    if ( !iTuneFromWizardActivated && iMuteStatusBeforeRadioInit != EFMUninitialized )
+                        {
                         TBool mute = EFalse; 
                         if ( iMuteStatusBeforeRadioInit == EFMMuted )
                             {
                             mute = ETrue;
                             }
                         iRadioEngine->SetMuteOn( mute );
-                        iMuteStatusBeforeRadioInit = EFMUninitialized;            	 		
-            	 		}
-            		HandleStopSeekCallback(); 
-            		}
+                        iMuteStatusBeforeRadioInit = EFMUninitialized;
+                        }
+                    HandleStopSeekCallback(); 
+                    }
+                }
                 break;
             case EFMRadioEventRadioOff:
-            	iCurrentRadioState = EFMRadioStateOff;
+                iCurrentRadioState = EFMRadioStateOff;
                 
-            	if ( !iOfflineQueryDialogActivated )
-                	{
-                	ExitApplication();
-                	}
+                if ( !iOfflineQueryDialogActivated )
+                    {
+                    ExitApplication();
+                    }
                 
-            	break;
+                break;
             case EFMRadioEventFMRadioInitialized:
-            	TRAP( err, HandleInitializedCallbackL() );
+                TRAP( err, HandleInitializedCallbackL() );
                 break;
             case EFMRadioEventTune:
-            	if ( iTuneFromWizardActivated )
-        	 		{
-        	 		iTuneFromWizardActivated = EFalse;
-        	 		iRadioEngine->SetMuteOn( EFalse );
-        	 		iMuteStatusBeforeRadioInit = EFMUninitialized;
-        	 		}
-            	if( iAutoTuneUnmute )
-            		{
-        	 		iRadioEngine->SetMuteOn( EFalse );
-        	 		iAutoTuneUnmute = EFalse;
-            		}
-            	if ( IsStartupWizardHandled() )
-            		{
-            		HandleStopSeekCallback();            		                	
-            		}
+                if ( iTuneFromWizardActivated )
+                    {
+                    iTuneFromWizardActivated = EFalse;
+                    iRadioEngine->SetMuteOn( EFalse );
+                    iMuteStatusBeforeRadioInit = EFMUninitialized;
+                    }
+                if ( IsStartupWizardHandled() )
+                    {
+                    HandleStopSeekCallback();
+                    }
                 break;
             case EFMRadioEventSetMuteState:
                 HandleSetMuteStateCallback();
@@ -1118,33 +1095,35 @@
                 TRAP( err, HandleAudioResourceAvailableL() );
                 break;
             case EFMRadioEventCallStarted:
-            	if ( iCurrentRadioState != EFMRadioStateOff && 
-            		 iCurrentRadioState != EFMRadioStateOffBeforePhoneCall )
-            		{
-            		iCurrentRadioState = EFMRadioStateOffForPhoneCall;
-            		}
-            	else
-            		{
-            		iCurrentRadioState = EFMRadioStateOffBeforePhoneCall;
-            		}
+                if ( iCurrentRadioState != EFMRadioStateOff && 
+                     iCurrentRadioState != EFMRadioStateOffBeforePhoneCall )
+                    {
+                    iCurrentRadioState = EFMRadioStateOffForPhoneCall;
+                    }
+                else
+                    {
+                    iCurrentRadioState = EFMRadioStateOffBeforePhoneCall;
+                    }
                 FadeViewsAndShowExit( ETrue );
                 break;
             case EFMRadioEventCallEnded:
-                FadeViewsAndShowExit( EFalse );
-            	if ( iAudioLost )
-            		{
-            		TRAP_IGNORE( TryToResumeAudioL() );
+                {
+                if ( iAudioLost )
+                    {
+                    TRAP_IGNORE( TryToResumeAudioL() );
                     iCurrentRadioState = EFMRadioStateOff;
-            		}
-            	else if ( iCurrentRadioState == EFMRadioStateOffForPhoneCall )
-            		{
-            		TurnRadioOn();
-            		}
-            	else
-            		{
-            		// Do nothing.
-            		}
+                    }
+                else if ( iCurrentRadioState == EFMRadioStateOffForPhoneCall )
+                    {
+                    TurnRadioOn();
+                    }
+                else
+                    {
+                    // Do nothing.
+                    }
+                FadeViewsAndShowExit( EFalse );
                 break;
+                }
             case EFMRadioEventStandbyMode:
                 ExitApplication();
                 break;
@@ -1161,11 +1140,11 @@
                 HandleFreqRangeChangedCallback();
                 break;
             case EFMRadioEventScanLocalStationsCanceled:
-            	{
-            	HandleStopSeekCallback();
-            	SetStartupWizardRunning( EFalse );
-            	break;	
-            	}
+                {
+                HandleStopSeekCallback();
+                SetStartupWizardRunning( EFalse );
+                break;	
+                }
             default:
                 break;
             }
@@ -1180,43 +1159,42 @@
                 break;
             case EFMRadioEventAudioResourcePaused:
                 TRAP( err, HandleAudioResourceNotAvailableL( aErrorCode ) );
-                break;                
+                break;
             case EFMRadioEventTune:
-            	if ( iTuneFromWizardActivated )
-        	 		{
-        	 		iTuneFromWizardActivated = EFalse;
-        	 		iRadioEngine->SetMuteOn( EFalse );
-					iMuteStatusBeforeRadioInit = EFMUninitialized;
-        	 		}
+                if ( iTuneFromWizardActivated )
+                    {
+                    iTuneFromWizardActivated = EFalse;
+                    iRadioEngine->SetMuteOn( EFalse );
+                    iMuteStatusBeforeRadioInit = EFMUninitialized;
+                    }
 
-        	 	if ( aErrorCode == KFmRadioErrAntennaNotConnected )
-        	 	    {
-        	 		iScanLocalStationsView->SetScanCanceled(EFMRadioCancelScanByHeadsetDisconnect);
-        	 	    }
+                if ( aErrorCode == KFmRadioErrAntennaNotConnected )
+                    {
+                    iScanLocalStationsView->SetScanCanceled(EFMRadioCancelScanByHeadsetDisconnect);
+                    }
 
                 HandleStopSeekCallback();
                 break;
             case EFMRadioEventCallStarted:
-            	{
-            	FTRACE( FPrint( _L("CFMRadioAppUi::HandleRadioEngineCallBack() error -> EFMRadioEventCallStarted  ") ) );            		            	
-	        	if ( iCurrentRadioState != EFMRadioStateOff && 
-	        		 iCurrentRadioState != EFMRadioStateOffBeforePhoneCall )
-	        		{
-	        		iCurrentRadioState = EFMRadioStateOffForPhoneCall;
-	        		}
-	        	else
-	        		{
-	        		iCurrentRadioState = EFMRadioStateOffBeforePhoneCall;
-	        		}
-	            FadeViewsAndShowExit( ETrue );
-	            break;
-            	}                
+                {
+                FTRACE( FPrint( _L("CFMRadioAppUi::HandleRadioEngineCallBack() error -> EFMRadioEventCallStarted  ") ) );            		            	
+                if ( iCurrentRadioState != EFMRadioStateOff && 
+                     iCurrentRadioState != EFMRadioStateOffBeforePhoneCall )
+                    {
+                    iCurrentRadioState = EFMRadioStateOffForPhoneCall;
+                    }
+                else
+                    {
+                    iCurrentRadioState = EFMRadioStateOffBeforePhoneCall;
+                    }
+                FadeViewsAndShowExit( ETrue );
+                break;
+                }
             default:
                 FTRACE( FPrint( _L("CFMRadioAppUi::HandleRadioEngineCallBack() failed to process event.") ) );
                 break;
             }
         }
-
     FTRACE( FPrint( _L("END CFMRadioAppUi::HandleRadioEngineCallBack()") ) );
     }
 
@@ -1235,7 +1213,7 @@
         iActiveVolumePopupControl->SetValue( newVolume );
         }
     else
-        {        
+        {
         iActiveVolumePopupControl->SetValue( KFMRadioMinVolumeLevel );	
         }
     }
@@ -1271,12 +1249,12 @@
 //
 
 void CFMRadioAppUi::FadeViewsAndShowExit( TBool aState )
-	{
-	FTRACE( FPrint( _L("CFMRadioAppUi::FadeViewsAndShowExit( Tbool %d )"), aState ) );
-    iMainView->FadeAndShowExit( aState );        
+    {
+    FTRACE( FPrint( _L("CFMRadioAppUi::FadeViewsAndShowExit( Tbool %d )"), aState ) );
+    iMainView->FadeAndShowExit( aState );
     iChannelListView->FadeAndShowExit( aState );
     iScanLocalStationsView->FadeAndShowExit( aState );
-	}
+    }
 
 // ---------------------------------------------------------------------------
 // CFMRadioAppUi::HandleAudioResourceAvailableL
@@ -1286,7 +1264,7 @@
 void CFMRadioAppUi::HandleAudioResourceAvailableL()
     {
     FTRACE( FPrint( _L("CFMRadioAppUi::HandleAudioResourceAvailableL") ) );
-    
+
     iAudioResourceAvailable = ETrue;
 
     if ( !IsOfflineProfileActivatedWhenRadioAudioDisabled() &&
@@ -1317,11 +1295,11 @@
     FTRACE( FPrint( _L("CFMRadioAppUi::HandleAudioResourceNotAvailableL()  error code: %d"),
     aError ) );
 
-	SetStartupWizardRunning( EFalse );
+    SetStartupWizardRunning( EFalse );
     iAudioResourceAvailable = EFalse;
     
     if ( iCurrentRadioState != EFMRadioStateOffForPhoneCall &&
-    	 iCurrentRadioState != EFMRadioStateOffBeforePhoneCall )
+            iCurrentRadioState != EFMRadioStateOffBeforePhoneCall )
         {
         iCurrentRadioState = EFMRadioStateOff;
         }
@@ -1346,7 +1324,6 @@
         iCurrentRadioState = EFMRadioStateOff;
         TRAP_IGNORE( ShowConnectHeadsetDialogL() );
         }
-
     }
 
 // ---------------------------------------------------------------------------
@@ -1358,28 +1335,28 @@
     {
     FTRACE( FPrint( _L("CFMRadioAppUi::HandleHeadsetReconnectedCallback()") ) );
     if ( iConnectHeadsetQuery )
-    	{
-    	delete iConnectHeadsetQuery;
-    	iConnectHeadsetQuery = NULL;	
-    	}
+        {
+        delete iConnectHeadsetQuery;
+        iConnectHeadsetQuery = NULL;	
+        }
     
-   	//compare bitmask to see if feature supported
-   	if ( !(iFMRadioVariationFlags & KFMRadioInternalAntennaSupported) &&
-   			iCurrentRadioState != EFMRadioStateOffForPhoneCall && 
-   			iCurrentRadioState != EFMRadioStateOffBeforePhoneCall )
-   		{
-   		// active offline query controls radio on/off
-   		if ( iAudioLost )
+    //compare bitmask to see if feature supported
+    if ( !(iFMRadioVariationFlags & KFMRadioInternalAntennaSupported) &&
+            iCurrentRadioState != EFMRadioStateOffForPhoneCall && 
+            iCurrentRadioState != EFMRadioStateOffBeforePhoneCall )
+        {
+        // active offline query controls radio on/off
+        if ( iAudioLost )
             {
             TRAP_IGNORE( TryToResumeAudioL() );	
             }
-   		else if ( ( iGlobalOfflineQuery && !iGlobalOfflineQuery->IsActive() ) ||
-   			  !iGlobalOfflineQuery )
-   			{
-   			iRadioEngine->InitializeRadio();		
-   			}
-   		HandleVolumeChangedCallback();
-   		}
+        else if ( ( iGlobalOfflineQuery && !iGlobalOfflineQuery->IsActive() ) ||
+              !iGlobalOfflineQuery )
+            {
+            iRadioEngine->InitializeRadio();
+            }
+        HandleVolumeChangedCallback();
+        }
     }
 
 // ---------------------------------------------------------------------------
@@ -1423,8 +1400,6 @@
     FTRACE( FPrint( _L("CFMRadioAppUi::HandleStopSeekCallback() state %d "), iCurrentRadioState) );
     
     if ( iCurrentRadioState == EFMRadioStateBusyManualTune ||
-         iCurrentRadioState == EFMRadioStateBusyScanUp ||
-         iCurrentRadioState == EFMRadioStateBusyScanDown ||
          iCurrentRadioState == EFMRadioStateBusySeek ||
          iCurrentRadioState == EFMRadioStateBusyScanLocalStations )
         {
@@ -1449,7 +1424,6 @@
         {
         // nop
         }
-
     FTRACE( FPrint( _L("end CFMRadioAppUi::HandleStopSeekCallback") ) );
     }
 
@@ -1469,7 +1443,6 @@
         {
         iActiveVolumePopupControl = iHeadsetVolumePopupControl;
         }
-	
     // restore volume for current output
     TInt volumeLevel = iRadioEngine->GetVolume();
     iRadioEngine->SetVolume( volumeLevel );
@@ -1519,15 +1492,12 @@
     switch ( aEvent.Type() )
         {
         case EEventFocusLost:
+            {
             // being sent to background, so if tuning cancel first then handle event
-            if( iCurrentRadioState == EFMRadioStateBusyScanUp ||
-                    iCurrentRadioState == EFMRadioStateBusyScanDown )
-                {
-                iRadioEngine->CancelScan();
-                HandleStopSeekCallback();
-                }
-            CAknViewAppUi::HandleWsEventL(aEvent, aDestination);
+            CancelSeek();
+            CAknViewAppUi::HandleWsEventL( aEvent, aDestination );
             break;
+            }
         case EEventFocusGained:
             // override default behavior of unfading the ui
             // can be taken out when auto resume is implemented
@@ -1541,9 +1511,9 @@
                 iChannelListView->UpdateDisplayForFocusGained();
                 }
             if (iScanLocalStationsView)
-            	{
-            	iScanLocalStationsView->UpdateDisplayForFocusGained();
-            	}
+                {
+                iScanLocalStationsView->UpdateDisplayForFocusGained();
+                }
             break;
         default:
             CAknViewAppUi::HandleWsEventL(aEvent, aDestination);
@@ -1558,24 +1528,24 @@
 // ----------------------------------------------------------------------------------------------------
 //
 void CFMRadioAppUi::FMRadioSvkChangeVolumeL( TInt aVolumeChange )
-	{  
-   	FTRACE( FPrint( _L("CFMRadioAppUi::FMRadioSvkRemoveVolumeL() aVolumeChange : %d"), aVolumeChange ) );
-	
-	TBool headsetConnected = iRadioEngine->IsHeadsetConnected();
-	
-	if ( iCurrentRadioState != EFMRadioStateBusyScanLocalStations && IsStartupWizardHandled() &&
-		headsetConnected )
-		{					
-	   	if ( aVolumeChange > 0 ) // up direction
-	   		{        	
-	      	UpdateVolume( EDirectionUp );
-	      	}
-	   	else // down direction
-	   		{
-	      	UpdateVolume( EDirectionDown );
-	   		}
-		}
-   	}
+    {  
+    FTRACE( FPrint( _L("CFMRadioAppUi::FMRadioSvkRemoveVolumeL() aVolumeChange : %d"), aVolumeChange ) );
+    
+    TBool headsetConnected = iRadioEngine->IsHeadsetConnected();
+    
+    if ( iCurrentRadioState != EFMRadioStateBusyScanLocalStations && IsStartupWizardHandled() &&
+        headsetConnected )
+        {
+        if ( aVolumeChange > 0 ) // up direction
+            {
+            UpdateVolume( EDirectionUp );
+            }
+        else // down direction
+            {
+            UpdateVolume( EDirectionDown );
+            }
+        }
+    }
 
 // ----------------------------------------------------------------------------------------------------
 // CFMRadioAppUi::FMRadioSvkRemoveVolumeL
@@ -1588,7 +1558,6 @@
    FTRACE( FPrint( _L("CFMRadioAppUi::FMRadioSvkRemoveVolumeL( )") ) );
    }
 
-
 // ----------------------------------------------------------------------------------------------------
 // CFMRadioAppUi::FMRadioHeadsetEvent
 // Handles the Headset button pressed
@@ -1656,15 +1625,15 @@
     FTRACE( FPrint( _L("CFMRadioAppUi::HandleResourceChangeL type: %d "), aType ) );
     CAknViewAppUi::HandleResourceChangeL( aType );
     
-   	if ( aType == KEikDynamicLayoutVariantSwitch )
+    if ( aType == KEikDynamicLayoutVariantSwitch )
         {
         UpdateLandscapeInformation();
         iLayoutChangeObserver->LayoutChangedL( aType );
         }
-	else if ( aType == KAknsMessageSkinChange )
-		{
-		iLayoutChangeObserver->LayoutChangedL( aType );
-		}
+    else if ( aType == KAknsMessageSkinChange )
+        {
+        iLayoutChangeObserver->LayoutChangedL( aType );
+        }
     }
 
 // ----------------------------------------------------------------------------------------------------
@@ -1713,10 +1682,10 @@
 // DialogTerminated
 // ----------------------------------------------------------------------------------------------------
 void CFMRadioAppUi::DialogTerminated()
-	{
-	iInfoNoteOn = EFalse;
-	}
-    
+    {
+    iInfoNoteOn = EFalse;
+    }
+
 // ---------------------------------------------------------------------------
 // CFMRadioAppUi::UpdateLandscapeInformation
 // ---------------------------------------------------------------------------
@@ -1742,68 +1711,68 @@
 // CFMRadioAppUi::UpdateChannelsL
 // ---------------------------------------------------------------------------
 //    
-void CFMRadioAppUi::UpdateChannelsL( TMoveoperations aOperation, 
-		TInt aIndex, TInt aMovedToNewIndex )
-	{
-	FTRACE( FPrint( _L("CFMRadioAppUi::UpdateChannelsL(%d, %d, %d)"), aOperation, aIndex, aMovedToNewIndex ) );
-	TChannelInformation channelinfo;
-	
-	// Move channel operation moves channel from aIndex to aMovedToNewIndex value
-	if ( EMoveChannels == aOperation )
-		{		
-		channelinfo = iChannels->At( aIndex );
-		iChannels->Delete( aIndex );
-		iChannels->InsertL( aMovedToNewIndex, channelinfo );
-		}
-	// Delete channel deletes channel from list 
-	else if( EDeleteChannel == aOperation )
-		{			
-		iChannels->Delete( aIndex );
-		
-		for ( TInt index = 0; index < iChannels->Count(); index++ )
-			{								
-			iRadioEngine->SetPresetNameFrequencyL( 
-					index, 
-				 iChannels->At( index ).iChannelInformation, 
-				 iChannels->At( index ).iChannelFrequency );
-			}
-		
-        CRadioEngine::TStationName emptyStationName;    
-        // Remove last		
-        iRadioEngine->SetPresetNameFrequencyL( iChannels->Count(), emptyStationName, KErrNotFound );
-		}
-	// Store all channels to repository
-	else if ( EStoreAllToRepository == aOperation )
-		{
-		for ( TInt index = 0; index < iChannels->Count(); index++ )
-			{								
-			iRadioEngine->SetPresetNameFrequencyL( 
-					index, 
-				 iChannels->At( index ).iChannelInformation, 
-				 iChannels->At( index ).iChannelFrequency );
-			}
-		}
-	// Store specified index to repository and same index 
-	else if (EStoreIndexToRepository== aOperation )
-		{
-		iRadioEngine->SetPresetNameFrequencyL( 
-			 aIndex, 
-			 iChannels->At( aIndex ).iChannelInformation, 
-			 iChannels->At( aIndex ).iChannelFrequency );
-		
-		}
+void CFMRadioAppUi::UpdateChannelsL( TMoveoperations aOperation,
+        TInt aIndex, TInt aMovedToNewIndex )
+    {
+    FTRACE( FPrint( _L("CFMRadioAppUi::UpdateChannelsL(%d, %d, %d)"), aOperation, aIndex, aMovedToNewIndex ) );
+    
+    // Move channel operation moves channel from aIndex to aMovedToNewIndex value
+    if ( EMoveChannels == aOperation )
+        {		
+        const CFMRadioPreset* channelinfo  = iChannels[ aIndex ];
+        iChannels.Remove( aIndex );
+        iChannels.Insert( channelinfo, aMovedToNewIndex );
+        }
+    // Delete channel deletes channel from list 
+    else if ( EDeleteChannel == aOperation )
+        {
+        const CFMRadioPreset* channelinfo  = iChannels[ aIndex ];
+        iChannels.Remove( aIndex );
+        delete channelinfo;
+        
+        for ( TInt index = 0; index < iChannels.Count(); index++ )
+            {
+            iRadioEngine->SetPresetNameFrequencyL( 
+                    index,
+                    iChannels[ index ]->PresetName(),
+                    iChannels[ index ]->PresetFrequency() );
+            
+            iRadioEngine->SaveUrlToPresetL( index, iChannels[ index ]->PresetUrl() );
+            }
+        iRadioEngine->DeletePresetL( iChannels.Count() );
+        }
+
+    // Store all channels to repository
+    else if ( EStoreAllToRepository == aOperation )
+        {
+        for ( TInt index = 0; index < iChannels.Count(); index++ )
+            {
+            iRadioEngine->SetPresetNameFrequencyL( 
+                    index, 
+                    iChannels[ index ]->PresetName(), 
+                    iChannels[ index ]->PresetFrequency() );
+            
+            iRadioEngine->SaveUrlToPresetL( index, iChannels[ index ]->PresetUrl() );
+            }
+        }
+
+    // Store specified index to repository and same index 
+    else if ( EStoreIndexToRepository == aOperation )
+        {
+        iRadioEngine->SetPresetNameFrequencyL( 
+             aIndex, 
+             iChannels[ aIndex ]->PresetName(), 
+             iChannels[ aIndex ]->PresetFrequency() );
+        
+        iRadioEngine->SaveUrlToPresetL( aIndex, iChannels[ aIndex ]->PresetUrl() );
+        }
     else if ( ERemoveAllFromRepository == aOperation )
         {
-        CRadioEngine::TStationName emptyStationName;
-    
-        for ( TInt i = 0; i < iChannels->Count(); i++ )
-            {
-            iRadioEngine->SetPresetNameFrequencyL( i, emptyStationName, KErrNotFound );
-            }
-        iChannels->Reset();	
+        iRadioEngine->DeletePresetL( -1 ); // reset all presets
+        iChannels.ResetAndDestroy();
         }
     
-    iRadioEngine->PubSubL().PublishPresetCountL( iChannels->Count() );
+    iRadioEngine->PubSubL().PublishPresetCountL( iChannels.Count() );
     }
 
 // ---------------------------------------------------------------------------
@@ -1811,13 +1780,15 @@
 // ---------------------------------------------------------------------------
 // 
 void CFMRadioAppUi::AddChannelToListL( const TDesC& aChannelName, TInt aChannelFreq )
-	{
-	FTRACE( FPrint( _L("CFMRadioAppUi::AddChannelToListL(%S, %d)"), &aChannelName, aChannelFreq ) );
-	TChannelInformation channelinfo;
-	channelinfo.iChannelInformation = aChannelName;
-	channelinfo.iChannelFrequency = aChannelFreq;
-	iChannels->AppendL( channelinfo );
-	}
+    {
+    FTRACE( FPrint( _L("CFMRadioAppUi::AddChannelToListL(%S, %d)"), &aChannelName, aChannelFreq ) );
+    CFMRadioPreset* preset = CFMRadioPreset::NewL();
+    CleanupStack::PushL( preset );
+    preset->SetPresetNameL( aChannelName );
+    preset->SetPresetFrequency( aChannelFreq );
+    iChannels.AppendL( preset );
+    CleanupStack::Pop( preset );
+    }
 
 // ---------------------------------------------------------------------------
 // CFMRadioAppUi::IsLandscapeOrientation
@@ -1885,19 +1856,19 @@
     // (that would disable auto resume) is playing (or has played)
     // audio, a global confirmation query is displayed.
     if ( iAudioResourceAvailable )
-      	{
-       	iRadioEngine->RadioOff();              
-                
+        {
+        iRadioEngine->RadioOff();
+        
         if ( !iGlobalOfflineQuery )
-           	{
+            {
             iGlobalOfflineQuery = CFMRadioGlobalConfirmationQuery::NewL( this );                                
             }
-                        
+        
         HBufC* text = StringLoader::LoadLC( R_QTN_FMRADIO_QUERY_OFFLINE_USE, iCoeEnv );
-            
+        
         iOfflineQueryDialogActivated = ETrue;
         iGlobalOfflineQuery->ShowQueryL( *text, R_AVKON_SOFTKEYS_YES_NO, R_QGN_NOTE_QUERY_ANIM ); 
-                                              
+        
         CleanupStack::PopAndDestroy( text );
         }
             
@@ -1919,12 +1890,12 @@
     {
     FTRACE( FPrint( _L("CFMRadioAppUi::HandleFlightModeDisabledCallback" ) ) );
     iOfflineProfileActivatedWhenRadioAudioDisabled = EFalse;
-        
+    
     // Close continue offline query
-	if ( iLocalContinueOfflineQuery && iLocalContinueOfflineQuery->IsVisible() )
-    	{
-    	TRAP_IGNORE( iLocalContinueOfflineQuery->DismissQueryL() );
-    	}
+    if ( iLocalContinueOfflineQuery && iLocalContinueOfflineQuery->IsVisible() )
+        {
+        TRAP_IGNORE( iLocalContinueOfflineQuery->DismissQueryL() );
+        }
     }
 
 // ---------------------------------------------------------------------------
@@ -1963,11 +1934,11 @@
 void CFMRadioAppUi::HandleStartupForegroundEventL()
     {
     FTRACE( FPrint( _L("CFMRadioAppUi::HandleStartupForegroundEventL" ) ) );
-    HandleOfflineModeAtStartUpL();    
+    HandleOfflineModeAtStartUpL();
     TFMRadioRegionSetting region = HandleRegionsAtStartUpL();
     iRadioEngine->SetRegionIdL( region );
     HandlePendingViewActivationL();
-	RequestTunerControl();      		  
+    RequestTunerControl();
     }
 
 // ---------------------------------------------------------------------------
@@ -1983,9 +1954,9 @@
         iOfflineQueryDialogActivated = ETrue;
         
         if ( AknLayoutUtils::PenEnabled() )
-           {       
-        	// We must hide toolbar, otherwise query dialog softkeys doesn't work 
-        	ShowToolbar( EFalse );
+            {
+            // We must hide toolbar, otherwise query dialog softkeys doesn't work 
+            ShowToolbar( EFalse );
             }
         
         iLocalActivateOfflineQuery = CAknQueryDialog::NewL();
@@ -1995,18 +1966,18 @@
         iOfflineQueryDialogActivated = EFalse;
        
         if ( result )
-            {          
+            {
             if ( AknLayoutUtils::PenEnabled() )
-    			{
-            	ShowToolbar( ETrue );
-            	}
+                {
+                ShowToolbar( ETrue );
+                }
             }
         else
-        	{
-        	Exit();
-        	}
-        }       
-    }	
+            {
+            Exit();
+            }
+        }
+    }
 
 // ---------------------------------------------------------------------------
 // CFMRadioAppUi::ShowToolbar
@@ -2015,17 +1986,17 @@
 // ---------------------------------------------------------------------------
 //
 void CFMRadioAppUi::ShowToolbar( TBool aVisible )
-	{
-	FTRACE( FPrint( _L("CFMRadioAppUi::ShowToolbar(%d)"), aVisible ) );
-	if ( iLayoutChangeObserver == iMainView )
-		{
-		iMainView->ShowToolbar( aVisible );	
-		}			
-	else if ( iLayoutChangeObserver == iScanLocalStationsView )
-		{
-		iScanLocalStationsView->ShowToolbar( aVisible );	
-		}		
-	}
+    {
+    FTRACE( FPrint( _L("CFMRadioAppUi::ShowToolbar(%d)"), aVisible ) );
+    if ( iLayoutChangeObserver == iMainView )
+        {
+        iMainView->ShowToolbar( aVisible );	
+        }
+    else if ( iLayoutChangeObserver == iScanLocalStationsView )
+        {
+        iScanLocalStationsView->ShowToolbar( aVisible );
+        }
+    }
 
 // ---------------------------------------------------------------------------
 // CFMRadioAppUi::IsOfflineProfileActivatedWhenRadioAudioDisabled
@@ -2102,25 +2073,24 @@
     iCurrentRadioState = EFMRadioStateOff;
     Exit();
     } 
-    
 // ---------------------------------------------------------------------------
 // CFMRadioAppUi::HandleMuteCommand
 // Handles mute keypress from main view
 // ---------------------------------------------------------------------------
 //
 void CFMRadioAppUi::HandleMuteCommand()
-	{
-	FTRACE( FPrint( _L("CFMRadioAppUi::HandleMuteCommand" ) ) );
-	if ( iRadioEngine->IsMuteOn() )
-		{
-		iRadioEngine->SetMuteOn( EFalse );		
-		}
-	else
-		{
-		iRadioEngine->SetMuteOn( ETrue );		
-		}			
-	}
-	
+    {
+    FTRACE( FPrint( _L("CFMRadioAppUi::HandleMuteCommand" ) ) );
+    if ( iRadioEngine->IsMuteOn() )
+        {
+        iRadioEngine->SetMuteOn( EFalse );
+        }
+    else
+        {
+        iRadioEngine->SetMuteOn( ETrue );
+        }
+    }
+
 // ---------------------------------------------------------------------------
 // CFMRadioAppUi::HandleRegionsAtStartUpL
 // get region automatically from network or manually by user choice if network
@@ -2129,50 +2099,50 @@
 //
 TFMRadioRegionSetting CFMRadioAppUi::HandleRegionsAtStartUpL()
     {
-    FTRACE( FPrint( _L("CFMRadioAppUi::HandleRegionsAtStartUpL()")) );    
-    TFMRadioRegionSetting region = iRadioEngine->GetRegionL();	
+    FTRACE( FPrint( _L("CFMRadioAppUi::HandleRegionsAtStartUpL()")) );
+    TFMRadioRegionSetting region = iRadioEngine->GetRegionL();
     
     if ( region == EFMRadioRegionNone )
         {
-        ShowToolbar( EFalse );        
+        ShowToolbar( EFalse );
         TInt index = 0;
         
         CDesCArraySeg* regionList = new( ELeave ) CDesCArraySeg( KDefaultRegionArrayGranularity );
-    	CleanupStack::PushL( regionList );
+        CleanupStack::PushL( regionList );
         
         iRadioEngine->FillListWithRegionDataL( *regionList );
-                
+        
         CAknListQueryDialog* dlg = new ( ELeave ) CAknListQueryDialog( &index );
         
-    	dlg->PrepareLC( R_FMRADIO_SELECT_REGION_QUERY );    
-    	CTextListBoxModel* model = 
+        dlg->PrepareLC( R_FMRADIO_SELECT_REGION_QUERY );
+        CTextListBoxModel* model = 
         static_cast<CAknListQueryControl*>( dlg->ListControl() )->listbox()->Model();
-    	model->SetItemTextArray( regionList );
-    	model->SetOwnershipType( ELbmDoesNotOwnItemArray ); // Array won't be deleted here
+        model->SetItemTextArray( regionList );
+        model->SetOwnershipType( ELbmDoesNotOwnItemArray ); // Array won't be deleted here
             	
         TInt ret = dlg->RunLD();
         CleanupStack::PopAndDestroy( regionList );
         
         if ( ret != EAknSoftkeyExit )
-        	{
-        	// We should have a proper region selected by user        	
-        	region = iRadioEngine->RegionIdAtIndex( index );  
-        	}
-                
+            {
+            // We should have a proper region selected by user
+            region = iRadioEngine->RegionIdAtIndex( index );
+            }
+        
         if ( region == EFMRadioRegionNone )
             {
-            Exit();    // This will eventually exit FMRadio.
+            Exit();// This will eventually exit FMRadio.
             }
         else
-            {            
+            {
             HBufC* bandSetText = StringLoader::LoadLC( R_QTN_FMRADIO_CONF_FREQ_BAND_SET_MANUAL, iCoeEnv );
-    		CAknInformationNote* note = new( ELeave ) CAknInformationNote( ETrue );
-    		note->ExecuteLD( *bandSetText );
-    		CleanupStack::PopAndDestroy( bandSetText );
-    		if ( AknLayoutUtils::PenEnabled() )
-    			{
-    			ShowToolbar( ETrue );                		
-    			}
+            CAknInformationNote* note = new( ELeave ) CAknInformationNote( ETrue );
+            note->ExecuteLD( *bandSetText );
+            CleanupStack::PopAndDestroy( bandSetText );
+            if ( AknLayoutUtils::PenEnabled() )
+                {
+                ShowToolbar( ETrue );
+                }
             }
         }
     else
@@ -2182,7 +2152,7 @@
             {
             TInt previousRegion = iRadioEngine->RegionId();
             
-            if ( previousRegion != EFMRadioRegionNone )
+           if ( previousRegion != EFMRadioRegionNone )
                 {
                 // Show note only if the region has changed from a concrete 
                 // one to another concrete one. EFMRadioRegionNone is not 
@@ -2195,7 +2165,6 @@
                 }
             }
         }
-
     return region;
     }
 
@@ -2231,10 +2200,10 @@
 // ---------------------------------------------------------------------------
 //    
 void CFMRadioAppUi::RequestTunerControl() const
-	{
-	FTRACE( FPrint( _L("CFMRadioAppUi::RequestTunerControl()")) );
-	iRadioEngine->RequestTunerControl();
-	}
+    {
+    FTRACE( FPrint( _L("CFMRadioAppUi::RequestTunerControl()")) );
+    iRadioEngine->RequestTunerControl();
+    }
 
 // ---------------------------------------------------------------------------
 // CFMRadioAppUi::NumberOfChannelsStored
@@ -2242,11 +2211,11 @@
 // ---------------------------------------------------------------------------
 //    
 TInt CFMRadioAppUi::NumberOfChannelsStored() const
-	{
-	FTRACE( FPrint( _L("CFMRadioAppUi::NumberOfChannelsStored()")) );
-	return iChannels->Count();
-	}
-	
+    {
+    FTRACE( FPrint( _L("CFMRadioAppUi::NumberOfChannelsStored()")) );
+    return iChannels.Count();
+    }
+
 // ---------------------------------------------------------------------------
 // CFMRadioAppUi::HandleStartupWizard
 // Determine if "Scan all channels" in scan local stations view should be started.
@@ -2286,9 +2255,9 @@
 // ---------------------------------------------------------------------------
 // 	
 TBool CFMRadioAppUi::IsStartupWizardRunning() const
-	{
-	return iStartupWizardRunning;		
-	}
+    {
+    return iStartupWizardRunning;
+    }
 
 // ---------------------------------------------------------------------------
 // CFMRadioAppUi::SetStartupWizardRunning
@@ -2296,10 +2265,10 @@
 // ---------------------------------------------------------------------------
 // 
 void CFMRadioAppUi::SetStartupWizardRunning( const TBool aRunningState )
-	{
-	FTRACE( FPrint( _L("CFMRadioAppUi::SetStartupWizardRunning() - state = %d"), aRunningState) );
-	iStartupWizardRunning = aRunningState;	
-	}
+    {
+    FTRACE( FPrint( _L("CFMRadioAppUi::SetStartupWizardRunning() - state = %d"), aRunningState) );
+    iStartupWizardRunning = aRunningState;	
+    }
 
 // ---------------------------------------------------------------------------
 // CFMRadioAppUi::StartLocalStationsSeekL
@@ -2307,11 +2276,11 @@
 // ---------------------------------------------------------------------------
 // 
 void CFMRadioAppUi::StartLocalStationsSeekL()
-	{
-	FTRACE( FPrint( _L("CFMRadioAppUi::StartLocalStationsSeekL()")) );
-	iCurrentRadioState = EFMRadioStateBusyScanLocalStations;
+    {
+    FTRACE( FPrint( _L("CFMRadioAppUi::StartLocalStationsSeekL()")) );
+    iCurrentRadioState = EFMRadioStateBusyScanLocalStations;
     iRadioEngine->ScanUp();
-	}
+    }
 
 // ---------------------------------------------------------------------------
 // CFMRadioAppUi::TryToResumeAudioL
@@ -2319,61 +2288,61 @@
 // ---------------------------------------------------------------------------
 // 
 void CFMRadioAppUi::TryToResumeAudioL()
-	{
+    {
     FTRACE( FPrint( _L("CFMRadioAppUi::TryToResumeAudioL" ) ) );
-	TFMRadioRegionSetting region = iRadioEngine->GetRegionL();  
-	if ( iAudioLost && 
-	     IsForeground() &&
-	     !iOfflineQueryDialogActivated && 
-	     region != EFMRadioRegionNone )
-	    {
-	    iAudioLost = EFalse;
-	    iRadioEngine->InitializeRadio();
-	    }
-	}
-	
+    TFMRadioRegionSetting region = iRadioEngine->GetRegionL();
+    if ( iAudioLost && 
+         IsForeground() &&
+         !iOfflineQueryDialogActivated && 
+         region != EFMRadioRegionNone )
+        {
+        iAudioLost = EFalse;
+        iRadioEngine->InitializeRadio();
+        }
+    }
+    
 // ---------------------------------------------------------------------------
 // CFMRadioAppUi::ShowConnectHeadsetDialogL
 // Show connect headset query with only exit softkey
 // ---------------------------------------------------------------------------
 // 	
 void CFMRadioAppUi::ShowConnectHeadsetDialogL()
-	{
-	FTRACE( FPrint( _L("CFMRadioAppUi::ShowConnectHeadsetDialogL" ) ) );				
-	if ( !iConnectHeadsetQuery && !iConnectHeadsetGlobalNote )
-		{
-		HBufC* noteTxt = StringLoader::LoadLC( R_QTN_FMRADIO_ERROR_CON_HEADSET, iCoeEnv  );
-							
-		// if radio is in background, show also global note	
-		if ( !IsForeground() )
-			{
-			iConnectHeadsetGlobalNote = CAknGlobalNote::NewL();
-		    iConnectHeadsetGlobalNote->ShowNoteL( EAknGlobalInformationNote, *noteTxt );
-		    delete iConnectHeadsetGlobalNote;
-		    iConnectHeadsetGlobalNote = NULL;
-			}
-								
-		iConnectHeadsetQuery = CAknQueryDialog::NewL( CAknQueryDialog::EErrorTone );									
-		TInt ret = iConnectHeadsetQuery->ExecuteLD( R_FMRADIO_CONNECT_HEADSET_NOTE, *noteTxt );
-			
-		CleanupStack::PopAndDestroy( noteTxt );
-		
-		if ( iConnectHeadsetQuery )
-			{
-			iConnectHeadsetQuery = NULL;				
-			if ( ret == EAknSoftkeyExit )
-				{		        
-			    TApaTask task( iCoeEnv->WsSession() );
-			    task.SetWgId( iCoeEnv->RootWin().Identifier() );
-			    task.EndTask();
-				}
-			else
-			    {
-			    HandlePendingViewActivationL();
-			    }
-			}			                   							
-		}
-	}
+    {
+    FTRACE( FPrint( _L("CFMRadioAppUi::ShowConnectHeadsetDialogL" ) ) );
+    if ( !iConnectHeadsetQuery && !iConnectHeadsetGlobalNote )
+        {
+        HBufC* noteTxt = StringLoader::LoadLC( R_QTN_FMRADIO_ERROR_CON_HEADSET, iCoeEnv  );
+        
+        // if radio is in background, show also global note	
+        if ( !IsForeground() )
+            {
+            iConnectHeadsetGlobalNote = CAknGlobalNote::NewL();
+            iConnectHeadsetGlobalNote->ShowNoteL( EAknGlobalInformationNote, *noteTxt );
+            delete iConnectHeadsetGlobalNote;
+            iConnectHeadsetGlobalNote = NULL;
+            }
+        
+        iConnectHeadsetQuery = CAknQueryDialog::NewL( CAknQueryDialog::EErrorTone );									
+        TInt ret = iConnectHeadsetQuery->ExecuteLD( R_FMRADIO_CONNECT_HEADSET_NOTE, *noteTxt );
+            
+        CleanupStack::PopAndDestroy( noteTxt );
+        
+        if ( iConnectHeadsetQuery )
+            {
+            iConnectHeadsetQuery = NULL;
+            if ( ret == EAknSoftkeyExit )
+                {
+                TApaTask task( iCoeEnv->WsSession() );
+                task.SetWgId( iCoeEnv->RootWin().Identifier() );
+                task.EndTask();
+                }
+            else
+                {
+                HandlePendingViewActivationL();
+                }
+            }
+        }
+    }
 
 // ---------------------------------------------------------------------------
 // CFMRadioAppUi::ShowVolumePopupL
@@ -2401,19 +2370,19 @@
 // ---------------------------------------------------------------------------
 //	
 CArrayFix<TCoeHelpContext>* CFMRadioAppUi::GetCurrentHelpContextL() const
-	{
-	FTRACE( FPrint( _L("CFMRadioAppUi::GetCurrentHelpContextL" ) ) );
+    {
+    FTRACE( FPrint( _L("CFMRadioAppUi::GetCurrentHelpContextL" ) ) );
 #if defined __SERIES60_HELP || defined FF_S60_HELPS_IN_USE
-	// currently main container and manual tuning container are derived from CBase
-	// so lets create help array manually for them
-		CArrayFixFlat<TCoeHelpContext>* helpArray = new( ELeave )
-		CArrayFixFlat<TCoeHelpContext>( 1 );
-		CleanupStack::PushL( helpArray );
-		helpArray->AppendL( TCoeHelpContext( TUid::Uid( KUidFMRadioApplication ), KFMRADIO_HLP_MAIN ) );
-		CleanupStack::Pop( helpArray );
-		return helpArray;
+    // currently main container and manual tuning container are derived from CBase
+    // so lets create help array manually for them
+        CArrayFixFlat<TCoeHelpContext>* helpArray = new( ELeave )
+        CArrayFixFlat<TCoeHelpContext>( 1 );
+        CleanupStack::PushL( helpArray );
+        helpArray->AppendL( TCoeHelpContext( TUid::Uid( KUidFMRadioApplication ), KFMRADIO_HLP_MAIN ) );
+        CleanupStack::Pop( helpArray );
+        return helpArray;
 #else
-	return AppHelpContextL();
+    return AppHelpContextL();
 #endif
 }
 
@@ -2429,16 +2398,33 @@
     // Note: KMaxNumberOfChannelListItems can be setted to any supported max value
     for ( TInt index = 0; index < KMaxNumberOfChannelListItems; index++ )
         {
-        TChannelInformation channelinfo;
-
+        TBuf<KPresetNameLength> chName;
+        TInt chFrequency;
+        
         iRadioEngine->GetPresetNameAndFrequencyL( index,
-                                                  channelinfo.iChannelInformation, 
-                                                  channelinfo.iChannelFrequency );
+                                                  chName, 
+                                                  chFrequency );
 
-        if ( channelinfo.iChannelFrequency != KErrNotFound )
+        if ( chFrequency != KErrNotFound )
             {
             FTRACE( FPrint( _L("CFMRadioChannelListView::ChannelInUse  inside if") ) );
-            iChannels->AppendL( channelinfo );
+            CFMRadioPreset* preset = CFMRadioPreset::NewL();
+            CleanupStack::PushL( preset );
+            preset->SetPresetNameL( chName );
+            preset->SetPresetFrequency( chFrequency );
+            
+            RBuf url;
+            url.CleanupClosePushL();
+            url.CreateL( KFMRadioWebLinkMaxLength );
+            TInt err = iRadioEngine->PresetUrlL( index, url );
+            if ( !err )
+                {
+                preset->SetPresetUrlL( url );
+                }
+            
+            iChannels.AppendL( preset );
+            CleanupStack::PopAndDestroy( &url );
+            CleanupStack::Pop( preset );
             }
         }
     }
@@ -2515,7 +2501,7 @@
             // tune to station index
             TLex8 indexLex( tailLex.NextToken() );
             TInt32 index = 0;
-            TInt ret = indexLex.BoundedVal( index, iChannels->Count() - 1 );
+            TInt ret = indexLex.BoundedVal( index, iChannels.Count() - 1 );
             if ( ret == KErrNone && index >= 0 )
                 {
                 iRadioEngine->CancelScan();
@@ -2571,7 +2557,7 @@
 // Returns channels array
 // ---------------------------------------------------------------------------
 //
-CArrayFixFlat<TChannelInformation>* CFMRadioAppUi::Channels()
+RPointerArray<CFMRadioPreset>& CFMRadioAppUi::Channels()
 	{
 	return iChannels;
 	}
@@ -2582,25 +2568,25 @@
 // ---------------------------------------------------------------------------
 //
 void CFMRadioAppUi::HandleIADUpdateCheckL()
-	{
-	FTRACE( FPrint( _L("CFMRadioAppUi::HandleIADUpdateCheckL") ) );
-	if ( FeatureManager::FeatureSupported( KFeatureIdIAUpdate ) )
-	    {
-	    FTRACE( FPrint( _L("CFMRadioAppUi::HandleIADUpdateCheckL - KFeatureIdIAUpdate supported") ) );
-	    TRAPD( err, iUpdate = CIAUpdate::NewL( *this ) )
-	    if ( err && err != KErrNotSupported )
-	        {
-	        User::Leave( err );
-	        }
-	    if ( !err )
-	        {
-	        iParameters = CIAUpdateParameters::NewL();
-	        // Use SIS package UID
-	        iParameters->SetUid( TUid::Uid( KUidFMRadioApplication ) );
-	        iUpdate->CheckUpdates( *iParameters );
-	        }
-	    }
-	}
+    {
+    FTRACE( FPrint( _L("CFMRadioAppUi::HandleIADUpdateCheckL") ) );
+    if ( FeatureManager::FeatureSupported( KFeatureIdIAUpdate ) )
+        {
+        FTRACE( FPrint( _L("CFMRadioAppUi::HandleIADUpdateCheckL - KFeatureIdIAUpdate supported") ) );
+        TRAPD( err, iUpdate = CIAUpdate::NewL( *this ) )
+        if ( err && err != KErrNotSupported )
+            {
+            User::Leave( err );
+            }
+        if ( !err )
+            {
+            iParameters = CIAUpdateParameters::NewL();
+            // Use SIS package UID
+            iParameters->SetUid( TUid::Uid( KUidFMRadioApplication ) );
+            iUpdate->CheckUpdates( *iParameters );
+            }
+        }
+    }
 
 // ---------------------------------------------------------------------------
 // CFMRadioAppUi::CheckUpdatesComplete
@@ -2608,9 +2594,9 @@
 // ---------------------------------------------------------------------------
 //
 void CFMRadioAppUi::CheckUpdatesComplete( TInt aErrorCode, TInt aAvailableUpdates )
-	{
-	FTRACE( FPrint( _L("CFMRadioAppUi::CheckUpdatesComplete(%d, %d)"), aErrorCode, aAvailableUpdates ) );
-	if ( aErrorCode == KErrNone )
+    {
+    FTRACE( FPrint( _L("CFMRadioAppUi::CheckUpdatesComplete(%d, %d)"), aErrorCode, aAvailableUpdates ) );
+    if ( aErrorCode == KErrNone )
         {
         if ( aAvailableUpdates > 0 )
             {
@@ -2626,18 +2612,18 @@
             delete iParameters;
             iParameters = NULL;
             }
-        }		
-	}
-	
+        }
+    }
+
 // ---------------------------------------------------------------------------
 // CFMRadioAppUi::UpdateComplete
 // from base class MIAUpdateObserver
 // ---------------------------------------------------------------------------
 //
 void CFMRadioAppUi::UpdateComplete( TInt FDEBUGVAR( aErrorCode ), CIAUpdateResult* aResultDetails )
-	{
-	FTRACE( FPrint( _L("CFMRadioAppUi::UpdateComplete(%d)"), aErrorCode ) );
-	// The update process that the user started from IAUpdate UI is now completed.
+    {
+    FTRACE( FPrint( _L("CFMRadioAppUi::UpdateComplete(%d)"), aErrorCode ) );
+    // The update process that the user started from IAUpdate UI is now completed.
     // If the client application itself was updated in the update process, this callback
     // is never called, since the client is not running anymore.
 
@@ -2648,17 +2634,17 @@
     iUpdate = NULL;
     delete iParameters;
     iParameters = NULL;	
-	}
-	
+    }
+
 // ---------------------------------------------------------------------------
 // CFMRadioAppUi::UpdateQueryComplete
 // from base class MIAUpdateObserver
 // ---------------------------------------------------------------------------
 //	
 void CFMRadioAppUi::UpdateQueryComplete( TInt aErrorCode, TBool aUpdateNow )			
-	{
-	FTRACE( FPrint( _L("CFMRadioAppUi::UpdateQueryComplete(%d, %d)"), aErrorCode, aUpdateNow ) );
-	if ( aErrorCode == KErrNone )
+    {
+    FTRACE( FPrint( _L("CFMRadioAppUi::UpdateQueryComplete(%d, %d)"), aErrorCode, aUpdateNow ) );
+    if ( aErrorCode == KErrNone )
         {
         if ( aUpdateNow )
             {
@@ -2675,18 +2661,17 @@
             iParameters = NULL;
             }
         }
-	}
+    }
 
 // ---------------------------------------------------------------------------
 // CFMRadioAppUi::AutoTuneInMainView
 // Set autotune true, if scan is interrupted
 // ---------------------------------------------------------------------------
 //	
-void CFMRadioAppUi::AutoTuneInMainView ( TBool aTune )
-	{
+void CFMRadioAppUi::AutoTuneInMainView ( TBool /*aTune*/ )
+    {
     FTRACE( FPrint( _L("CFMRadioAppUi::AutoTuneInMainView()")));
-	iAutoTune = aTune;
-	}
+    }
 
 // ---------------------------------------------------------------------------
 // CFMRadioAppUi::IsStartupWizardHandled
@@ -2719,7 +2704,6 @@
             delete wgName;
             } );
         }
-    
     return isIdleActive;
     }
 
@@ -2766,11 +2750,11 @@
 TInt CFMRadioAppUi::MatchingChannelL( TInt aFrequency )
     {
     TInt channelIndex = KErrNotFound;
-    TInt numberOfChannels = iChannels->Count();
+    TInt numberOfChannels = iChannels.Count();
     
     for ( TInt i = 0; i < numberOfChannels; i++ )
         {
-        TInt presetFrequency = iChannels->At( i ).iChannelFrequency;
+        TInt presetFrequency = iChannels[ i ]->PresetFrequency();
         
         if ( aFrequency == presetFrequency )
             {
@@ -2805,4 +2789,13 @@
     return iActiveVolumePopupControl;
     }
 
+// ---------------------------------------------------------
+// CFMRadioAppUi::RadioState
+// ---------------------------------------------------------
+//
+CFMRadioAppUi::TRadioState CFMRadioAppUi::RadioState() const
+    {
+    return iCurrentRadioState;
+    }
+	
 // End of File
--- a/fmradio/fmradio/src/fmradiochannellistcontainer.cpp	Fri Mar 12 15:42:47 2010 +0200
+++ b/fmradio/fmradio/src/fmradiochannellistcontainer.cpp	Mon Mar 15 12:40:34 2010 +0200
@@ -485,6 +485,7 @@
     {
     // The channel list fills the whole view
     iChannelList->SetRect( Rect() );
+    DrawDeferred();
     }
 
 // ---------------------------------------------------------
--- a/fmradio/fmradio/src/fmradiochannellistview.cpp	Fri Mar 12 15:42:47 2010 +0200
+++ b/fmradio/fmradio/src/fmradiochannellistview.cpp	Mon Mar 15 12:40:34 2010 +0200
@@ -237,7 +237,7 @@
 
 			if ( res )
 				{				
-				if ( iObserver.Channels()->Count() < KMaxNumberOfChannelListItems )
+                if ( iObserver.Channels().Count() < KMaxNumberOfChannelListItems )
 					{
 					TInt usefreq = static_cast<TInt>( retFreq * KFMRadioFreqMultiplier );
 					iRadioEngine->Tune( usefreq );
@@ -250,7 +250,7 @@
 					
 					iContainer->AddChannelL( stationName, usefreq, ETrue );	
 					
-					iRadioEngine->TunePresetL( iObserver.Channels()->Count()-1 );					
+                    iRadioEngine->TunePresetL( iObserver.Channels().Count() - 1 );
 					
 					TInt index = iRadioEngine->GetPresetIndex();
 					
@@ -380,15 +380,15 @@
         {
         TBool nowPlaying = EFalse;
         
-        CArrayFixFlat<TChannelInformation>* channels = iObserver.Channels();
-        TInt channelCount = channels->Count();
+        RPointerArray<CFMRadioPreset>& channels = iObserver.Channels();        
+        TInt channelCount = channels.Count();
         
         for ( TInt channelIndex = 0; channelCount > channelIndex; channelIndex++ )
             {
             FTRACE( FPrint( _L("CFMRadioChannelListView::InitializeChannelsL  inside Channel in use") ) );
 
-            iContainer->AddChannelL( channels->At( channelIndex ).iChannelInformation,
-                   channels->At( channelIndex ).iChannelFrequency, 
+            iContainer->AddChannelL( channels[ channelIndex ]->PresetName(),
+                   channels[ channelIndex ]->PresetFrequency(),
                    nowPlaying );
             
             UpdateMiddleSoftKeyL();
@@ -551,7 +551,7 @@
 
     iChIndex = iChIndex + 1;
     
-    if ( iChIndex >= iObserver.Channels()->Count() )
+    if ( iChIndex >= iObserver.Channels().Count() )
     	{
     	iChIndex = 0;
     	}
@@ -578,7 +578,7 @@
         
     if ( iChIndex <= 0 )
     	{
-    	iChIndex = iObserver.Channels()->Count()-1;
+    	iChIndex = iObserver.Channels().Count() - 1;
     	}
     else
     	{
@@ -695,7 +695,7 @@
             }
         
         // don't show stylus pop-up menu during move operation
-        if ( iObserver.Channels()->Count() > 1 && !iMoveMode )
+        if ( iObserver.Channels().Count() > 1 && !iMoveMode )
             {
             aMenuPane->SetItemDimmed( EFMRadioCmdMove, EFalse );
             }
@@ -761,7 +761,7 @@
     
     if ( ( iContainer && 
     		( iContainer->CurrentlySelectedChannel() == iRadioEngine->GetPresetIndex() 
-    		|| iObserver.Channels()->Count() == 0 ) ) || 
+    		|| iObserver.Channels().Count() == 0 ) ) || 
     		iMoveMode )
     	{
     	SetMiddleSoftKeyLabelL(R_QTN_FMRADIO_NONE, EFMRadioCmdListenCh);
@@ -816,31 +816,25 @@
         if ( iRadioEngine->GetRadioMode() == CRadioEngine::ERadioPresetMode &&
                 currentPresetIx != KErrNotFound )
             {
-            TBuf<KPresetNameLength> stationName;
-            stationName.SetLength( 0 );
-            
-            
-            TInt presetFreq( 0 );
-            
-            CArrayFixFlat<TChannelInformation>* channels = iObserver.Channels();
+            RPointerArray<CFMRadioPreset>& channels = iObserver.Channels();
             
             // this checks that index is not out of bound and cause -21 error during update
-            if ( currentPresetIx < channels->Count() )
+            if ( currentPresetIx < channels.Count() )
                 {
-                stationName = channels->At( currentPresetIx ).iChannelInformation;
-                presetFreq = channels->At( currentPresetIx ).iChannelFrequency;
+                const TDesC& stationName = channels[ currentPresetIx ]->PresetName();
+                TInt presetFreq = channels[ currentPresetIx ]->PresetFrequency();
                                 
                 if ( stationName.Length() == 0 ) //Set and save PSname only if no name set before
                     {
                     TRAP_IGNORE(
                         {
                         iContainer->UpdateChannelListContentL( currentPresetIx,
-                                                               programmeService,
-                                                               presetFreq );
+                                programmeService,
+                                presetFreq );
 
-                        iRadioEngine->SetPresetNameFrequencyL( currentPresetIx, programmeService, presetFreq );  
-                        iObserver.Channels()->At( currentPresetIx ).iChannelInformation = programmeService;
-                        } );
+                        iRadioEngine->SetPresetNameFrequencyL( currentPresetIx, programmeService, presetFreq );
+                        channels[ currentPresetIx ]->SetPresetNameL( programmeService );
+                        } )
                     }
                 }
             }
@@ -942,6 +936,25 @@
 //
 void CFMRadioChannelListView::RdsDataRadioText( const TDesC& /*aRadioText*/ ){}
 
+void CFMRadioChannelListView::RdsDataRadioTextPlus( const TInt aRTPlusClass, const TDesC& aRadioText )
+    {
+    if ( aRTPlusClass == ERTplusProgramHomepage &&
+            iRadioEngine->GetRadioMode() == CRadioEngine::ERadioPresetMode )
+        {
+        TInt currentPresetIx = iRadioEngine->GetPresetIndex();
+        if ( currentPresetIx < iObserver.Channels().Count() )
+            {
+            TRAP_IGNORE
+                (
+                // save permanently
+                iRadioEngine->SaveUrlToPresetL( currentPresetIx, aRadioText );
+                // save to ui list
+                iObserver.Channels()[ currentPresetIx ]->SetPresetUrlL( aRadioText );
+                )
+            }
+        }
+    }
+
 // -----------------------------------------------------------------------------------------------
 // CFMRadioChannelListView::RdsAfSearchBegin
 // From MFMRadioRdsObserver, implementation not needed.
--- a/fmradio/fmradio/src/fmradiologo.cpp	Fri Mar 12 15:42:47 2010 +0200
+++ b/fmradio/fmradio/src/fmradiologo.cpp	Mon Mar 15 12:40:34 2010 +0200
@@ -217,8 +217,8 @@
                                        bitmapLayout.Rect().Size(),
                                        EAspectRatioPreserved,
                                        iBackgroundBitmapFileName,
-                                       EMbmFmradioQgn_indi_radio_default,
-                                       EMbmFmradioQgn_indi_radio_default_mask );
+                                       EMbmFmradioQgn_menu_radio,
+                                       EMbmFmradioQgn_menu_radio_mask );
 
     // image for landscape
     bitmapLayout.LayoutRect(
@@ -229,8 +229,8 @@
                                  bitmapLayout.Rect().Size(),
                                  EAspectRatioPreserved,
                                  iBackgroundBitmapFileName,
-                                 EMbmFmradioQgn_indi_radio_default,
-                                 EMbmFmradioQgn_indi_radio_default_mask );
+                                 EMbmFmradioQgn_menu_radio,
+                                 EMbmFmradioQgn_menu_radio_mask );
     
     iImageVisual->SetImage( iPortraitImage );
     iImageVisual->SetSecondaryImage( iLandscapeImage );
--- a/fmradio/fmradio/src/fmradiomaincontainer.cpp	Fri Mar 12 15:42:47 2010 +0200
+++ b/fmradio/fmradio/src/fmradiomaincontainer.cpp	Mon Mar 15 12:40:34 2010 +0200
@@ -259,14 +259,14 @@
         iRadioLogo = CFMRadioLogo::NewL( iAlfEnv );
         iRadioLogo->SetId( KFMRadioLogoId );
         
-	    // Append the controls into the control group.	    
-	    group->AppendL( iMediaIdle );
-	    group->AppendL( iVisualControl );
+        // Append the controls into the control group.
+        group->AppendL( iMediaIdle );
         group->AppendL( iRdsIndicator );
         group->AppendL( iRdsAfIndicator );
         group->AppendL( iRdsViewer );
         group->AppendL( iRdsInteractionIndicator );
         group->AppendL( iRadioLogo );
+        group->AppendL( iVisualControl );
         }
 
     iIdleController = CFMRadioIdleController::NewL();
@@ -280,9 +280,8 @@
     
     UpdateTextColorFromSkin();
     SizeChanged();
-    //Make the control group active on the display        
+    // Make the control group active on the display
 	display->Roster().ShowL( *group );
-	display->SetClearBackgroundL( CAlfDisplay::EClearWithSkinBackground );		
     }
 
 // --------------------------------------------------------------------------------
@@ -658,6 +657,9 @@
     iVisualControl->SetStationInformationTextColor( color );
     iMediaIdle->SetPrimaryColor( color );
     iRdsViewer->SetTextColor( color );
+    iRdsIndicator->SetTextColor( color );
+    iRdsAfIndicator->SetTextColor( color );
+    iRdsInteractionIndicator->SetTextColor( color );
     
     AknsUtils::GetCachedColor( skin, color, KAknsIIDQsnTextColors, EAknsCIQsnTextColorsCG10 );
     
--- a/fmradio/fmradio/src/fmradiomainview.cpp	Fri Mar 12 15:42:47 2010 +0200
+++ b/fmradio/fmradio/src/fmradiomainview.cpp	Mon Mar 15 12:40:34 2010 +0200
@@ -200,7 +200,7 @@
     CFMRadioAppUi* appUi = static_cast<CFMRadioAppUi*>( iCoeEnv->AppUi() );
     
     TInt presetIndex = iRadioEngine->GetPresetIndex();
-    TInt channelCount = iObserver.Channels()->Count();
+    TInt channelCount = iObserver.Channels().Count();
     
     if ( iRadioEngine->GetRadioMode() == CRadioEngine::ERadioPresetMode && 
             channelCount > 0 &&
@@ -393,7 +393,7 @@
                 TInt presetIndex = iRadioEngine->GetPresetIndex();
                 // When we haven't preset name, ps name will save as preset name
                 if ( iRadioEngine->GetRadioMode() == CRadioEngine::ERadioPresetMode &&
-                        presetIndex < iObserver.Channels()->Count() )
+                        presetIndex < iObserver.Channels().Count() )
                     {
                     presetIndexToDisplay = presetIndex;
                     }
@@ -417,7 +417,7 @@
         if ( aStatic )
             {
             // When we haven't got a name for preset, a static ps name will be saved
-            TInt channelCount = iObserver.Channels()->Count();
+            TInt channelCount = iObserver.Channels().Count();
             TInt currentPresetIx = iRadioEngine->GetPresetIndex();
             
             if ( aStatic && iRadioEngine->GetRadioMode() == CRadioEngine::ERadioPresetMode &&
@@ -425,14 +425,14 @@
                     channelCount > 0 &&
                     currentPresetIx < channelCount )
                 {
-                TDesC& stationName = iObserver.Channels()->At( currentPresetIx ).iChannelInformation;
-                TInt presetFreq = iObserver.Channels()->At( currentPresetIx ).iChannelFrequency;
+                const TDesC& stationName = iObserver.Channels()[ currentPresetIx ]->PresetName();
+                TInt presetFreq = iObserver.Channels()[ currentPresetIx ]->PresetFrequency();
         
                 if ( stationName.Length() == 0 && 
                         presetFreq != KErrNotFound && 
                         iRadioEngine->RdsReceiver().ProgrammeService().Length() )
                     {  
-                    iObserver.Channels()->At( currentPresetIx ).iChannelInformation = iRadioEngine->RdsReceiver().ProgrammeService();
+                    iObserver.Channels()[ currentPresetIx ]->SetPresetNameL( iRadioEngine->RdsReceiver().ProgrammeService() );
                     iObserver.UpdateChannelsL( EStoreIndexToRepository, currentPresetIx, 0 );
                     // Update station information display
                     DisplayChannelL( currentPresetIx );
@@ -460,8 +460,26 @@
 // CFMRadioMainView::RdsDataRadioTextPlus
 // ---------------------------------------------------------
 //
-void CFMRadioMainView::RdsDataRadioTextPlus( const TInt /*aRadioTextPlusClass*/, const TDesC& /*aRadioText*/ )
+void CFMRadioMainView::RdsDataRadioTextPlus( const TInt aRadioTextPlusClass, const TDesC& aRadioText )
     {
+    if ( aRadioTextPlusClass == ERTplusProgramHomepage &&
+            iRadioEngine->GetRadioMode() == CRadioEngine::ERadioPresetMode )
+        {
+        TInt currentPresetIx = iRadioEngine->GetPresetIndex();
+        
+        if ( currentPresetIx < iObserver.Channels().Count() )
+            {
+            TRAP_IGNORE
+                (
+                // save permanently
+                iRadioEngine->SaveUrlToPresetL( currentPresetIx, aRadioText );
+                // save to ui list
+                iObserver.Channels()[ currentPresetIx ]->SetPresetUrlL( aRadioText );
+                )
+            }
+        }
+    
+    
     if ( IsRTPlusInterActionIndicatorNeeded() )
         {
         iContainer->ShowRTPlusInteractionIndicator( ETrue, ETrue );
@@ -629,6 +647,12 @@
                                              stationName, 
                                              seekDirection, 
                                              channelFrequency );
+            
+            // show '+' indicator if channel exists and url is stored
+            if ( channelNumber && iObserver.Channels()[ aChannelIndex ]->PresetUrl().Length() )
+                {
+                iContainer->ShowRTPlusInteractionIndicator( ETrue, ETrue );
+                }
             }
         else
             {
@@ -727,6 +751,17 @@
              if ( appUi->EraseChannelL( iRadioEngine->GetPresetIndex() ) )
                  {
                  // delete has been confirmed, update station info
+                 if ( iContainer )
+                     {
+                     if ( IsRTPlusInterActionIndicatorNeeded() )
+                         {
+                         iContainer->ShowRTPlusInteractionIndicator( ETrue, ETrue );
+                         }
+                     else
+                         {
+                         iContainer->ShowRTPlusInteractionIndicator( EFalse, ETrue );
+                         }
+                     }
                  SetStationChangeType( EFMRadioStationChangeNone );
                  iRadioEngine->SetTunerModeOn();
                  DisplayChannelL( KErrNotFound );
@@ -765,12 +800,28 @@
 // ----------------------------------------
 void CFMRadioMainView::LaunchBrowserL( TInt aCommandId )
     {
+    FTRACE( FPrint(_L("CFMRadioMainView::LaunchBrowserL") ) );
+    
     CFMRadioRdsReceiverBase& receiver = iRadioEngine->RdsReceiver();
     switch ( aCommandId )
         {
         case EMPXPbvCmdInternetGoToWeb:
-            iMusicStoreHandler->LaunchWebPageL( receiver.RtPlusProgramUrl() );
+            {
+            RBuf webLinkToLaunch;
+            webLinkToLaunch.CleanupClosePushL();
+            if ( receiver.RtPlusProgramUrl().Length() )
+                {
+                webLinkToLaunch.CreateL( receiver.RtPlusProgramUrl() );
+                }           
+            else if ( iRadioEngine->GetRadioMode() == CRadioEngine::ERadioPresetMode )
+                {
+                webLinkToLaunch.CreateL(
+                        iObserver.Channels()[ iRadioEngine->GetPresetIndex() ]->PresetUrl() );
+                }
+            iMusicStoreHandler->LaunchWebPageL( webLinkToLaunch );
+            CleanupStack::PopAndDestroy( &webLinkToLaunch );
             break;
+            }
         default:
             iMusicStoreHandler->LaunchMusicStoreL( aCommandId, 
                                                    receiver.RtPlusSong(),
@@ -1342,12 +1393,27 @@
 TBool CFMRadioMainView::IsWebLinkAvailable()
     {
     TBool response = EFalse;
+    TBool webLinkStored = EFalse;
+    TInt presetIndex = iRadioEngine->GetPresetIndex();
+    
+    if ( iRadioEngine->GetRadioMode() == CRadioEngine::ERadioPresetMode &&
+            presetIndex < iObserver.Channels().Count() )
+        {
+        if ( iObserver.Channels()[ presetIndex ]->PresetUrl().Length() )
+            {
+            webLinkStored = ETrue;
+            }
+        }
+
     CFMRadioRdsReceiverBase& receiver = iRadioEngine->RdsReceiver();
-    if ( receiver.RtPlusProgramUrl().Length() && 
-         iRadioEngine->GetRTPlusSupportLevel() == EFMRadioAllInteractions )
+    
+    if ( ( receiver.RtPlusProgramUrl().Length() || 
+            webLinkStored ) && 
+            iRadioEngine->GetRTPlusSupportLevel() == EFMRadioAllInteractions )
         {
         response = ETrue;
         }
+    
     return response;
     }
 
--- a/fmradio/fmradio/src/fmradiopreset.cpp	Fri Mar 12 15:42:47 2010 +0200
+++ b/fmradio/fmradio/src/fmradiopreset.cpp	Mon Mar 15 12:40:34 2010 +0200
@@ -60,6 +60,7 @@
 CFMRadioPreset::~CFMRadioPreset()
     {
     iStationName.Close();
+    iStationUrl.Close();
     }
 
 // ---------------------------------------------------------------------------
@@ -76,7 +77,7 @@
 // CFMRadioPreset::PresetName
 // ---------------------------------------------------------------------------
 //
-TDesC& CFMRadioPreset::PresetName()
+const TDesC& CFMRadioPreset::PresetName()
     {
     return iStationName;
     }
@@ -116,3 +117,22 @@
     {
     return iStationFrequency;
     }
+
+// ---------------------------------------------------------------------------
+// CFMRadioPreset::SetPresetUrlL
+// ---------------------------------------------------------------------------
+//
+void CFMRadioPreset::SetPresetUrlL( const TDesC& aUrl )
+    {
+    iStationUrl.Close();
+    iStationUrl.CreateL( aUrl );
+    }
+
+// ---------------------------------------------------------------------------
+// CFMRadioPreset::PresetUrl
+// ---------------------------------------------------------------------------
+//
+const TDesC& CFMRadioPreset::PresetUrl()
+    {
+    return iStationUrl;
+    }
--- a/fmradio/fmradio/src/fmradioscanlocalstationsview.cpp	Fri Mar 12 15:42:47 2010 +0200
+++ b/fmradio/fmradio/src/fmradioscanlocalstationsview.cpp	Mon Mar 15 12:40:34 2010 +0200
@@ -174,13 +174,8 @@
         {
         case EAknSoftkeyBack: // go back to the main view
             {
-            const TVwsViewId viewId( TUid::Uid( KUidFMRadioApplication ), Id() );
-            if ( appUi->BackSteppingWrapper().HandleBackCommandL( viewId ) )
-                {
-                // Command was   consumed
-                break;
-                }
-            // Fall through to activate previous view
+            appUi->ActivateLocalViewL( KFMRadioChannelListViewId );
+            break;
             }
         case EEikBidCancel:
             {
@@ -1172,14 +1167,14 @@
 	
 	TInt savedChannelCount = 0;	
 	
-	if( aSavingMode == EAppend ) 
-		{
-		/** Append found channels to preset list */		
-		for( TInt freqIx = 0; KMaxNumberOfChannelListItems > iObserver.Channels()->Count() && 
+    if ( aSavingMode == EAppend ) 
+        {
+        /** Append found channels to preset list */		
+        for ( TInt freqIx = 0; KMaxNumberOfChannelListItems > iObserver.Channels().Count() && 
             chCount > freqIx; freqIx++ )
-			{
-			const TDesC& name = iScannedChannels[ freqIx ]->PresetNameValid() ? 
-			        iScannedChannels[ freqIx ]->PresetName() : KNullDesC;
+            {
+            const TDesC& name = iScannedChannels[ freqIx ]->PresetNameValid() ? 
+                    iScannedChannels[ freqIx ]->PresetName() : KNullDesC;
 
 		    iObserver.AddChannelToListL( name,
                                          iScannedChannels[ freqIx ]->PresetFrequency() );
@@ -1507,9 +1502,9 @@
 //
 void CFMRadioScanLocalStationsView::HandleOneChannelSaveL()
     {    
-    TInt currentPresetCount = iObserver.Channels()->Count();
+    TInt currentPresetCount = iObserver.Channels().Count();
     TInt chIndex = iContainer->CurrentlySelectedChannel();
-    TBool continueWithSave = ETrue;    
+    TBool continueWithSave = ETrue;
     
     if ( !ChannelInUse( chIndex ) )
         {
--- a/fmradio/fmradioengine/bwins/fmradioengineacu.def	Fri Mar 12 15:42:47 2010 +0200
+++ b/fmradio/fmradioengine/bwins/fmradioengineacu.def	Mon Mar 15 12:40:34 2010 +0200
@@ -71,4 +71,7 @@
 	?PublishRDSRadioTextL@CFMRadioPubSub@@QBEXABVTDesC16@@@Z @ 70 NONAME ; void CFMRadioPubSub::PublishRDSRadioTextL(class TDesC16 const &) const
 	?RtPlusProgramUrl@CFMRadioRdsReceiverBase@@QBEABVTDesC16@@XZ @ 71 NONAME ; class TDesC16 const & CFMRadioRdsReceiverBase::RtPlusProgramUrl(void) const
 	?SetTunerModeOn@CRadioEngine@@QAEXXZ @ 72 NONAME ; void CRadioEngine::SetTunerModeOn(void)
+	?PresetUrlL@CRadioEngine@@QAEHHAAVTDes16@@@Z @ 73 NONAME ; int CRadioEngine::PresetUrlL(int, class TDes16 &)
+	?DeletePresetL@CRadioEngine@@QAEXH@Z @ 74 NONAME ; void CRadioEngine::DeletePresetL(int)
+	?SaveUrlToPresetL@CRadioEngine@@QAEXHABVTDesC16@@@Z @ 75 NONAME ; void CRadioEngine::SaveUrlToPresetL(int, class TDesC16 const &)
 
--- a/fmradio/fmradioengine/eabi/fmradioengineacu.def	Fri Mar 12 15:42:47 2010 +0200
+++ b/fmradio/fmradioengine/eabi/fmradioengineacu.def	Mon Mar 15 12:40:34 2010 +0200
@@ -87,4 +87,7 @@
 	_ZTV25CCentralRepositoryHandler @ 86 NONAME
 	_ZTV25CFMRadioAccessoryObserver @ 87 NONAME
 	_ZTV27CFMRadioSystemEventDetector @ 88 NONAME
+	_ZN12CRadioEngine10PresetUrlLEiR6TDes16 @ 89 NONAME
+	_ZN12CRadioEngine13DeletePresetLEi @ 90 NONAME
+	_ZN12CRadioEngine16SaveUrlToPresetLEiRK7TDesC16 @ 91 NONAME
 
--- a/fmradio/fmradioengine/group/fmradioengine.mmp	Fri Mar 12 15:42:47 2010 +0200
+++ b/fmradio/fmradioengine/group/fmradioengine.mmp	Mon Mar 15 12:40:34 2010 +0200
@@ -68,7 +68,6 @@
 SYSTEMINCLUDE   /epoc32/include/internal
 #endif // __FMRADIO_ADVANCED_AUTO_RESUME
 
-LIBRARY accmonitor.lib
 LIBRARY radio_utility.lib
 LIBRARY fmpresetutility.lib
 LIBRARY cenrepnotifhandler.lib
--- a/fmradio/fmradioengine/inc/fmradioengine.h	Fri Mar 12 15:42:47 2010 +0200
+++ b/fmradio/fmradioengine/inc/fmradioengine.h	Mon Mar 15 12:40:34 2010 +0200
@@ -21,7 +21,6 @@
 #define FMRADIOENGINE_H
 
 #include <e32base.h>
-#include <AccMonitorCapabilities.h>
 #include <fmradiointernalpskeys.h>
 #include <RadioUtility.h>
 #include <RadioFmTunerUtility.h>
@@ -724,6 +723,27 @@
      */    
     IMPORT_C void SetCurrentPresetIndex( const TInt aIndex );
     
+    /* Gets saved preset url.
+     * @param aIndex channel index
+     * @param aUrl string to be modified with saved url
+     * @return error code. KErrNotFound if no url is saved or KErrOverflow
+     * if the aUrl is not big enough. See TFmPresetName
+     */
+    IMPORT_C TInt PresetUrlL( TInt aIndex, TDes& aUrl );
+    
+    /*
+     * Delete preset. With index -1 all preset are reseted
+     * @param aIndex index to delete
+     */
+    IMPORT_C void DeletePresetL( TInt aIndex ); 
+    
+    /*
+     * Saves given url to preset
+     * @param aIndex channel index
+     * @param aUrl url to save 
+     */
+    IMPORT_C void SaveUrlToPresetL( TInt aIndex, const TDesC& aUrl );
+    
 private:
 
     /**
@@ -748,17 +768,6 @@
      */
     void StoreAndPublishFrequency( TInt aFrequency );
     
-    /**
-     * Scans all current presets and sets stored frequencies to KErrNotFound
-     * if the preset name is empty.
-     */
-    void ResetPresetsL();
-    
-    /**
-     * Resolves if BT audio accessory is connected
-     * @return ETrue if BT Audio connected
-     */
-    TBool IsBTAccessoryConnectedL();
 private:
 
    //the internal radio engine states
--- a/fmradio/fmradioengine/src/fmradioaccessoryobserver.cpp	Fri Mar 12 15:42:47 2010 +0200
+++ b/fmradio/fmradioengine/src/fmradioaccessoryobserver.cpp	Mon Mar 15 12:40:34 2010 +0200
@@ -101,6 +101,7 @@
         case EAccModeWiredHeadset:    // Falls through.
         case EAccModeLoopset:         // Falls through.
         case EAccModeHeadphones:
+        case EAccModeMusicStand:
             {
             accessoryConnected = ETrue;
 	        break;
--- a/fmradio/fmradioengine/src/fmradioengine.cpp	Fri Mar 12 15:42:47 2010 +0200
+++ b/fmradio/fmradioengine/src/fmradioengine.cpp	Mon Mar 15 12:40:34 2010 +0200
@@ -169,12 +169,7 @@
     
     iPubSub->PublishFrequencyDecimalCountL( 
             TFMRadioPSFrequencyDecimalCount( iRadioSettings->DecimalCount() ) );
-    
-    if ( iRadioSettings->StartupCount() == 0 )
-        {
-        ResetPresetsL();
-        }
-    
+
     FTRACE(FPrint(_L("CRadioEngine::ConstructL() End ")));
     }
     
@@ -809,13 +804,6 @@
     // use mute here to avoid any audio peaks during output change
     SetMuteOn( ETrue );
 
-    TBool btAudioConnected = EFalse;
-    TRAPD( err, btAudioConnected = IsBTAccessoryConnectedL(); )
-    if ( err != KErrNone )
-        {
-        btAudioConnected = ETrue;
-        }
-    
 #ifndef __ACCESSORY_FW
 
     tempError = iDosServerObserver->SetAudioRouting(aAudioOutput);
@@ -825,12 +813,7 @@
 
     CAudioOutput::TAudioOutputPreference outputPreference = CAudioOutput::EPrivate;
 
-    if( btAudioConnected && !iHeadsetObserver->IsHeadsetAccessoryConnected() )
-        {
-        FTRACE(FPrint(_L("CRadioEngine::SetAudioOutput() EPublic don't route to BT")));
-        outputPreference = CAudioOutput::EPublic;
-        }
-    else if ( EFMRadioOutputHeadset == aAudioOutput )
+    if ( EFMRadioOutputHeadset == aAudioOutput )
         {
         FTRACE(FPrint(_L("CRadioEngine::SetAudioOutput() Headset is set to Output")));
         outputPreference = CAudioOutput::EPrivate;
@@ -839,10 +822,6 @@
         {
         FTRACE(FPrint(_L("CRadioEngine::SetAudioOutput() IHF is set to Output")));
         
-        if ( iHeadsetObserver->IsHeadsetAccessoryConnected() )
-            { //user has chosen 'Activate IHF' in options menu
-            iHFOptionActivated = ETrue;
-            }
         outputPreference = CAudioOutput::EPublic;
         }
 
@@ -1025,14 +1004,7 @@
     {
     FTRACE(FPrint(_L("CRadioEngine::HeadsetAccessoryConnectedCallbackL")));
     // forward volume changes to headset
-    if ( iHFOptionActivated )
-    	{
-    	iHFOptionActivated = EFalse;
-    	}
-    else
-    	{
-        SetAudioOutput( EFMRadioOutputHeadset );
-    	}
+    SetAudioOutput( EFMRadioOutputHeadset );
     }
 
 // ----------------------------------------------------
@@ -2011,66 +1983,55 @@
     }
 
 // ---------------------------------------------------------------------------
-// CRadioEngine::ResetPresetsL
-// initialize channel frequencies
+// CRadioEngine::PresetUrlL
 // ---------------------------------------------------------------------------
 //
-void CRadioEngine::ResetPresetsL()
+EXPORT_C TInt CRadioEngine::PresetUrlL( TInt aIndex, TDes& aUrl )
     {
-    FTRACE( FPrint( _L("CRadioEngine::ResetPresetsL()" ) ) );
-    TInt maxNumberOfPresets;
-    TStationName channelName;
-    TInt channelFrequency;
+    FTRACE( FPrint( _L("CRadioEngine::PresetUrlL( Index %d, url: %S)"), aIndex, &aUrl ) );
+    TInt err = KErrNone;
+    TFmPresetUrl presetUrl;
     
-    iPresetUtility->GetMaxNumberOfPresets( maxNumberOfPresets );
-
-    for ( TInt i = 0; i < maxNumberOfPresets; i++ )
+    if ( presetUrl.MaxLength() <= aUrl.MaxLength() )
         {
-        iPresetUtility->GetPresetL( i, channelName, channelFrequency );
-        
-        if ( channelName.Length() == 0 && channelFrequency != KErrNotFound )
+        iPresetUtility->GetPresetUrlL( aIndex, presetUrl );
+        aUrl.Copy( presetUrl );
+        if ( !aUrl.Length() )
             {
-            // set empty name and frequency to KErrNotFound
-            iPresetUtility->SetPresetL( i, channelName, KErrNotFound );
-            }
+            err = KErrNotFound;
+            }            
         }
+    else
+        {
+        err = KErrOverflow;
+        }
+    return err;
     }
 
 // ---------------------------------------------------------------------------
-// CRadioEngine::IsBTAccessoryConnectedL
-// Returns ETrue if queried accessory is connected
+// CRadioEngine::DeletePresetL
+// Delete preset. With index -1 all preset are reseted
 // ---------------------------------------------------------------------------
 //
-TBool CRadioEngine::IsBTAccessoryConnectedL ( )
+EXPORT_C void CRadioEngine::DeletePresetL( TInt aIndex )
     {
-    FTRACE(FPrint(_L("CRadioEngine::IsBTAccessoryConnectedL ()" ) ) );
-    TBool result = EFalse;
-    CAccMonitor* accMonitor = CAccMonitor::NewLC();
+    FTRACE( FPrint( _L("CRadioEngine::DeletePresetL( i: %d )"), aIndex ) );
+    iPresetUtility->DeletePresetL( aIndex );
+    }
 
-    RConnectedAccessories connectedAccessories;
-    CleanupClosePushL( connectedAccessories );
-
-    accMonitor->GetConnectedAccessoriesL( connectedAccessories );
-    CAccMonitorInfo* accInfo = CAccMonitorInfo::NewLC();
-    TInt countOfArray = connectedAccessories.Count();
-
-    for( TInt i = 0; i != countOfArray; i++ )
+// ---------------------------------------------------------------------------
+// CRadioEngine::SaveUrlToCurrentPresetL
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CRadioEngine::SaveUrlToPresetL( TInt aIndex, const TDesC& aUrl )
+    {
+    FTRACE( FPrint( _L("CRadioEngine::SaveUrlToCurrentPresetL( i: %d Url: %S)"), aIndex, &aUrl ) );
+    TFmPresetUrl presetUrl;
+    if ( aUrl.Length() <= presetUrl.MaxLength() )
         {
-        TAccMonCapability connectionType = connectedAccessories[ i ]->AccPhysicalConnection();
-        if( connectionType == KAccMonBluetooth )
-           {
-           accInfo->CopyL( connectedAccessories[ i ] );
-           if ( accInfo->Exists(KAccMonStereoAudio) ||
-                    accInfo->Exists(KAccMonMonoAudio) )
-               {
-               result = ETrue;
-               }
-           }
+        presetUrl.Copy( aUrl );
+        iPresetUtility->SetPresetUrlL( aIndex, presetUrl );
         }
-    // Destroy the pointers from the array, because those are owned by the client
-    CleanupStack::PopAndDestroy( accInfo );
-    CleanupStack::PopAndDestroy( &connectedAccessories );
-    CleanupStack::PopAndDestroy( accMonitor );
-    return result;
     }
+
 // End of file
--- a/fmradio/fmradiomcpplugin/src/fmradiomcpplugin.cpp	Fri Mar 12 15:42:47 2010 +0200
+++ b/fmradio/fmradiomcpplugin/src/fmradiomcpplugin.cpp	Mon Mar 15 12:40:34 2010 +0200
@@ -227,10 +227,10 @@
                     EMbmFmradioQgn_indi_radio_default_mask);
 
     iObserver->PublishImageL( this, EMusicWidgetImage1,
-                    KAknsIIDQgnIndiRadioDefault, 
-                    iMifFileName, 
-                    EMbmFmradioQgn_indi_radio_default, 
-                    EMbmFmradioQgn_indi_radio_default_mask);
+                    KAknsIIDNone,
+                    iMifFileName,
+                    EMbmFmradioQgn_menu_radio,
+                    EMbmFmradioQgn_menu_radio_mask );
 
     InstallFMRadioCommandActionL( KFMRadioCommandValueStartNowPlaying, EMusicWidgetTrigger1 );
     InstallFMRadioCommandActionL( KFMRadioCommandValueStartNowPlaying, EMusicMenuMusicInfoTrigger );