Revision: 201015
authorDremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Mon, 03 May 2010 13:22:43 +0300
changeset 19 f5bac0badc7e
parent 14 83d2d132aa58
child 21 6ce30188c5bf
Revision: 201015 Kit: 201018
rom/alfred.iby
uiaccelerator_plat/alf_client_server_api/inc/alf/alfappserver.h
uiaccelerator_plat/alf_client_server_api/inc/alf/alfappui.h
uiaccelerator_plat/alf_client_server_api/inc/alf/alfdirectclient.h
uiaccelerator_plat/alf_core_toolkit_api/inc/uiacceltk/HuiCanvasVisual.h
uiaccelerator_plat/alf_core_toolkit_api/inc/uiacceltk/HuiSkin.h
uiaccelerator_plat/alf_visual_api/inc/alf/alfcompositionclient.h
uiaccelerator_plat/alf_visual_api/inc/alf/alfcompositionutility.h
uiaccelerator_plat/alf_visual_api/inc/goommonitor/goommonitorplugin.h
uiacceltk/hitchcock/AlfDecoderServerClient/bwins/alfdecoderserverclientu.def
uiacceltk/hitchcock/AlfDecoderServerClient/eabi/alfdecoderserverclientu.def
uiacceltk/hitchcock/AlfDecoderServerClient/src/alfcompositionclient.cpp
uiacceltk/hitchcock/AlfDecoderServerClient/src/alfdecoderserverclient.cpp
uiacceltk/hitchcock/AlfRenderStage/src/alfrenderstage.cpp
uiacceltk/hitchcock/AlfRenderStage/src/alfrssendbuffer.cpp
uiacceltk/hitchcock/Client/BWINS/alfclientu.DEF
uiacceltk/hitchcock/Client/eabi/alfclientu.DEF
uiacceltk/hitchcock/Client/src/alfdirectclient.cpp
uiacceltk/hitchcock/Client/src/alfdrawer.cpp
uiacceltk/hitchcock/CommonInc/alfdecoderserverclient.h
uiacceltk/hitchcock/CommonInc/alfdrawerinternal.h
uiacceltk/hitchcock/CommonInc/alfmoduletest.h
uiacceltk/hitchcock/CommonInc/alfmoduletestconf.h
uiacceltk/hitchcock/CommonInc/alfmoduletestconsts.h
uiacceltk/hitchcock/CommonInc/alfmoduletestdefines.h
uiacceltk/hitchcock/CommonInc/alfmoduletestitem.h
uiacceltk/hitchcock/CommonInc/alfmoduletestmap.h
uiacceltk/hitchcock/CommonInc/alfmoduletesttype.h
uiacceltk/hitchcock/ServerCore/Inc/alfbridge.h
uiacceltk/hitchcock/ServerCore/Inc/alfeffectutils.h
uiacceltk/hitchcock/ServerCore/Inc/alfhierarchymodel.h
uiacceltk/hitchcock/ServerCore/Inc/alfnodes.h
uiacceltk/hitchcock/ServerCore/Inc/alfstreamerbridge.h
uiacceltk/hitchcock/ServerCore/Inc/alfstreamerconsts.h
uiacceltk/hitchcock/ServerCore/Inc/alfstreamerserver.h
uiacceltk/hitchcock/ServerCore/Src/alfappserver.cpp
uiacceltk/hitchcock/ServerCore/Src/alfappservercore.mmp
uiacceltk/hitchcock/ServerCore/Src/alfappsrvsession.cpp
uiacceltk/hitchcock/ServerCore/Src/alfappui.cpp
uiacceltk/hitchcock/ServerCore/Src/alfbridge.cpp
uiacceltk/hitchcock/ServerCore/Src/alfeffectutils.cpp
uiacceltk/hitchcock/ServerCore/Src/alfhierarchymodel.cpp
uiacceltk/hitchcock/ServerCore/Src/alfnodes.cpp
uiacceltk/hitchcock/ServerCore/Src/alfsrvdisplaysubsession.cpp
uiacceltk/hitchcock/ServerCore/Src/alfstreamerbridge.cpp
uiacceltk/hitchcock/ServerCore/Src/alfstreamerserver.cpp
uiacceltk/hitchcock/backgroundanim/inc/bganimhost.h
uiacceltk/hitchcock/backgroundanim/src/bganimhost.cpp
uiacceltk/hitchcock/coretoolkit/BWINS/hitchcocku.DEF
uiacceltk/hitchcock/coretoolkit/eabi/hitchcocku.DEF
uiacceltk/hitchcock/coretoolkit/inc/HuiFxConstants.h
uiacceltk/hitchcock/coretoolkit/inc/HuiFxEffect.h
uiacceltk/hitchcock/coretoolkit/inc/HuiFxEffectCache.h
uiacceltk/hitchcock/coretoolkit/inc/HuiFxEffectParser.h
uiacceltk/hitchcock/coretoolkit/inc/HuiFxEngine.h
uiacceltk/hitchcock/coretoolkit/inc/HuiFxGroupLayer.h
uiacceltk/hitchcock/coretoolkit/inc/HuiFxLayer.h
uiacceltk/hitchcock/coretoolkit/inc/HuiFxParameter.inl
uiacceltk/hitchcock/coretoolkit/inc/HuiFxVisualLayer.h
uiacceltk/hitchcock/coretoolkit/inc/huiextension.h
uiacceltk/hitchcock/coretoolkit/inc/huistatictlsdata.h
uiacceltk/hitchcock/coretoolkit/rendervg10/inc/HuiFxVg10OnscreenRenderbuffer.h
uiacceltk/hitchcock/coretoolkit/rendervg10/inc/HuiVg10Gc.h
uiacceltk/hitchcock/coretoolkit/rendervg10/src/HuiFxVg10OnscreenRenderbuffer.cpp
uiacceltk/hitchcock/coretoolkit/rendervg10/src/HuiVg10Gc.cpp
uiacceltk/hitchcock/coretoolkit/src/HuiCanvasTextureCache.cpp
uiacceltk/hitchcock/coretoolkit/src/HuiCanvasVisual.cpp
uiacceltk/hitchcock/coretoolkit/src/HuiDisplay.cpp
uiacceltk/hitchcock/coretoolkit/src/HuiFxEffect.cpp
uiacceltk/hitchcock/coretoolkit/src/HuiFxEffectCache.cpp
uiacceltk/hitchcock/coretoolkit/src/HuiFxEffectParser.cpp
uiacceltk/hitchcock/coretoolkit/src/HuiFxEngine.cpp
uiacceltk/hitchcock/coretoolkit/src/HuiFxFilterLayer.cpp
uiacceltk/hitchcock/coretoolkit/src/HuiFxGroupLayer.cpp
uiacceltk/hitchcock/coretoolkit/src/HuiFxVisualLayer.cpp
uiacceltk/hitchcock/coretoolkit/src/HuiRosterImpl.cpp
uiacceltk/hitchcock/coretoolkit/src/HuiS60Skin.cpp
uiacceltk/hitchcock/coretoolkit/src/HuiSkin.cpp
uiacceltk/hitchcock/coretoolkit/src/HuiStatic.cpp
uiacceltk/hitchcock/coretoolkit/src/huicanvasgc.cpp
uiacceltk/hitchcock/coretoolkit/src/huigifanimationtexture.cpp
uiacceltk/hitchcock/goommonitor/data/goomconfig.xml
uiacceltk/hitchcock/goommonitor/inc/goomaction.h
uiacceltk/hitchcock/goommonitor/inc/goomactionlist.h
uiacceltk/hitchcock/goommonitor/inc/goomapplicationconfig.h
uiacceltk/hitchcock/goommonitor/inc/goomcloseapp.h
uiacceltk/hitchcock/goommonitor/inc/goomrunplugin.h
uiacceltk/hitchcock/goommonitor/inc/goomrunplugin.inl
uiacceltk/hitchcock/goommonitor/inc/goomrunpluginconfig.h
uiacceltk/hitchcock/goommonitor/inc/goomrunpluginconfig.inl
uiacceltk/hitchcock/goommonitor/inc/traceconfiguration.hrh
uiacceltk/hitchcock/goommonitor/src/goomactionlist.cpp
uiacceltk/hitchcock/goommonitor/src/goomcloseapp.cpp
uiacceltk/hitchcock/goommonitor/src/goomconfigparser.cpp
uiacceltk/hitchcock/goommonitor/src/goommemorymonitor.cpp
uiacceltk/hitchcock/goommonitor/src/goommonitorplugin.cpp
uiacceltk/hitchcock/goommonitor/src/goomrunplugin.cpp
uiacceltk/hitchcock/goommonitor/src/goomwindowgrouplist.cpp
uiacceltk/hitchcock/group/core_exports.inc
uiacceltk/hitchcock/plugins/alfoogmplugin/src/alfoogmplugin.cpp
uiacceltk/hitchcock/plugins/alftranseffect/alfgfxtransadapter/src/gfxtransenginetfx.cpp
uiacceltk/hitchcock/plugins/alftranseffect/alftranseffectplugin/inc/alfserverdrawer.h
uiacceltk/hitchcock/plugins/alftranseffect/alftranseffectplugin/src/alfgfxeffects.cpp
uiacceltk/hitchcock/plugins/alftranseffect/alftranseffectplugin/src/alfserverdrawer.cpp
uiacceltk/hitchcock/plugins/openwfcrs/inc/screencaptureutil.h
--- a/rom/alfred.iby	Fri Apr 16 15:56:24 2010 +0300
+++ b/rom/alfred.iby	Mon May 03 13:22:43 2010 +0300
@@ -81,18 +81,23 @@
 
 // Effect fxmls. Keep the list in alphabetical order. When updating the list below, REMEMBER TO ALSO UPDATE core_exports.inc!
 data=DATAZ_/RESOURCE_FILES_DIR/effects/activeidle_viewswitch_add_page.fxml RESOURCE_FILES_DIR/effects/activeidle_viewswitch_add_page.fxml
-data=DATAZ_/RESOURCE_FILES_DIR/effects/activeidle_viewswitch_bg_appear.fxml RESOURCE_FILES_DIR/effects/activeidle_viewswitch_bg_appear.fxml
+data=DATAZ_/RESOURCE_FILES_DIR/effects/activeidle_viewswitch_bg_anim_to_image.fxml RESOURCE_FILES_DIR/effects/activeidle_viewswitch_bg_anim_to_image.fxml
+data=DATAZ_/RESOURCE_FILES_DIR/effects/activeidle_viewswitch_bg_image_to_image.fxml RESOURCE_FILES_DIR/effects/activeidle_viewswitch_bg_image_to_image.fxml
 data=DATAZ_/RESOURCE_FILES_DIR/effects/activeidle_viewswitch_close_editmode.fxml RESOURCE_FILES_DIR/effects/activeidle_viewswitch_close_editmode.fxml
 data=DATAZ_/RESOURCE_FILES_DIR/effects/activeidle_viewswitch_close_widgetmanager.fxml RESOURCE_FILES_DIR/effects/activeidle_viewswitch_close_widgetmanager.fxml
 data=DATAZ_/RESOURCE_FILES_DIR/effects/activeidle_viewswitch_left.fxml RESOURCE_FILES_DIR/effects/activeidle_viewswitch_left.fxml
-data=DATAZ_/RESOURCE_FILES_DIR/effects/activeidle_viewswitch_left_appear.fxml RESOURCE_FILES_DIR/effects/activeidle_viewswitch_left_appear.fxml
-data=DATAZ_/RESOURCE_FILES_DIR/effects/activeidle_viewswitch_left_disappear.fxml RESOURCE_FILES_DIR/effects/activeidle_viewswitch_left_disappear.fxml
+data=DATAZ_/RESOURCE_FILES_DIR/effects/activeidle_viewswitch_left_appear_prt.fxml RESOURCE_FILES_DIR/effects/activeidle_viewswitch_left_appear_prt.fxml
+data=DATAZ_/RESOURCE_FILES_DIR/effects/activeidle_viewswitch_left_appear_lsc.fxml RESOURCE_FILES_DIR/effects/activeidle_viewswitch_left_appear_lsc.fxml
+data=DATAZ_/RESOURCE_FILES_DIR/effects/activeidle_viewswitch_left_disappear_prt.fxml RESOURCE_FILES_DIR/effects/activeidle_viewswitch_left_disappear_prt.fxml
+data=DATAZ_/RESOURCE_FILES_DIR/effects/activeidle_viewswitch_left_disappear_lsc.fxml RESOURCE_FILES_DIR/effects/activeidle_viewswitch_left_disappear_lsc.fxml
 data=DATAZ_/RESOURCE_FILES_DIR/effects/activeidle_viewswitch_open_editmode.fxml RESOURCE_FILES_DIR/effects/activeidle_viewswitch_open_editmode.fxml
 data=DATAZ_/RESOURCE_FILES_DIR/effects/activeidle_viewswitch_open_widgetmanager.fxml RESOURCE_FILES_DIR/effects/activeidle_viewswitch_open_widgetmanager.fxml
 data=DATAZ_/RESOURCE_FILES_DIR/effects/activeidle_viewswitch_remove_page.fxml RESOURCE_FILES_DIR/effects/activeidle_viewswitch_remove_page.fxml
 data=DATAZ_/RESOURCE_FILES_DIR/effects/activeidle_viewswitch_right.fxml RESOURCE_FILES_DIR/effects/activeidle_viewswitch_right.fxml
-data=DATAZ_/RESOURCE_FILES_DIR/effects/activeidle_viewswitch_right_appear.fxml RESOURCE_FILES_DIR/effects/activeidle_viewswitch_right_appear.fxml
-data=DATAZ_/RESOURCE_FILES_DIR/effects/activeidle_viewswitch_right_disappear.fxml RESOURCE_FILES_DIR/effects/activeidle_viewswitch_right_disappear.fxml
+data=DATAZ_/RESOURCE_FILES_DIR/effects/activeidle_viewswitch_right_appear_prt.fxml RESOURCE_FILES_DIR/effects/activeidle_viewswitch_right_appear_prt.fxml
+data=DATAZ_/RESOURCE_FILES_DIR/effects/activeidle_viewswitch_right_appear_lsc.fxml RESOURCE_FILES_DIR/effects/activeidle_viewswitch_right_appear_lsc.fxml
+data=DATAZ_/RESOURCE_FILES_DIR/effects/activeidle_viewswitch_right_disappear_prt.fxml RESOURCE_FILES_DIR/effects/activeidle_viewswitch_right_disappear_prt.fxml
+data=DATAZ_/RESOURCE_FILES_DIR/effects/activeidle_viewswitch_right_disappear_lsc.fxml RESOURCE_FILES_DIR/effects/activeidle_viewswitch_right_disappear_lsc.fxml
 data=DATAZ_/RESOURCE_FILES_DIR/effects/app_activate.fxml RESOURCE_FILES_DIR/effects/app_activate.fxml
 data=DATAZ_/RESOURCE_FILES_DIR/effects/app_exit.fxml RESOURCE_FILES_DIR/effects/app_exit.fxml
 data=DATAZ_/RESOURCE_FILES_DIR/effects/app_start.fxml RESOURCE_FILES_DIR/effects/app_start.fxml
@@ -133,10 +138,10 @@
 data=DATAZ_/RESOURCE_FILES_DIR/effects/optionsmenu_cascade_appear.fxml RESOURCE_FILES_DIR/effects/optionsmenu_cascade_appear.fxml
 data=DATAZ_/RESOURCE_FILES_DIR/effects/optionsmenu_cascade_disappear.fxml RESOURCE_FILES_DIR/effects/optionsmenu_cascade_disappear.fxml
 data=DATAZ_/RESOURCE_FILES_DIR/effects/optionsmenu_disappear.fxml RESOURCE_FILES_DIR/effects/optionsmenu_disappear.fxml
+data=DATAZ_/RESOURCE_FILES_DIR/effects/photos_fullscreen_close.fxml RESOURCE_FILES_DIR/effects/photos_fullscreen_close.fxml
+data=DATAZ_/RESOURCE_FILES_DIR/effects/photos_fullscreen_open.fxml RESOURCE_FILES_DIR/effects/photos_fullscreen_open.fxml
 data=DATAZ_/RESOURCE_FILES_DIR/effects/photos_gridview_appear.fxml RESOURCE_FILES_DIR/effects/photos_gridview_appear.fxml
 data=DATAZ_/RESOURCE_FILES_DIR/effects/photos_gridview_disappear.fxml RESOURCE_FILES_DIR/effects/photos_gridview_disappear.fxml
-data=DATAZ_/RESOURCE_FILES_DIR/effects/photos_fullscreen_close.fxml RESOURCE_FILES_DIR/effects/photos_fullscreen_close.fxml
-data=DATAZ_/RESOURCE_FILES_DIR/effects/photos_fullscreen_open.fxml RESOURCE_FILES_DIR/effects/photos_fullscreen_open.fxml
 data=DATAZ_/RESOURCE_FILES_DIR/effects/popup_appear.fxml RESOURCE_FILES_DIR/effects/popup_appear.fxml
 data=DATAZ_/RESOURCE_FILES_DIR/effects/popup_disappear.fxml RESOURCE_FILES_DIR/effects/popup_disappear.fxml
 data=DATAZ_/RESOURCE_FILES_DIR/effects/popup_disappear_screenshot.fxml RESOURCE_FILES_DIR/effects/popup_disappear_screenshot.fxml
@@ -148,7 +153,6 @@
 data=DATAZ_/RESOURCE_FILES_DIR/effects/systemnotify_appear.fxml RESOURCE_FILES_DIR/effects/systemnotify_appear.fxml
 data=DATAZ_/RESOURCE_FILES_DIR/effects/systemnotify_disappear.fxml RESOURCE_FILES_DIR/effects/systemnotify_disappear.fxml
 data=DATAZ_/RESOURCE_FILES_DIR/effects/tab_effect.fxml RESOURCE_FILES_DIR/effects/tab_effect.fxml
-data=DATAZ_/RESOURCE_FILES_DIR/effects/taskswapper_app_start_disappear.fxml RESOURCE_FILES_DIR/effects/taskswapper_app_start_disappear.fxml
 data=DATAZ_/RESOURCE_FILES_DIR/effects/taskswapper_app_start_rect.fxml RESOURCE_FILES_DIR/effects/taskswapper_app_start_rect.fxml
 data=DATAZ_/RESOURCE_FILES_DIR/effects/taskswapper_appear.fxml RESOURCE_FILES_DIR/effects/taskswapper_appear.fxml
 data=DATAZ_/RESOURCE_FILES_DIR/effects/taskswapper_disappear.fxml RESOURCE_FILES_DIR/effects/taskswapper_disappear.fxml
--- a/uiaccelerator_plat/alf_client_server_api/inc/alf/alfappserver.h	Fri Apr 16 15:56:24 2010 +0300
+++ b/uiaccelerator_plat/alf_client_server_api/inc/alf/alfappserver.h	Mon May 03 13:22:43 2010 +0300
@@ -263,6 +263,9 @@
     
     CAlfAppSrvSessionBase* SrvSessionForControlGroup(CHuiControlGroup& aGroup);
     
+    TInt GetLastActiveClient();
+    
+    
 public:
     
     CAlfAppSrvSessionBase* iOldSession;
--- a/uiaccelerator_plat/alf_client_server_api/inc/alf/alfappui.h	Fri Apr 16 15:56:24 2010 +0300
+++ b/uiaccelerator_plat/alf_client_server_api/inc/alf/alfappui.h	Mon May 03 13:22:43 2010 +0300
@@ -198,10 +198,13 @@
     TInt ForceSwRendering(TBool aEnabled);
     TInt GetSizeAndRotation(TSize& aSize, TInt& aRotation);
     TInt ReadPixels(CFbsBitmap* aBitmap);
-    void SetAlfAppWindowGroup( TInt aID );
+    void SetAlfAppWindowGroup( TInt aId );
+    void RemoveAlfAppWindowGroup( TInt aId );
     
     CAlfAppSrvSessionBase* SrvSessionForControlGroup(CHuiControlGroup& aGroup);
     void DoBlankScreen(const RMessage2& aMessage);
+    
+    TInt GetLastActiveClient();
 
 private:
 
--- a/uiaccelerator_plat/alf_client_server_api/inc/alf/alfdirectclient.h	Fri Apr 16 15:56:24 2010 +0300
+++ b/uiaccelerator_plat/alf_client_server_api/inc/alf/alfdirectclient.h	Mon May 03 13:22:43 2010 +0300
@@ -57,7 +57,7 @@
      * 
      * @param aMode ETrue to enable low memory, EFalse to disable  
      */
-    IMPORT_C void EnableLowMemoryState( TBool aMode );
+    IMPORT_C void EnableLowMemoryState( TBool aMode, TBool aUseSwRendering);
 
     /**
      * Forces SW rendering to be used. 
--- a/uiaccelerator_plat/alf_core_toolkit_api/inc/uiacceltk/HuiCanvasVisual.h	Fri Apr 16 15:56:24 2010 +0300
+++ b/uiaccelerator_plat/alf_core_toolkit_api/inc/uiacceltk/HuiCanvasVisual.h	Mon May 03 13:22:43 2010 +0300
@@ -451,6 +451,7 @@
     void CollectRecursivePaintedRegion(TRegion& aRecursivePaintRegion, TInt aExcludeCanvasFlags) const;
     
     TBool CanSkipDrawing() const;
+    TBool KeepNoCache() const;
 
 private: 
 
--- a/uiaccelerator_plat/alf_core_toolkit_api/inc/uiacceltk/HuiSkin.h	Fri Apr 16 15:56:24 2010 +0300
+++ b/uiaccelerator_plat/alf_core_toolkit_api/inc/uiacceltk/HuiSkin.h	Mon May 03 13:22:43 2010 +0300
@@ -241,8 +241,12 @@
 	 */
     IMPORT_C virtual TInt GetTexture(TInt aSkinTextureResource,
                                      const CHuiTexture*& aOutTexture);
-                                     
-                                     
+                                 
+    /**
+     * Release cached textures.
+     */                                     
+    void ReleaseCachedTextures();
+                                         
 public:
 
     /* Implementation of MHuiTextureContentObserver. */
--- a/uiaccelerator_plat/alf_visual_api/inc/alf/alfcompositionclient.h	Fri Apr 16 15:56:24 2010 +0300
+++ b/uiaccelerator_plat/alf_visual_api/inc/alf/alfcompositionclient.h	Mon May 03 13:22:43 2010 +0300
@@ -302,10 +302,18 @@
 
     
     /**
-     *  Activate drawing for the first time or continue drawing if it is being paused or suspended
+     * Activate drawing for the first time or continue drawing if it is being paused or suspended
      **/
     IMPORT_C void ActivateL();
     
+    
+    /*
+     * An other option to activate/continue drawing. This activate method ensures that no saw-edged black area is seen if client
+     * only wants to draw one frame. MAlfBufferProvider::ProduceNewFrameL is called from inside ActivateSyncL so that 
+     * surface buffer can be updated before making surface visible.
+     */
+    IMPORT_C void ActivateSyncL();
+    
     /**
      * Suspend drawing 
      **/
--- a/uiaccelerator_plat/alf_visual_api/inc/alf/alfcompositionutility.h	Fri Apr 16 15:56:24 2010 +0300
+++ b/uiaccelerator_plat/alf_visual_api/inc/alf/alfcompositionutility.h	Mon May 03 13:22:43 2010 +0300
@@ -295,4 +295,40 @@
     CAlfCompositionSourceData* iData;
     };
 
+NONSHARABLE_CLASS(CAlfEffectObserver): public CBase
+    {
+public:
+    
+    class MAlfEffectObserver
+        {
+        public:    
+        /** bit field */    
+        enum{
+            EAlfEffectStarted = 0x1,
+            EAlfEffectComplete = 0x2
+            };    
+        virtual void HandleEffectCallback(TInt aType, TInt aHandle, TInt aStatus) = 0;
+        };
+    
+    IMPORT_C static CAlfEffectObserver* NewL();
+    IMPORT_C ~CAlfEffectObserver();
+
+     /**
+     * Asks the number of active effects
+     * @return error code or number of active effects (>= 0).
+     */    
+    IMPORT_C TInt ActiveEffectsCount();
+
+     /**
+     * Subscribe callback for a handle
+     * @leave system wide error code
+     */    
+    IMPORT_C void SubscribeCallbackL(MAlfEffectObserver* aObserver, TInt aHandle, TInt aType = MAlfEffectObserver::EAlfEffectComplete );
+    
+private:
+    CAlfEffectObserver();
+    class CAlfEffectObserverData;
+    CAlfEffectObserverData* iData;
+    };
+
 #endif // #define __ALFCOMPOSITIONUTILITY_H__
--- a/uiaccelerator_plat/alf_visual_api/inc/goommonitor/goommonitorplugin.h	Fri Apr 16 15:56:24 2010 +0300
+++ b/uiaccelerator_plat/alf_visual_api/inc/goommonitor/goommonitorplugin.h	Mon May 03 13:22:43 2010 +0300
@@ -25,6 +25,14 @@
 class RFs;
 class RWsSession;
 
+// temp support for migration
+#define __GOOM_PLUGIN_API_V2
+
+enum TGOomMonitorFlags
+	{
+	KGOomNone = 0,
+	KGOomUseSwRendering
+	};
 
 /**
 * Panic codes with category "OomMonitorPlugin"
@@ -66,8 +74,8 @@
 	* FreeRam is called when the system RAM level becomes
 	* low. This plugin is requested to help free some RAM.
 	*/
-	virtual void FreeRam(TInt aBytesToFree) = 0;
-
+	//virtual void FreeRam(TInt aBytesToFree);
+	virtual void FreeRam(TInt aBytesToFree, TInt aFlags) = 0;
 	/**
 	* MemoryGood is called when the system RAM level becomes
 	* good after being low.The plugin may take this opportunity
@@ -77,7 +85,8 @@
 	* used over time, otherwise the plugin may cause oscillation
 	* between low and good memory states.
 	*/
-	virtual void MemoryGood() = 0;
+	//virtual void MemoryGood();
+	virtual void MemoryGood(TInt aFlags) = 0;
 
 public:
     /**
@@ -114,8 +123,8 @@
     * @param aBytesToFree The minimum number of bytes of free memory that the plugin should try to free.
 	*/
 
-    virtual void FreeRam(TInt aBytesToFree) = 0;
-
+    virtual void FreeRam(TInt aBytesToFree, TInt aFlags) = 0;
+	
 	/**
 	* MemoryGood is called when the system RAM level becomes
 	* good after being low.The plugin may take this opportunity
@@ -125,7 +134,8 @@
 	* used over time, otherwise the plugin may cause oscillation
 	* between low and good memory states.
 	*/
-	virtual void MemoryGood() = 0;
+	virtual void MemoryGood(TInt aFlags) = 0;
+	
 	};
 
 
@@ -170,8 +180,11 @@
 private:
 	CAppGOomMonitorPlugin(TUid aAppUid);
 
-	void FreeRam(TInt aFreeMemory);
+	/*void FreeRam(TInt aFreeMemory);
 	void MemoryGood();
+	*/
+	void FreeRam(TInt aBytesToFree, TInt aFlags);
+	void MemoryGood(TInt aFlags);
 
     void SendMessageToApp(TInt aMessage);
 
--- a/uiacceltk/hitchcock/AlfDecoderServerClient/bwins/alfdecoderserverclientu.def	Fri Apr 16 15:56:24 2010 +0300
+++ b/uiacceltk/hitchcock/AlfDecoderServerClient/bwins/alfdecoderserverclientu.def	Mon May 03 13:22:43 2010 +0300
@@ -41,5 +41,12 @@
 	??1CAlfCompositionCntrlClient@@UAE@XZ @ 40 NONAME ; CAlfCompositionCntrlClient::~CAlfCompositionCntrlClient(void)
 	?SetSourceRect@CAlfCompositionSource@@UAEHABVTRect@@@Z @ 41 NONAME ; int CAlfCompositionSource::SetSourceRect(class TRect const &)
 	?GetListOfInactiveWindowGroupsWSurfaces@RAlfBridgerClient@@QAEHPAV?$RArray@H@@@Z @ 42 NONAME ; int RAlfBridgerClient::GetListOfInactiveWindowGroupsWSurfaces(class RArray<int> *)
-	?NewL@CAlfCompositionPixelSource@@SAPAV1@AAVMAlfBufferProvider@@HPAVRWindow@@@Z @ 43  NONAME ; class CAlfCompositionPixelSource * CAlfCompositionPixelSource::NewL(class MAlfBufferProvider &, int, class RWindow *)
+	?NewL@CAlfCompositionPixelSource@@SAPAV1@AAVMAlfBufferProvider@@HPAVRWindow@@@Z @ 43 NONAME ; class CAlfCompositionPixelSource * CAlfCompositionPixelSource::NewL(class MAlfBufferProvider &, int, class RWindow *)
+	?ActivateSyncL@CAlfCompositionPixelSource@@QAEXXZ @ 44 NONAME ; void CAlfCompositionPixelSource::ActivateSyncL(void)
+	?EffectsCount@RAlfBridgerClient@@QAEHXZ @ 45 NONAME ; SBS RULES OK
+	?ActiveEffectsCount@CAlfEffectObserver@@QAEHXZ @ 46 NONAME ; int CAlfEffectObserver::ActiveEffectsCount(void)
+	?NewL@CAlfEffectObserver@@SAPAV1@XZ @ 47 NONAME ; class CAlfEffectObserver * CAlfEffectObserver::NewL(void)
+	??1CAlfEffectObserver@@UAE@XZ @ 48 NONAME ; CAlfEffectObserver::~CAlfEffectObserver(void)
+	?SubscribeCallbackL@CAlfEffectObserver@@QAEXPAVMAlfEffectObserver@1@HH@Z @ 49 NONAME ; void CAlfEffectObserver::SubscribeCallbackL(class CAlfEffectObserver::MAlfEffectObserver *, int, int)
+	?GetListOfWindowGroupsWSurfaces@RAlfBridgerClient@@QAEHPAV?$RArray@H@@@Z @ 50 NONAME ; int RAlfBridgerClient::GetListOfWindowGroupsWSurfaces(class RArray<int> *)
 
--- a/uiacceltk/hitchcock/AlfDecoderServerClient/eabi/alfdecoderserverclientu.def	Fri Apr 16 15:56:24 2010 +0300
+++ b/uiacceltk/hitchcock/AlfDecoderServerClient/eabi/alfdecoderserverclientu.def	Mon May 03 13:22:43 2010 +0300
@@ -63,4 +63,13 @@
 	_ZThn32_N21CAlfCompositionSource13SetSourceRectERK5TRect @ 62 NONAME
 	_ZN17RAlfBridgerClient38GetListOfInactiveWindowGroupsWSurfacesEP6RArrayIiE @ 63 NONAME
 	_ZN26CAlfCompositionPixelSource4NewLER18MAlfBufferProvideriP7RWindow @ 64 NONAME
+	_ZN26CAlfCompositionPixelSource13ActivateSyncLEv @ 65 NONAME
+	_ZN17RAlfBridgerClient12EffectsCountEv @ 66 NONAME
+	_ZN18CAlfEffectObserver18ActiveEffectsCountEv @ 67 NONAME
+	_ZN18CAlfEffectObserver4NewLEv @ 68 NONAME
+	_ZN18CAlfEffectObserverD0Ev @ 69 NONAME
+	_ZN18CAlfEffectObserverD1Ev @ 70 NONAME
+	_ZN18CAlfEffectObserverD2Ev @ 71 NONAME
+	_ZN18CAlfEffectObserver18SubscribeCallbackLEPNS_18MAlfEffectObserverEii @ 72 NONAME
+	_ZN17RAlfBridgerClient30GetListOfWindowGroupsWSurfacesEP6RArrayIiE @ 73 NONAME
 
--- a/uiacceltk/hitchcock/AlfDecoderServerClient/src/alfcompositionclient.cpp	Fri Apr 16 15:56:24 2010 +0300
+++ b/uiacceltk/hitchcock/AlfDecoderServerClient/src/alfcompositionclient.cpp	Mon May 03 13:22:43 2010 +0300
@@ -725,27 +725,22 @@
 
         void RunL() 
             {
-            if( iStatus == KErrNone )
+            if( iStatus != KErrCancel )
                 {
                 SetActive();
                 if( !iPixelSource.DrawFrameL(iStatus, iBufferNumber) )
                     {
-                    __ALFLOGSTRING( "CSurfaceUpdateCallBack::RunL - DrawFrameL returned EFalse -> Pause");
-                    TRequestStatus* status = &iStatus;
-                    User::RequestComplete(status, KErrNone);
+                    __ALFLOGSTRING( "CSurfaceUpdateCallBack::RunL - DrawFrameL returned EFalse -> Pausing");
+                    TRequestStatus* status  = &iStatus;
+                    User::RequestComplete(status, KErrCancel);
                     Cancel();
-                   }
+                    }
                 }
-            else
-                {
-                __ALFLOGSTRING1("CSurfaceUpdateCallBack::RunL %d", iStatus.Int());
-                iPixelSource.Suspend();
-                }
+            };
+        void DoCancel() 
+            {
+            };
 
-            
-            };
-        void DoCancel() {  };
-        
     private: // Data
         CAlfCompositionPixelSource& iPixelSource;
         TInt iBufferNumber;
@@ -907,7 +902,71 @@
    
     // do nothing if content was already active
     }
-    
+
+// ---------------------------------------------------------------------------
+// CAlfCompositionPixelSource::ActivateSyncL
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CAlfCompositionPixelSource::ActivateSyncL()
+    {
+    if( !iData->iWindow && iData->iSurfaceId.IsNull() )
+        {
+        User::Leave(KErrNotReady);
+        }
+    TBool pause = EFalse;
+    if( iData->iSourceStatus == CAlfCompositionPixelSourceData::ESuspended )
+        {
+        MAlfBufferProvider::TBufferCreationAttributes& creationAttribs = iData->iProvider.BufferAttributes();
+        
+        iData->iSurfaceRect = TRect(TPoint(0,0), TSize(creationAttribs.iWidth, creationAttribs.iHeight));
+
+        ConstructSurfaceL(creationAttribs);
+
+        User::LeaveIfError( iData->iSurfaceUpdateSession.Connect() );     
+        
+        // update surface buffer before setting surface as background surface
+        if( !iData->iSurfaceUpdateWaiter )
+            {
+            iData->iSurfaceUpdateWaiter = new (ELeave) CSurfaceUpdateCallback( *this, 0, iData->iWaiterAoPriority );
+            }
+
+        iData->iSurfaceUpdateWaiter->SetActive();
+        pause = !DrawFrameL(iData->iSurfaceUpdateWaiter->iStatus ,0);
+        if(pause && iData->iSurfaceUpdateWaiter->IsActive())
+            {
+            TRequestStatus* status  = &iData->iSurfaceUpdateWaiter->iStatus;
+            User::RequestComplete(status, KErrCancel);
+            iData->iSurfaceUpdateWaiter->Cancel();
+            }
+        
+        iData->iWindow->SetBackgroundSurface(iData->iSurfaceId);
+
+        TInt array[] = { 0, iData->iWindow->ClientHandle(), iData->iWindow->WindowGroupId() }; 
+        TInt handle = SendEvent(KAlfCompOpCreateSource, array, sizeof(array));
+        CAlfCompositionClientBase::SetHandleL( handle );
+        }
+  
+    if( iData->iSourceStatus != CAlfCompositionPixelSourceData::EActive && !pause )
+        {
+
+        if( !iData->iSurfaceUpdateWaiter )
+            {
+            iData->iSurfaceUpdateWaiter = new (ELeave) CSurfaceUpdateCallback( *this, 0, iData->iWaiterAoPriority );
+            }
+
+        if(!iData->iSurfaceUpdateWaiter->IsActive())
+            {
+            iData->iSurfaceUpdateWaiter->SetActive();
+            TRequestStatus* status = &iData->iSurfaceUpdateWaiter->iStatus;
+            User::RequestComplete(status, KErrNone);
+            }
+        iData->iProvider.OnActivation();
+        iData->iSourceStatus = CAlfCompositionPixelSourceData::EActive;
+        }
+   
+    // do nothing if content was already active and running    
+    }
+
 // --------------------------------------------------------------------------- 
 // CAlfCompositionPixelSource::Suspend
 // ---------------------------------------------------------------------------
@@ -1172,4 +1231,104 @@
     CAlfCompositionSource::HandleEventL( aEventType, aEventData );
     }
 
+class CAlfSignalObserver;
+
+class MAlfEffectObserverData
+    {
+    public:
+        virtual void Remove(CAlfSignalObserver* aObserver) = 0;
+    };
+
+NONSHARABLE_CLASS(CAlfEffectObserver::CAlfEffectObserverData): public CBase, public MAlfEffectObserverData
+    {
+    public:
+    void SubscribeCallbackL(MAlfEffectObserver* aObserver, TInt aHandle, TInt aType = MAlfEffectObserver::EAlfEffectComplete );        
+    ~CAlfEffectObserverData();
+    void Remove(CAlfSignalObserver* aObserver);
+    
+    // data
+    RAlfBridgerClient iClient;
+    RPointerArray<CAlfSignalObserver> iObservers;
+    };
+
+
+NONSHARABLE_CLASS(CAlfSignalObserver):public CActive
+    {
+    public:    
+    CAlfSignalObserver(CAlfEffectObserver::MAlfEffectObserver* aObserver, MAlfEffectObserverData* aOwner, TInt aHandle, TInt aType):CActive(EPriorityStandard),
+        iOwner(aOwner), iObserver(aObserver), iHandle(aHandle), iType(aType), iArgs(aHandle,aType)
+        {   
+        CActiveScheduler::Add(this);
+        SetActive(); 
+        }
+                
+    void DoCancel(){} // do not...
+    
+    void RunL()
+        {    
+        iObserver->HandleEffectCallback(iType, iHandle, iStatus.Int());
+        iOwner->Remove(this);
+        }    
+    
+    MAlfEffectObserverData* iOwner;
+    CAlfEffectObserver::MAlfEffectObserver* iObserver;
+    TInt iHandle;        
+    TInt iType;
+    TIpcArgs iArgs;
+    };
+
+void CAlfEffectObserver::CAlfEffectObserverData::SubscribeCallbackL(MAlfEffectObserver* aObserver, TInt aHandle, TInt aType)
+    {
+    CAlfSignalObserver* obs = new (ELeave) CAlfSignalObserver(aObserver, this, aHandle, aType);
+    CleanupStack::PushL(obs);
+    User::LeaveIfError(iObservers.Append(obs));
+    CleanupStack::Pop();
+    iClient.SendAsynchronous(EAlfRequestSignal, obs->iArgs, obs->iStatus);        
+    }
+        
+CAlfEffectObserver::CAlfEffectObserverData::~CAlfEffectObserverData()
+    {    
+    iClient.Close(); // destroys signals
+    iObservers.ResetAndDestroy();
+    }
+        
+void CAlfEffectObserver::CAlfEffectObserverData::Remove(CAlfSignalObserver* aObserver)
+    {
+    TInt index = iObservers.Find(aObserver);
+    iObservers.Remove(index);
+    delete aObserver;   
+    }    
+    
+EXPORT_C CAlfEffectObserver* CAlfEffectObserver::NewL()
+    {
+    CAlfEffectObserver* me = new (ELeave) CAlfEffectObserver();
+    CleanupStack::PushL(me);
+    me->iData = new (ELeave) CAlfEffectObserverData();
+    User::LeaveIfError(me->iData->iClient.Connect());
+    CleanupStack::Pop();
+    return me;    
+    }
+
+EXPORT_C CAlfEffectObserver::~CAlfEffectObserver()
+    {
+    delete iData;        
+    }
+
+EXPORT_C TInt CAlfEffectObserver::ActiveEffectsCount()
+    {
+    return iData->iClient.EffectsCount();
+    }
+
+EXPORT_C void CAlfEffectObserver::SubscribeCallbackL(MAlfEffectObserver* aObserver, TInt aHandle, TInt aType)
+    {
+    iData->SubscribeCallbackL(aObserver, aHandle, aType ); 
+    }
+
+CAlfEffectObserver::CAlfEffectObserver()
+    {
+    }
+
+ 
+
+
 //end of file    
--- a/uiacceltk/hitchcock/AlfDecoderServerClient/src/alfdecoderserverclient.cpp	Fri Apr 16 15:56:24 2010 +0300
+++ b/uiacceltk/hitchcock/AlfDecoderServerClient/src/alfdecoderserverclient.cpp	Mon May 03 13:22:43 2010 +0300
@@ -147,13 +147,12 @@
     SendReceive(aOp, aIPCArgs, aStatus );
     }
 
-
-EXPORT_C TInt RAlfBridgerClient::GetListOfInactiveWindowGroupsWSurfaces(RArray<TInt>* aWindowGroups)
+TInt RAlfBridgerClient::GetListOfWindowGroups(RArray<TInt>* aWindowGroups, TBool aListAll)
     {
     TInt err = KErrNone;
     TInt array[10];
     TPtr8 ptr((TUint8*)array,0,40);
-    err = SendReceive(EAlfGetListOfWGsHavingInactiveSurfaces, TIpcArgs(&ptr));
+    err = SendReceive(EAlfGetListOfWGsHavingInactiveSurfaces, TIpcArgs(&ptr, aListAll));
     if (!err)
         {
         for(TInt i = 0; i < 10; i++)
@@ -171,6 +170,28 @@
     return err; 
     }
 
+EXPORT_C TInt RAlfBridgerClient::GetListOfInactiveWindowGroupsWSurfaces(RArray<TInt>* aWindowGroups)
+    {
+    return GetListOfWindowGroups(aWindowGroups, EFalse);
+    }
+
+EXPORT_C TInt RAlfBridgerClient::GetListOfWindowGroupsWSurfaces(RArray<TInt>* aWindowGroups)
+    {
+    return GetListOfWindowGroups(aWindowGroups, ETrue);
+    }
+
+
+
+// ---------------------------------------------------------------------------
+// EffectsCount
+// ---------------------------------------------------------------------------
+//
+EXPORT_C TInt RAlfBridgerClient::EffectsCount()
+    {
+    return SendReceive(EAlfGetNumberOfActiveEffects, TIpcArgs());
+    }
+
+
 // Open
 // ---------------------------------------------------------------------------
 //
--- a/uiacceltk/hitchcock/AlfRenderStage/src/alfrenderstage.cpp	Fri Apr 16 15:56:24 2010 +0300
+++ b/uiacceltk/hitchcock/AlfRenderStage/src/alfrenderstage.cpp	Mon May 03 13:22:43 2010 +0300
@@ -366,9 +366,9 @@
     TRegionFix<1> clipRegion;
     clipRegion.AddRect( aClipRect );
 
-    TRgb penColor = TRgb(0x555555); 
-    TRgb brushColor = TRgb(0x555555); 
-    TRgb dotColor = TRgb(0xBBBBBB); 
+    TRgb penColor = TRgb(0x000000);
+    TRgb brushColor = TRgb(0x000000);
+    TRgb dotColor =  TRgb(0xFFFFFF);
     
     WindowRedrawStart( aWindowTreeNode, drawRegion );
     iWsGraphicsContext->Reset();
@@ -593,7 +593,9 @@
 	
     AMT_INC_COUNTER_IF(nodeType==MWsWindowTreeNode::EWinTreeNodeClient, iRsWindowNodeCount ); 
     AMT_INC_COUNTER_IF(nodeType==MWsWindowTreeNode::EWinTreeNodeGroup,  iRsWindowGroupNodeCount ); 
-    AMT_INC_COUNTER(iRsTotalNodeCount ); 
+    AMT_INC_COUNTER(iRsTotalNodeCount );
+    
+    AMT_MAP_RENDER_STAGE_NODE_CREATED();
     }
 
 // ---------------------------------------------------------------------------
@@ -636,7 +638,14 @@
 
     AMT_DEC_COUNTER_IF(nodeType==MWsWindowTreeNode::EWinTreeNodeClient, iRsWindowNodeCount ); 
     AMT_DEC_COUNTER_IF(nodeType==MWsWindowTreeNode::EWinTreeNodeGroup,  iRsWindowGroupNodeCount ); 
-    AMT_DEC_COUNTER(iRsTotalNodeCount ); 
+    AMT_DEC_COUNTER(iRsTotalNodeCount );
+    
+    AMT_MAP_INC_VALUE_IF( ( MWsWindowTreeNode::EWinTreeNodeClient == nodeType && aWindowTreeNode.Window() ),
+                          iIntMap, aWindowTreeNode.Window()->Handle(),
+                          EAlfModuleTestTypeRenderStageReleaseWindow );
+    AMT_MAP_INC_VALUE_IF( ( MWsWindowTreeNode::EWinTreeNodeGroup == nodeType && aWindowTreeNode.WindowGroup() ),
+                          iIntMap, aWindowTreeNode.WindowGroup()->Identifier(),
+                          EAlfModuleTestTypeRenderStageReleaseWindowGroup );    
     }
 
 // ---------------------------------------------------------------------------
@@ -655,7 +664,11 @@
 	iAlfSendBuffer->CommitL();
     __ALFLOGSTRING("CAlfRenderStage::NodeActivated <<");
    
-    AMT_INC_COUNTER_IF(nodeType==MWsWindowTreeNode::EWinTreeNodeClient, iRsWindowNodeActivatedCount ); 
+    AMT_INC_COUNTER_IF(nodeType==MWsWindowTreeNode::EWinTreeNodeClient, iRsWindowNodeActivatedCount );
+    
+    AMT_MAP_SET_VALUE_IF( nodeType == MWsWindowTreeNode::EWinTreeNodeClient, 
+                          iBoolMap, aWindowTreeNode.Window()->Handle(), ETrue, 
+                          EAlfModuleTestTypeRenderStageActiveWindow );
     }
 
 // ---------------------------------------------------------------------------
@@ -695,12 +708,13 @@
 
     AMT_INC_COUNTER( iRsNodeExtentChangedCount );
     AMT_SET_VALUE( iRsLatestNodeExtentRect, aRect );
+    
     AMT_MAP_SET_VALUE_IF( ( aWindowTreeNode.Window() ),
-                          iSizeMap, aWindowTreeNode.Window()->Handle(), 
-                          aRect.Size(), EAlfModuleTestTypeRenderStageChangeSize );
+                          iSizeMap, aWindowTreeNode.Window()->Handle(),
+                          aRect.Size(), EAlfModuleTestTypeRenderStageChangeWindowSize );
     AMT_MAP_SET_VALUE_IF( ( aWindowTreeNode.Window() ),
-                          iPositionMap, aWindowTreeNode.Window()->Handle(), 
-                          aRect.iTl, EAlfModuleTestTypeRenderStageChangePosition );
+                          iPositionMap, aWindowTreeNode.Window()->Handle(),
+                          aRect.iTl, EAlfModuleTestTypeRenderStageChangeWindowPosition );
     }
 
 // ---------------------------------------------------------------------------
@@ -717,7 +731,7 @@
         &aWindowTreeNode );
 
     iAlfSendBuffer->CommitL();
-        }
+    }
 
 // ---------------------------------------------------------------------------
 // FlagChanged
@@ -735,9 +749,12 @@
 	iAlfSendBuffer->CommitL();
 
     AMT_INC_COUNTER( iRsTotalNodeFlagChangedCount );
-    AMT_MAP_INC_VALUE_IF( ( aWindowTreeNode.Window() ),
-                          iIntMap, aWindowTreeNode.Window()->Handle(), 
-                          EAlfModuleTestTypeRenderStageChangeFlag );
+    
+    AMT_MAP_SET_VALUE_IF( ( aWindowTreeNode.Window() && MWsWindowTreeObserver::EVisible == aFlag ),
+                          iBoolMap, 
+                          aWindowTreeNode.Window()->Handle(),
+                          aNewValue,
+                          EAlfModuleTestTypeRenderStageChangeWindowVisibility );
     }
 
 // ---------------------------------------------------------------------------
@@ -837,7 +854,9 @@
         iAlfSendBuffer->CommitL();
         
         AMT_INC_COUNTER( iRsTotalNodeAttributeChangedCount );
-        }    
+        }
+    
+    AMT_MAP_RENDER_STAGE_TEXT_CURSOR_CHANGE();
     }
 
 // ---------------------------------------------------------------------------
--- a/uiacceltk/hitchcock/AlfRenderStage/src/alfrssendbuffer.cpp	Fri Apr 16 15:56:24 2010 +0300
+++ b/uiacceltk/hitchcock/AlfRenderStage/src/alfrssendbuffer.cpp	Mon May 03 13:22:43 2010 +0300
@@ -1176,10 +1176,11 @@
 // ARRAY IMPLEMENTATION
 //
 
+#ifdef RD_SUBWINDOW_EFFECTS
+
 const TInt KArrayOffsetTemplate = 23456789;
 const TInt KArraySizeTemplate = 23456789;
 
-#ifdef RD_SUBWINDOW_EFFECTS
 void CAlfRsSendBuffer::WriteArrayHeaderTemplateL()
 {
     WriteInt8L( EAlfCommandIndexArrayHeader );
@@ -1455,6 +1456,7 @@
         iBufStream->Open( iChunk.Base() + sizeof( TChunkHeader), iPrimaryChunkMaxSize );
 #else
         delete iStreamPtr;
+        iStreamPtr = NULL;
         iStreamPtr = new(ELeave)TPtr8( (TUint8*)(iChunk.Base() + sizeof( TChunkHeader)), iPrimaryChunkMaxSize - sizeof( TChunkHeader));
         iChunkHeader->iMemWriteStream = (RMemWriteStream*)1;
 #endif
--- a/uiacceltk/hitchcock/Client/BWINS/alfclientu.DEF	Fri Apr 16 15:56:24 2010 +0300
+++ b/uiacceltk/hitchcock/Client/BWINS/alfclientu.DEF	Mon May 03 13:22:43 2010 +0300
@@ -1102,7 +1102,7 @@
 	?MeasureFPS@RAlfDirectClient@@QAEXJH@Z @ 1101 NONAME ; void RAlfDirectClient::MeasureFPS(long, int)
 	??0RAlfDirectClient@@QAE@XZ @ 1102 NONAME ; RAlfDirectClient::RAlfDirectClient(void)
 	?Disconnect@RAlfDirectClient@@QAEXXZ @ 1103 NONAME ; void RAlfDirectClient::Disconnect(void)
-	?EnableLowMemoryState@RAlfDirectClient@@QAEXH@Z @ 1104 NONAME ; void RAlfDirectClient::EnableLowMemoryState(int)
+	?EnableLowMemoryState@RAlfDirectClient@@QAEXHH@Z @ 1104 NONAME ; void RAlfDirectClient::EnableLowMemoryState(int, int)
 	?SetGroupEffectL@CAlfVisual@@QAEXABVTDesC16@@H@Z @ 1105 NONAME ; void CAlfVisual::SetGroupEffectL(class TDesC16 const &, int)
 	?ForceSwRendering@RAlfDirectClient@@QAEHH@Z @ 1106 NONAME ; int RAlfDirectClient::ForceSwRendering(int)
 	?Finish@CAlfDrawer@@QAEHXZ @ 1107 NONAME ; int CAlfDrawer::Finish(void)
@@ -1110,4 +1110,5 @@
 	?NewL@CAlfDrawer@@SAPAV1@XZ @ 1109 NONAME ; class CAlfDrawer * CAlfDrawer::NewL(void)
 	?BlankScreen@RAlfDirectClient@@QAEHH@Z @ 1110 NONAME ; int RAlfDirectClient::BlankScreen(int)
 	?FallbackCopyScreenToBitmap@CAlfDrawer@@SAHAAVCWsScreenDevice@@PAVCFbsBitmap@@ABVTRect@@@Z @ 1111 NONAME ; int CAlfDrawer::FallbackCopyScreenToBitmap(class CWsScreenDevice &, class CFbsBitmap *, class TRect const &)
+	?CopyScreenToBitmap@AlfDrawerInternal@@SAHPAVMAlfDrawerScreenInterface@@PAVCFbsBitmap@@ABVTRect@@@Z @ 1112 NONAME ; int AlfDrawerInternal::CopyScreenToBitmap(class MAlfDrawerScreenInterface *, class CFbsBitmap *, class TRect const &)
 
--- a/uiacceltk/hitchcock/Client/eabi/alfclientu.DEF	Fri Apr 16 15:56:24 2010 +0300
+++ b/uiacceltk/hitchcock/Client/eabi/alfclientu.DEF	Mon May 03 13:22:43 2010 +0300
@@ -1335,7 +1335,7 @@
 	_ZN16RAlfDirectClient10DisconnectEv @ 1334 NONAME
 	_ZN16RAlfDirectClientC1Ev @ 1335 NONAME
 	_ZN16RAlfDirectClientC2Ev @ 1336 NONAME
-	_ZN16RAlfDirectClient20EnableLowMemoryStateEi @ 1337 NONAME
+	_ZN16RAlfDirectClient20EnableLowMemoryStateEii @ 1337 NONAME
 	_ZN10CAlfVisual15SetGroupEffectLERK7TDesC16i @ 1338 NONAME
 	_ZN16RAlfDirectClient16ForceSwRenderingEi @ 1339 NONAME
 	_ZN10CAlfDrawer4NewLEv @ 1340 NONAME
@@ -1345,4 +1345,5 @@
 	_ZN10CAlfDrawerD2Ev @ 1344 NONAME
 	_ZN16RAlfDirectClient11BlankScreenEi @ 1345 NONAME
 	_ZN10CAlfDrawer26FallbackCopyScreenToBitmapER15CWsScreenDeviceP10CFbsBitmapRK5TRect @ 1346 NONAME
+	_ZN17AlfDrawerInternal18CopyScreenToBitmapEP25MAlfDrawerScreenInterfaceP10CFbsBitmapRK5TRect @ 1347 NONAME
 
--- a/uiacceltk/hitchcock/Client/src/alfdirectclient.cpp	Fri Apr 16 15:56:24 2010 +0300
+++ b/uiacceltk/hitchcock/Client/src/alfdirectclient.cpp	Mon May 03 13:22:43 2010 +0300
@@ -42,7 +42,7 @@
     Send( command, TIpcArgs(aId));
     }
 
-EXPORT_C void RAlfDirectClient::EnableLowMemoryState( TBool aMode )
+EXPORT_C void RAlfDirectClient::EnableLowMemoryState( TBool aMode , TBool aUseSwRendering)
     {
     if (!Handle())
         {
--- a/uiacceltk/hitchcock/Client/src/alfdrawer.cpp	Fri Apr 16 15:56:24 2010 +0300
+++ b/uiacceltk/hitchcock/Client/src/alfdrawer.cpp	Mon May 03 13:22:43 2010 +0300
@@ -22,6 +22,7 @@
 #include <alf/alfdirectclient.h>
 #include "alfcrppluginclient.h"
 #include "alflogger.h"
+#include "alfdrawerinternal.h"
 
 #include <coemain.h>
 #include <w32std.h>
@@ -42,6 +43,17 @@
 // Creates CAlfCrpPluginClient instance.
 static CAlfCrpPluginClient* CreateAlfCrpClientL();
 
+NONSHARABLE_CLASS( TAlfDrawerDirectClient ) : public MAlfDrawerScreenInterface
+    {
+public:
+    TAlfDrawerDirectClient( RAlfDirectClient& aClient );
+    TInt GetSizeAndRotation(TSize& aSize, TInt& aRotation);
+    TInt ReadPixels(CFbsBitmap* aBitmap);
+
+private:
+    RAlfDirectClient iClient;
+    };
+   
 /**
  * Misc utility methods for CAlfDrawer.
  */
@@ -93,6 +105,14 @@
         CWsScreenDevice& aDevice,
         CFbsBitmap* aBitmap, 
         const TRect& aRect );
+
+    /**
+     * Copies screen to bitmap using 'read pixels' operation.
+     */
+    static void DoCopyScreenToBitmap2L( 
+        MAlfDrawerScreenInterface* aInterface,
+        CFbsBitmap* aBitmap, 
+        const TRect& aRect );
         
     };
 
@@ -187,12 +207,29 @@
     RAlfDirectClient client;
     CleanupClosePushL(client);
 
+    TAlfDrawerDirectClient clientWrapper(client);
+    DoCopyScreenToBitmap2L(&clientWrapper, aBitmap, aRect);   
+    
+    CleanupStack::PopAndDestroy(); // CleanupClosePushL
+    
+    __ALFLOGSTRING("DoCopyScreenToBitmapL - Done");    
+    }
+
+// ---------------------------------------------------------------------------
+// DoCopyScreenToBitmapL
+// ---------------------------------------------------------------------------
+//
+void AlfDrawerUtils::DoCopyScreenToBitmap2L( 
+        MAlfDrawerScreenInterface* aInterface,
+        CFbsBitmap* aBitmap, 
+        const TRect& aRect )
+    {
     // Get size & virtual rotation from ALF side.
     // GetSizeAndRotation will also create session to server.
 
     TInt rotation = 0;
     TSize size;
-    User::LeaveIfError(client.GetSizeAndRotation(size, rotation));
+    User::LeaveIfError(aInterface->GetSizeAndRotation(size, rotation));
 
     // Calculate device size in pixels (same as aDevice.SizeInPixels())
     TSize deviceSize = size;
@@ -216,7 +253,6 @@
          actualRect.IsEmpty() )
         {
         __ALFLOGSTRING("DoCopyScreenToBitmapL - empty rect or zero bitmap size");
-        CleanupStack::PopAndDestroy(); // CleanupClosePushL
         return;
         }
 
@@ -239,7 +275,7 @@
     CleanupStack::PushL( surfaceBitmap );
     User::LeaveIfError( surfaceBitmap->Create( size, surfaceDisplayMode ) );
     
-    TInt err = client.ReadPixels( surfaceBitmap->Handle() );              
+    TInt err = aInterface->ReadPixels( surfaceBitmap );              
     __ALFLOGSTRING1("DoCopyScreenToBitmapL - ReadPixels returned %d", err);
     User::LeaveIfError( err );  
 
@@ -439,10 +475,6 @@
         }
     
     CleanupStack::PopAndDestroy( surfaceBitmap );
-    
-    CleanupStack::PopAndDestroy(); // CleanupClosePushL
-    
-    __ALFLOGSTRING("DoCopyScreenToBitmapL - Done");    
     }
 
 // ---------------------------------------------------------------------------
@@ -473,6 +505,19 @@
     }
 
 // ---------------------------------------------------------------------------
+// CopyScreenToBitmap
+// ---------------------------------------------------------------------------
+//
+EXPORT_C TInt AlfDrawerInternal::CopyScreenToBitmap(
+        MAlfDrawerScreenInterface* aInterface, 
+        CFbsBitmap* aBitmap, 
+        const TRect& aRect )
+    {
+    TRAPD(err, AlfDrawerUtils::DoCopyScreenToBitmap2L(aInterface, aBitmap, aRect));
+    return err;
+    }
+
+// ---------------------------------------------------------------------------
 // CreateAlfCrpClient
 // ---------------------------------------------------------------------------
 //
@@ -495,3 +540,30 @@
     return client;
     }
 
+// ---------------------------------------------------------------------------
+// TAlfDrawerDirectClient
+// ---------------------------------------------------------------------------
+//
+TAlfDrawerDirectClient::TAlfDrawerDirectClient( RAlfDirectClient& aClient )
+    : iClient( aClient )
+    {
+    }
+    
+// ---------------------------------------------------------------------------
+// GetSizeAndRotation
+// ---------------------------------------------------------------------------
+//
+TInt TAlfDrawerDirectClient::GetSizeAndRotation(TSize& aSize, TInt& aRotation)
+    {
+    return iClient.GetSizeAndRotation(aSize, aRotation);
+    }
+    
+// ---------------------------------------------------------------------------
+// ReadPixels
+// ---------------------------------------------------------------------------
+//
+TInt TAlfDrawerDirectClient::ReadPixels(CFbsBitmap* aBitmap)
+    {
+    return iClient.ReadPixels(aBitmap->Handle());
+    }
+
--- a/uiacceltk/hitchcock/CommonInc/alfdecoderserverclient.h	Fri Apr 16 15:56:24 2010 +0300
+++ b/uiacceltk/hitchcock/CommonInc/alfdecoderserverclient.h	Mon May 03 13:22:43 2010 +0300
@@ -58,7 +58,24 @@
      * @return error code.
      */    
     IMPORT_C TInt GetListOfInactiveWindowGroupsWSurfaces(RArray<TInt>* aWindowGroups);
+    
+     /**
+     * Asks list of window groups that have graphics surfaces attached
+     * @param aArray array to be populated
+     * @return error code.
+     */    
+    IMPORT_C TInt GetListOfWindowGroupsWSurfaces(RArray<TInt>* aWindowGroups);
+
+
+     /**
+     * Asks the number of active effects
+     * @return error code or number of active effects (>= 0).
+     */    
+     IMPORT_C TInt EffectsCount();
+     
 private:
+    
+    TInt GetListOfWindowGroups(RArray<TInt>* aWindowGroups, TBool aListAll);
     TInt iSpare1;
     TInt iSpare2;
     };
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/uiacceltk/hitchcock/CommonInc/alfdrawerinternal.h	Mon May 03 13:22:43 2010 +0300
@@ -0,0 +1,47 @@
+/*
+* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:   Internal interface for CAlfDrawer
+*
+*/
+
+
+
+#ifndef ALFDRAWERINTERNAL_H
+#define ALFDRAWERINTERNAL_H
+
+#include <e32std.h>
+
+/**
+ * Interface to get screen & parameters
+ */
+class MAlfDrawerScreenInterface
+    {
+public:
+    virtual TInt GetSizeAndRotation(TSize& aSize, TInt& aRotation) = 0;
+    virtual TInt ReadPixels(CFbsBitmap* aBitmap) = 0;
+    };
+
+/**
+ * Internal drawer interface.
+ */
+NONSHARABLE_CLASS( AlfDrawerInternal )
+    {
+public:
+    IMPORT_C static TInt CopyScreenToBitmap(
+        MAlfDrawerScreenInterface* aInterface, 
+        CFbsBitmap* aBitmap, 
+        const TRect& aRect );
+    };
+    
+#endif // ALFDRAWERINTERNAL_H
--- a/uiacceltk/hitchcock/CommonInc/alfmoduletest.h	Fri Apr 16 15:56:24 2010 +0300
+++ b/uiacceltk/hitchcock/CommonInc/alfmoduletest.h	Mon May 03 13:22:43 2010 +0300
@@ -14,430 +14,34 @@
 * Description: 
 *
 */
-#include "e32base.h"
-#include "e32debug.h"
-
 #ifndef ALFMODULETEST_H
 #define ALFMODULETEST_H
 
-// Define this to build module testing enchanced version of ALF
-//#define USE_MODULE_TEST_HOOKS_FOR_ALF 
 
-#if !defined(USE_MODULE_TEST_HOOKS_FOR_ALF) || !defined(AMT_CONTROL)
-
-#define AMT_DATA()
-#define AMT_FUNC(func)                                
-#define AMT_FUNC_EXC(func)
-#define AMT_FUNC_EXC_RET(ret, func)
-#define AMT_FUNC_EXC_IF(cond, func)
-#define AMT_FUNC_EXC_IF_RET(cond, ret, func)
-#define AMT_INC_COUNTER(member)
-#define AMT_DEC_COUNTER(member)
-#define AMT_SET_VALUE(member, val)
-#define AMT_GET_VALUE(x, member)
-#define AMT_INC_COUNTER_IF(cond, member)
-#define AMT_DEC_COUNTER_IF(cond, member)
-#define AMT_SET_VALUE_IF(cond, member, val)
-#define AMT_GET_VALUE_IF(cond, x, member)
+#include <e32base.h>
+#include <graphics/surface.h>
+#include <e32debug.h>
 
-#define AMT_MAP_APPEND(memberMap, key, type, defaultValue)          
-#define AMT_MAP_SET_VALUE_IF(cond, memberMap, key, value, type)     
-#define AMT_MAP_INC_VALUE_IF(cond, memberMap, key, type)            
-#define AMT_MAP_DEC_VALUE_IF(cond, memberMap, key, type)            
-#define AMT_MAP_SET_VALUE(memberMap, key, value, type)              
-#define AMT_MAP_INC_VALUE(memberMap, key, type)                              
-#define AMT_MAP_DEC_VALUE(memberMap, key, type)                     
-#define AMT_MAP_RESET(memberMap)                                    
-
-#define AMT_PRINT_STATE()
+// Informs if module test hooks have been set on.
+#include "alfmoduletestconf.h"
 
-#ifndef AMT_CONTROL
-#error "Error: you need to define AMT_CONTROL macro in your code to be able to use ALF module test system!"
-// The user have to define AMT_CONTROL, e.g. like this:
-// #define AMT_CONTROL() static_cast<CAlfModuleTestDataControl*>(Dll::Tls())
-// or
-// #define AMT_CONTROL() iMyModuleTestDataControl
-// etc.
-#endif
-
-#else
+// Provides module test hooks defines.
+#include "alfmoduletestdefines.h"
 
 
-//  *** Use these macros to access global memory chunk
-
-
-// Note: If you read/write a large block of data members, it is advisable not use the AMT_FUNC_EXC() based macros below. 
-//       Use Lock() and Unlock() around the block explicitely, and use AMT_FUNC() macro.
-//       That is to avoid unnecessary nested lock-unlock sequences (even if nested locks are working ok).
-
-// Note: Be careful not to lock the the mutex for a long time as it will halt other processes if they are using the lock during that time!
-
-// Generic macros
-#define AMT_DATA()                  AMT_CONTROL()->iModuleTestData
-#define AMT_FUNC(func)              if (AMT_DATA()->iIsEnabled) {func;}                                         
-#define AMT_FUNC_EXC(func)          {AMT_CONTROL()->Lock(); if (AMT_DATA()->iIsEnabled) {func;} AMT_CONTROL()->Unlock();}
-#define AMT_FUNC_EXC_RET(ret, func) {AMT_CONTROL()->Lock(); if (AMT_DATA()->iIsEnabled) {ret = func;} AMT_CONTROL()->Unlock();}
-#define AMT_FUNC_EXC_IF(cond, func) {AMT_CONTROL()->Lock(); if (AMT_DATA()->iIsEnabled && (cond)) {func;} AMT_CONTROL()->Unlock();}        
-#define AMT_FUNC_EXC_IF_RET(cond, ret, func) {AMT_CONTROL()->Lock(); if (AMT_DATA()->iIsEnabled && (cond)) {ret = func;} AMT_CONTROL()->Unlock();}
+#ifdef USE_MODULE_TEST_HOOKS_FOR_ALF
 
-// Single operation macros, that will do lock/unlock.
-#define AMT_INC_COUNTER(member)     AMT_FUNC_EXC(AMT_DATA()->member++)
-#define AMT_DEC_COUNTER(member)     AMT_FUNC_EXC(AMT_DATA()->member--)
-#define AMT_SET_VALUE(member, val)  AMT_FUNC_EXC(AMT_DATA()->member=(val))
-#define AMT_GET_VALUE(x, member)    AMT_FUNC_EXC((x) = AMT_DATA()->member)
-#define AMT_PRINT_STATE()           AMT_FUNC_EXC(AMT_DATA()->PrintState())
+// *** Test map classes
+#include "alfmoduletesttype.h"
+#include "alfmoduletestitem.h"
+#include "alfmoduletestmap.h"
 
-// Conditional single operation macros, that will do lock/unlock.
-#define AMT_INC_COUNTER_IF(cond, member)    AMT_FUNC_EXC_IF((cond), AMT_DATA()->member++)
-#define AMT_DEC_COUNTER_IF(cond, member)    AMT_FUNC_EXC_IF((cond), AMT_DATA()->member--)
-#define AMT_SET_VALUE_IF(cond, member, val) AMT_FUNC_EXC_IF((cond), AMT_DATA()->member=(val))
-#define AMT_GET_VALUE_IF(cond, x, member)   AMT_FUNC_EXC_IF((cond), (x) = AMT_DATA()->member)
-
-// Map operation macros, that will do lock/unlock
-#define AMT_MAP_APPEND(memberMap, key, type, defaultValue)          AMT_FUNC_EXC(AMT_DATA()->memberMap.Append(key, type, defaultValue))
-#define AMT_MAP_SET_VALUE_IF(cond, memberMap, key, value, type)     AMT_FUNC_EXC_IF((cond), AMT_DATA()->memberMap.SetValue(key, value, type))
-#define AMT_MAP_INC_VALUE_IF(cond, memberMap, key, type)            AMT_FUNC_EXC_IF((cond && AMT_DATA()->memberMap.Find(key, type)), AMT_DATA()->memberMap.SetValue(key, AMT_DATA()->memberMap.Find(key, type)->Value() + 1, type))
-#define AMT_MAP_DEC_VALUE_IF(cond, memberMap, key, type)            AMT_FUNC_EXC_IF((cond && AMT_DATA()->memberMap.Find(key, type)), AMT_DATA()->memberMap.SetValue(key, AMT_DATA()->memberMap.Find(key, type)->Value() - 1, type))
-#define AMT_MAP_SET_VALUE(memberMap, key, value, type)              AMT_FUNC_EXC_IF(ETrue, AMT_DATA()->memberMap.SetValue(key, value, type))
-#define AMT_MAP_INC_VALUE(memberMap, key, type)                     AMT_MAP_INC_VALUE_IF(ETrue, memberMap, key, type)              
-#define AMT_MAP_DEC_VALUE(memberMap, key, type)                     AMT_MAP_DEC_VALUE_IF(ETrue, memberMap, key, type)
-#define AMT_MAP_RESET(memberMap)                                    AMT_FUNC_EXC(AMT_DATA()->memberMap.Reset())
 
 // *** Global object names
 _LIT(KAlfModuleTestChunkName, "ALF_MODULE_TEST_CHUNK");
 _LIT(KAlfModuleTestMutexName, "ALF_MODULE_TEST_MUTEX");
 
 
-/**
- * TAlfModuleTestType specifies recognized test types.
- */
-enum TAlfModuleTestType
-    {
-    // Do not use this value when creating item.
-    EAlfModuleTestTypeNone,
-    
-    // Render stage component specific tests
-    EAlfModuleTestTypeRenderStageChangeSize,
-    EAlfModuleTestTypeRenderStageChangePosition,
-    EAlfModuleTestTypeRenderStageChangeFlag,
-    
-    // Streamer hierarchy model component specific tests
-    EAlfModuleTestTypeHierarchyModelChangeSize,
-    EAlfModuleTestTypeHierarchyModelChangePosition,
-    EAlfModuleTestTypeHierarchyModelChangeFlag,    
-    
-    // Server bridge component specific tests
-    EAlfModuleTestTypeBridgeChangeSize,
-    EAlfModuleTestTypeBridgeChangePosition,
-    EAlfModuleTestTypeBridgeChangeFlag,
-    
-    // Do not use this value when creating item.
-    // This is just meant for Find operations when all tests are accepted.
-    EAlfModuleTestTypeAll
-    };
-
-
-/**
- * CAlfModuleTestItem
- * 
- * Provides key-value pair that is used in TAlfModuleTestMap.
- */
-template< class T >
-NONSHARABLE_CLASS( TAlfModuleTestItem )
-    {
-    
-public:
-
-    /**
-     * Constructor to initialize variables.
-     * 
-     * @param aKey Key that identifies the item.
-     *             In test cases this could be for example handle.
-     * @param aTestType Defines for what this test item is meant for.
-     */
-    TAlfModuleTestItem( TInt aKey, const TAlfModuleTestType& aTestType, const T& aDefaultValue ):
-        iKey( aKey ),
-        iTestType( aTestType ),
-        iValue( aDefaultValue ),
-        iValueSetCount( 0 )
-        {
-        }
-
-    
-    /**
-     * @param aObject Value to be compared.
-     * @return ETrue if given object equals the value of this item.
-     *         Else EFalse.
-     */
-    TBool Equals( const T& aValue, const TAlfModuleTestType& aTestType ) const
-        {
-        // Also, check that value has been set. If it has not been set,
-        // then think objects as unequals.
-        return ( iValueSetCount > 0 
-                 && iValue == aValue 
-                 && TestTypeMatch( aTestType ) );
-        }
-
-    
-    /**
-     * @return TInt Key that should be set during creation of this object.
-     */
-    TInt Key() const
-        {
-        return iKey;
-        }
-
-    /**
-     * @see ValueSet to check if the value has already been set.
-     * 
-     * @return const T& Value that corresonds the key.
-     */
-    const T& Value() const
-        {
-        return iValue;
-        }
-    
-    
-    /**
-     * @param aValue Value to be set for the key
-     */
-    void SetValue( const T& aValue )
-        {
-        iValue = aValue;
-        ++iValueSetCount;
-        }
-
-    
-    /**
-     * @return TInt Informs how many times the value has been set. 
-     */
-    TInt ValueSetCount() const
-        {
-        return iValueSetCount;
-        }
-    
-    /**
-     * @return const TAlfModuleTestType& Defines what the test is for
-     */
-    const TAlfModuleTestType& TestType() const
-        {
-        return iTestType;
-        }
-
-    
-    /**
-     * @param aTestType
-     * @return TBool ETrue if flag matches this item. Else EFalse.
-     */
-    TBool TestTypeMatch( const TAlfModuleTestType& aTestType ) const
-        {
-        return ( EAlfModuleTestTypeAll == aTestType
-                 || iTestType == aTestType );
-        }
-
-    
-    /**
-     * Resets the item info
-     */
-    void Reset()
-        {
-        iValueSetCount = 0;
-        }
-
-    
-private: // data    
-    
-    TInt iKey;
-    TAlfModuleTestType iTestType;    
-    T iValue;
-    TInt iValueSetCount;
-    
-    };
-
-
-/**
- * Class CAlfModuleTestMap
- * 
- * Provides map functionality for the key-value-pairs.
- * In test cases, this should most likely be used so, that 
- * first test case classes create items with certain keys, for example with handle values.
- * Then, define hooks are used in the code to update values that corresond the correct handles.
- * In the end, test case classes can check that items have correct values set and if the test
- * is passed.
- */
-template< class T >
-NONSHARABLE_CLASS( TAlfModuleTestMap )
-    {
-public:
-
-    // Maximum item count in the map
-    static const TInt KMaxArrayCount = 50;
-
-    
-    /**
-     * Constructor to initialize variables.
-     */
-    TAlfModuleTestMap():
-        iCount( 0 ),
-        iSetValueCallCount( 0 )
-        {            
-        }
-
-    
-    /**
-     * @param aKey
-     * @param aTestType Informs what type of test is accepted. Others are skipped.
-     * @return T* Ownership is not transferred.
-     *            NULL if item is not found.
-     */
-    TAlfModuleTestItem< T >* Find( TInt aKey, const TAlfModuleTestType& aTestType )
-        {
-        // Try to find the item corresponding the given key.
-        for ( TInt i = 0; i < iCount; ++i )
-            {
-            TAlfModuleTestItem< T >& testItem( iArray[ i ] );
-            if ( testItem.Key() == aKey
-                 && testItem.TestTypeMatch( aTestType ) )
-                {
-                return &( testItem );
-                }
-            }
-        // Item corresponding the given key was not found.
-        return NULL;
-        }    
-    
-    
-    /**
-     * Function to append new item into the map.
-     * 
-     * @param aKey
-     * @param aTestType Describes for what case the appended test item is created for.
-     * @return TInt System wide error code.
-     */    
-    TInt Append( TInt aKey, const TAlfModuleTestType& aTestType, const T& aDefaultValue )
-        {
-        if ( iCount == KMaxArrayCount )
-            {
-            // Array already full.
-            return KErrOverflow;
-            }
-        else if ( Find( aKey, aTestType ) )
-            {
-            // Key has already been inserted.
-            return KErrAlreadyExists;
-            }
-        
-        // Append new key value set into the array.
-        iArray[ iCount ] = TAlfModuleTestItem< T >( aKey, aTestType, aDefaultValue );
-        ++iCount;
-        return KErrNone;        
-        }
-
-    
-    /**
-     * Sets the value for the item.
-     * Item itself should already exist in the array before
-     * setting its value here. See, Append function.
-     * 
-     * @param aKey
-     * @param aValue
-     * @return TInt System wide error code.
-     */
-    TInt SetValue( TInt aKey, const T& aValue, const TAlfModuleTestType& aTestType )
-        {
-        // Increase counter, because this function is called.
-        ++iSetValueCallCount;
-        TAlfModuleTestItem< T >* item( Find( aKey, aTestType ) );        
-        if ( !item )
-            {
-            // Item was not found from the array.        
-            return KErrNotFound;
-            }        
-        // Item exists. So, set its values.
-        item->SetValue( aValue );
-        return KErrNone;
-        }
-
-    
-    /**
-     * Resets the map
-     */
-    void Reset()
-        {
-        // Just reset the counter.
-        // We do not bother to reset map items, because when counter is reseted
-        // already set items and their info is left out of the scope.
-        iCount = 0;
-        iSetValueCallCount = 0;
-        }
-    
-    
-    /**
-     * Checks if all the values of items in the array match the given value.
-     * 
-     * @param aValue Reference to the value that items are compared to.
-     * @param aTestType Informs the test type whose items should be compared.
-     */
-    TInt CountEquals( const T& aValue, const TAlfModuleTestType& aTestType ) const
-        {
-        TInt count( 0 );
-        for ( TInt i = 0; i < iCount; ++i )
-            {
-            if ( iArray[ i ].Equals( aValue, aTestType ) )
-                {
-                // Item matches
-                ++count;            
-                }
-            }
-        return count;
-        }
-
-
-    /**
-     * @return TInt Number of map items
-     */
-    TInt ItemCount() const
-        {
-        return iCount;
-        }
-
-
-    /**
-     * @return const TAlfModuleTestItem< T >& Reference to the map item
-     */
-    const TAlfModuleTestItem< T >& Item( TInt aIndex ) const
-        {
-        return iArray[ aIndex ];
-        }
-
-    
-    /**
-     * @return TInt Number of times SetValue function has been called
-     *              since last reset. This information can be used
-     *              to check if hooks have been used correct times during
-     *              a test case. Notice, that this informs the number of
-     *              function calls, not the number of times a value has actually
-     *              set for some item.
-     */
-    TInt SetValueCallCount() const
-        {
-        return iSetValueCallCount;
-        }
-    
-    
-private: // data
-    
-    TAlfModuleTestItem< T > iArray[ KMaxArrayCount ];
-    // Informs number of array items
-    TInt iCount;
-    // Informs how many times SetItem has been called since last reset.
-    // Notice, that this informs the number of function calls, not the number
-    // of times a value has actually set for some item.
-    TInt iSetValueCallCount;
-    
-    };
-
-    
 /*
  *  Class CAlfModuleTestData
  */
@@ -445,7 +49,7 @@
 NONSHARABLE_CLASS(CAlfModuleTestData) : public CBase
     {
 public:
-    void PrintState()
+    void PrintState() const
         {
         RDebug::Print(_L("*** ALF INTERNAL STATE ***"));
         RDebug::Print(_L("iTotalLayerCount[0]=%d"), iTotalLayerCount[0]);
@@ -487,24 +91,57 @@
                          iLatestVisualExtentRect.Width(), iLatestVisualExtentRect.Height());
         RDebug::Print(_L("iTotalVisualFlagChangedCount=%d"), iTotalVisualFlagChangedCount);
         RDebug::Print(_L("iTotalVisualAttributeChangedCount=%d"), iTotalVisualAttributeChangedCount);
+        RDebug::Print(_L("iBoolMap =>"));
+        PrintBoolMapState( iBoolMap );        
+        RDebug::Print(_L("iIntMap =>"));
+        PrintIntMapState( iIntMap );
         RDebug::Print(_L("iSizeMap =>"));
         PrintSizeMapState( iSizeMap );
         RDebug::Print(_L("iPositionMap =>"));
-        PrintPositionMapState( iPositionMap );        
+        PrintPositionMapState( iPositionMap );
+        RDebug::Print(_L("iSurfaceMap =>"));
+        PrintSurfaceMapState( iSurfaceMap );        
         RDebug::Print(_L("*** ALF INTERNAL STATE ***"));
         }
 
+
+    void PrintBoolMapState( const TAlfModuleTestMap< TBool >& aMap ) const
+        {
+        RDebug::Print(_L("*** ALF INTERNAL BOOL MAP STATE -->"));
+        RDebug::Print(_L("Map item count=%d"), aMap.ItemCount());
+        for ( TInt i = 0; i < aMap.ItemCount(); ++i )
+            {
+            const TAlfModuleTestItem< TBool >& item( aMap.Item( i ) );
+            RDebug::Print(_L("Map item %d, iTestType=%d, iKey=%d, iValue=%d, iValueSetCount=%d, iLinkTargetKey=%d"),
+                             i, item.TestType(), item.Key(), item.Value(), item.ValueSetCount(), item.LinkTargetKey());
+            }
+        RDebug::Print(_L("<-- ALF INTERNAL BOOL MAP STATE ***"));
+        }
     
-    void PrintSizeMapState( TAlfModuleTestMap< TSize > aMap )
+    
+    void PrintIntMapState( const TAlfModuleTestMap< TInt >& aMap ) const
+        {
+        RDebug::Print(_L("*** ALF INTERNAL INT MAP STATE -->"));
+        RDebug::Print(_L("Map item count=%d"), aMap.ItemCount());
+        for ( TInt i = 0; i < aMap.ItemCount(); ++i )
+            {
+            const TAlfModuleTestItem< TInt >& item( aMap.Item( i ) );
+            RDebug::Print(_L("Map item %d, iTestType=%d, iKey=%d, iValue=%d, iValueSetCount=%d, iLinkTargetKey=%d"),
+                             i, item.TestType(), item.Key(), item.Value(), item.ValueSetCount(), item.LinkTargetKey());
+            }
+        RDebug::Print(_L("<-- ALF INTERNAL INT MAP STATE ***"));
+        }
+    
+    
+    void PrintSizeMapState( const TAlfModuleTestMap< TSize >& aMap ) const
         {
         RDebug::Print(_L("*** ALF INTERNAL SIZE MAP STATE -->"));
-        RDebug::Print(_L("Map item count=%d, SetValue call count=%d"), 
-                         aMap.ItemCount(), aMap.SetValueCallCount());
+        RDebug::Print(_L("Map item count=%d"), aMap.ItemCount());
         for ( TInt i = 0; i < aMap.ItemCount(); ++i )
             {
             const TAlfModuleTestItem< TSize >& item( aMap.Item( i ) );
-            RDebug::Print(_L("Map item %d, iKey=%d, iTestType=%d, iValueSetCount=%d"),
-                             i, item.Key(), item.TestType(), item.ValueSetCount());
+            RDebug::Print(_L("Map item %d, iTestType=%d, iKey=%d, iValueSetCount=%d, iLinkTargetKey=%d"),
+                             i, item.TestType(), item.Key(), item.ValueSetCount(), item.LinkTargetKey());
             RDebug::Print(_L("Map item index=%d, width=%d, height=%d"),
                              i, item.Value().iWidth, item.Value().iHeight);
             }
@@ -512,23 +149,39 @@
         }
 
     
-    void PrintPositionMapState( TAlfModuleTestMap< TPoint > aMap )
+    void PrintPositionMapState( const TAlfModuleTestMap< TPoint >& aMap ) const
         {
         RDebug::Print(_L("*** ALF INTERNAL POSITION MAP STATE -->"));
-        RDebug::Print(_L("Map item count=%d, SetValue call count=%d"), 
-                         aMap.ItemCount(), aMap.SetValueCallCount());
+        RDebug::Print(_L("Map item count=%d"), aMap.ItemCount() );
         for ( TInt i = 0; i < aMap.ItemCount(); ++i )
             {
             const TAlfModuleTestItem< TPoint >& item( aMap.Item( i ) );
-            RDebug::Print(_L("Map item %d, iKey=%d, iTestType=%d, iValueSetCount=%d"),
-                             i, item.Key(), item.TestType(), item.ValueSetCount());
+            RDebug::Print(_L("Map item %d, iKey=%d, iTestType=%d, iValueSetCount=%d, iLinkTargetKey=%d"),
+                             i, item.Key(), item.TestType(), item.ValueSetCount(), item.LinkTargetKey());
             RDebug::Print(_L("Map item index=%d, x=%d, y=%d"),
                              i, item.Value().iX, item.Value().iY);
             }
         RDebug::Print(_L("<-- ALF INTERNAL POSITION MAP STATE ***"));
-        }    
+        }
 
     
+    void PrintSurfaceMapState( const TAlfModuleTestMap< TSurfaceId >& aMap ) const
+        {
+        RDebug::Print(_L("*** ALF INTERNAL SURFACE MAP STATE -->"));
+        RDebug::Print(_L("Map item count=%d"), aMap.ItemCount() );
+        for ( TInt i = 0; i < aMap.ItemCount(); ++i )
+            {
+            const TAlfModuleTestItem< TSurfaceId >& item( aMap.Item( i ) );
+            RDebug::Print(_L("Map item %d, iKey=%d, iTestType=%d, iValueSetCount=%d, iLinkTargetKey=%d"),
+                             i, item.Key(), item.TestType(), item.ValueSetCount(), item.LinkTargetKey());
+            RDebug::Print(_L("Map item index=%d, internal0=%d, internal1=%d, internal2=%d, internal3=%d"),
+                             i, item.Value().iInternal[ 0 ], item.Value().iInternal[ 1 ],
+                             item.Value().iInternal[ 2 ], item.Value().iInternal[ 3 ] );
+            }
+        RDebug::Print(_L("<-- ALF INTERNAL SURFACE MAP STATE ***"));
+        }
+
+
 public:
     TBool iIsEnabled;           // *** not yet implemented. For run-time enabling/disabling of the test system.  
     
@@ -587,13 +240,19 @@
     TInt iASE_Temp3;
     TInt iASE_Temp4;
 
-    // Map that contains integer items that can be specified for certain test cases.
+    // Map that contains boolean items for certain test cases.
+    TAlfModuleTestMap< TBool > iBoolMap;        
+    // Map that contains integer items for certain test cases.
     TAlfModuleTestMap< TInt > iIntMap;    
-    // Map that contains size items that can be specified for certain test cases.
+    // Map that contains size items for certain test cases.
     TAlfModuleTestMap< TSize > iSizeMap;
-    // Map that contains position items that can be specified for certain test cases.
-    TAlfModuleTestMap< TPoint > iPositionMap;    
-
+    // Map that contains position items for certain test cases.
+    TAlfModuleTestMap< TPoint > iPositionMap;
+    // Map that contains rect items for certain test cases.
+    TAlfModuleTestMap< TRect > iRectMap;
+    // Map that contains surface id items for layer/surface test cases.
+    TAlfModuleTestMap< TSurfaceId > iSurfaceMap;
+    
     };
 
 
@@ -650,7 +309,8 @@
     CAlfModuleTestData* iModuleTestData; // Not owned
     };
 
-#endif
+#endif // USE_MODULE_TEST_HOOKS_FOR_ALF
+
 
 #endif // ALFMODULETEST_H
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/uiacceltk/hitchcock/CommonInc/alfmoduletestconf.h	Mon May 03 13:22:43 2010 +0300
@@ -0,0 +1,25 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+#ifndef ALF_MODULETEST_CONF_H
+#define ALF_MODULETEST_CONF_H
+
+// Define this to build module testing enchanced version of ALF
+//#define USE_MODULE_TEST_HOOKS_FOR_ALF
+
+#endif // ALF_MODULETEST_CONF_H
+
+// End of File
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/uiacceltk/hitchcock/CommonInc/alfmoduletestconsts.h	Mon May 03 13:22:43 2010 +0300
@@ -0,0 +1,53 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+/**
+ * Provides general constants for test cases.
+ */
+
+#include "alfmoduletestconf.h"
+#ifdef USE_MODULE_TEST_HOOKS_FOR_ALF
+
+#ifndef ALFMODULETESTCONSTS_H
+#define ALFMODULETESTCONSTS_H
+
+#include <e32def.h>
+
+
+/**
+ * Constants
+ */
+namespace AlfModuleTestConsts
+    {
+    /**
+     * When flush is requested, the flow should wait long enough.
+     * Then, a test case should have plenty of time to finish itself.
+     */
+    const TInt KFlushLongWaitTime( 2000000 );
+    
+    /**
+     * When flush is requested, the flow should wait.
+     * Then, a normal test case should have enough time to finish itself.
+     */
+    const TInt KFlushWaitTime( 200000 );
+    }
+
+
+#endif // ALFMODULETESTCONSTS_H
+
+#endif // USE_MODULE_TEST_HOOKS_FOR_ALF
+
+// End of File
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/uiacceltk/hitchcock/CommonInc/alfmoduletestdefines.h	Mon May 03 13:22:43 2010 +0300
@@ -0,0 +1,251 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+/**
+ * @see alfmoduletest.h for class implementations that these defines use.
+ */
+
+#ifndef ALF_MODULE_TEST_DEFINES_H
+#define ALF_MODULE_TEST_DEFINES_H
+
+
+// Informs if module test hooks have been set on.
+#include "alfmoduletestconf.h"
+
+
+#ifndef USE_MODULE_TEST_HOOKS_FOR_ALF
+    // Use empty defines if module test hook is not set.
+
+    #define AMT_DATA()
+    #define AMT_FUNC(func)
+    #define AMT_FUNC_EXC(func)
+    #define AMT_FUNC_EXC_RET(ret, func)
+    #define AMT_FUNC_EXC_IF(cond, func)
+    #define AMT_FUNC_EXC_IF_RET(cond, ret, func)
+    #define AMT_INC_COUNTER(member)
+    #define AMT_DEC_COUNTER(member)
+    #define AMT_SET_VALUE(member, val)
+    #define AMT_GET_VALUE(x, member)
+    #define AMT_INC_COUNTER_IF(cond, member)
+    #define AMT_DEC_COUNTER_IF(cond, member)
+    #define AMT_SET_VALUE_IF(cond, member, val)
+    #define AMT_GET_VALUE_IF(cond, x, member)
+    
+    #define AMT_MAP_PTR_TO_KEY_CAST( keyPtr )
+    #define AMT_MAP_CPTR_TO_KEY_CAST( keyCPtr )
+    #define AMT_MAP_APPEND_IF(cond, memberMap, key, defaultValue, type)
+    #define AMT_MAP_APPEND(memberMap, key, defaultValue, type)
+    #define AMT_MAP_APPEND_LINK_IF(cond, memberMap, linkKey, targetKey, type)
+    #define AMT_MAP_APPEND_LINK(memberMap, linkKey, targetKey, type)
+    #define AMT_MAP_APPEND_AND_LINK_IF(cond, memberMap, linkKey, actualKey, defaultValue, type)
+    #define AMT_MAP_APPEND_AND_LINK(memberMap, linkKey, actualKey, defaultValue, type)
+    #define AMT_MAP_SET_VALUE_IF(cond, memberMap, key, value, type)
+    #define AMT_MAP_INC_VALUE_IF(cond, memberMap, key, type)
+    #define AMT_MAP_DEC_VALUE_IF(cond, memberMap, key, type)
+    #define AMT_MAP_SET_VALUE(memberMap, key, value, type)
+    #define AMT_MAP_INC_VALUE(memberMap, key, type)
+    #define AMT_MAP_DEC_VALUE(memberMap, key, type)
+    #define AMT_MAP_APPEND_ACCEPT_IF(cond, memberMap, testType)
+    #define AMT_MAP_APPEND_ACCEPT(memberMap, testType)
+    #define AMT_MAP_RESET_ITEMS(memberMap, defaultValue, type)
+    #define AMT_MAP_RESET(memberMap)
+    
+    #define AMT_PRINT_STATE()
+
+#else
+    // Module test hook has been set.
+
+    #ifndef AMT_CONTROL
+        #error "Error: you need to define AMT_CONTROL macro in your code to be able to use ALF module test system!"
+        // The user have to define AMT_CONTROL, e.g. like this:
+        // #define AMT_CONTROL() static_cast<CAlfModuleTestDataControl*>(Dll::Tls())
+        // or
+        // #define AMT_CONTROL() iMyModuleTestDataControl
+        // etc.
+    #endif // AMT_CONTROL
+
+
+    //  *** Use these macros to access global memory chunk
+    
+    
+    // Note: If you read/write a large block of data members, it is advisable not use the AMT_FUNC_EXC() based macros below. 
+    //       Use Lock() and Unlock() around the block explicitely, and use AMT_FUNC() macro.
+    //       That is to avoid unnecessary nested lock-unlock sequences (even if nested locks are working ok).
+    
+    // Note: Be careful not to lock the the mutex for a long time as it will halt other processes if they are using the lock during that time!
+    
+    // Generic macros
+    #define AMT_DATA()                              AMT_CONTROL()->iModuleTestData
+    #define AMT_FUNC(func)                          if (AMT_DATA()->iIsEnabled) {func;}                                         
+    #define AMT_FUNC_EXC(func)                      {AMT_CONTROL()->Lock(); if (AMT_DATA()->iIsEnabled) {func;} AMT_CONTROL()->Unlock();}
+    #define AMT_FUNC_EXC_RET(ret, func)             {AMT_CONTROL()->Lock(); if (AMT_DATA()->iIsEnabled) {ret = func;} AMT_CONTROL()->Unlock();}
+    #define AMT_FUNC_EXC_IF(cond, func)             {AMT_CONTROL()->Lock(); if (AMT_DATA()->iIsEnabled && (cond)) {func;} AMT_CONTROL()->Unlock();}        
+    #define AMT_FUNC_EXC_IF_RET(cond, ret, func)    {AMT_CONTROL()->Lock(); if (AMT_DATA()->iIsEnabled && (cond)) {ret = func;} AMT_CONTROL()->Unlock();}
+    
+    // Single operation macros, that will do lock/unlock.
+    #define AMT_INC_COUNTER(member)                 AMT_FUNC_EXC(AMT_DATA()->member++)
+    #define AMT_DEC_COUNTER(member)                 AMT_FUNC_EXC(AMT_DATA()->member--)
+    #define AMT_SET_VALUE(member, val)              AMT_FUNC_EXC(AMT_DATA()->member=(val))
+    #define AMT_GET_VALUE(x, member)                AMT_FUNC_EXC((x) = AMT_DATA()->member)
+    
+    // Conditional single operation macros, that will do lock/unlock.
+    #define AMT_INC_COUNTER_IF(cond, member)        AMT_FUNC_EXC_IF((cond), AMT_DATA()->member++)
+    #define AMT_DEC_COUNTER_IF(cond, member)        AMT_FUNC_EXC_IF((cond), AMT_DATA()->member--)
+    #define AMT_SET_VALUE_IF(cond, member, val)     AMT_FUNC_EXC_IF((cond), AMT_DATA()->member=(val))
+    #define AMT_GET_VALUE_IF(cond, x, member)       AMT_FUNC_EXC_IF((cond), (x) = AMT_DATA()->member)
+    
+    // Map operation macros, that will do lock/unlock
+    #define AMT_MAP_PTR_TO_KEY_CAST( keyPtr )                                                   reinterpret_cast< TInt >( keyPtr )
+    #define AMT_MAP_CPTR_TO_KEY_CAST( keyCPtr )                                                 AMT_MAP_PTR_TO_KEY_CAST( static_cast< const CBase* >( keyCPtr ) )
+    #define AMT_MAP_APPEND_IF(cond, memberMap, key, defaultValue, type)                         AMT_FUNC_EXC_IF((cond), AMT_DATA()->memberMap.Append(type, key, defaultValue))
+    #define AMT_MAP_APPEND(memberMap, key, defaultValue, type)                                  AMT_MAP_APPEND_IF(ETrue, memberMap, key, defaultValue, type)
+    #define AMT_MAP_APPEND_LINK_IF(cond, memberMap, linkKey, targetKey, type)                   AMT_FUNC_EXC_IF((cond), AMT_DATA()->memberMap.AppendLink(type, linkKey, targetKey))
+    #define AMT_MAP_APPEND_LINK(memberMap, linkKey, targetKey, type)                            AMT_MAP_APPEND_LINK_IF(ETrue, memberMap, linkKey, targetKey, type)
+    #define AMT_MAP_APPEND_AND_LINK_IF(cond, memberMap, linkKey, actualKey, defaultValue, type) AMT_MAP_APPEND_IF(cond, memberMap, actualKey, defaultValue, type ); AMT_MAP_APPEND_LINK_IF(cond, memberMap, linkKey, actualKey, type)
+    #define AMT_MAP_APPEND_AND_LINK(memberMap, linkKey, actualKey, defaultValue, type)          AMT_MAP_APPEND_AND_LINK_IF(ETrue, memberMap, linkKey, actualKey, defaultValue, type)
+    #define AMT_MAP_SET_VALUE_IF(cond, memberMap, key, value, type)                             AMT_FUNC_EXC_IF((cond), AMT_DATA()->memberMap.SetActualValue(type, key, value))
+    #define AMT_MAP_INC_VALUE_IF(cond, memberMap, key, type)                                    AMT_FUNC_EXC_IF((cond && AMT_DATA()->memberMap.FindActual(type, key)), AMT_DATA()->memberMap.SetActualValue(type, key, AMT_DATA()->memberMap.FindActual(type, key)->Value() + 1))
+    #define AMT_MAP_DEC_VALUE_IF(cond, memberMap, key, type)                                    AMT_FUNC_EXC_IF((cond && AMT_DATA()->memberMap.FindActual(type, key)), AMT_DATA()->memberMap.SetActualValue(type, key, AMT_DATA()->memberMap.FindActual(type, key)->Value() - 1))
+    #define AMT_MAP_SET_VALUE(memberMap, key, value, type)                                      AMT_FUNC_EXC_IF(ETrue, AMT_DATA()->memberMap.SetActualValue(type, key, value))
+    #define AMT_MAP_INC_VALUE(memberMap, key, type)                                             AMT_MAP_INC_VALUE_IF(ETrue, memberMap, key, type)              
+    #define AMT_MAP_DEC_VALUE(memberMap, key, type)                                             AMT_MAP_DEC_VALUE_IF(ETrue, memberMap, key, type)
+    #define AMT_MAP_APPEND_ACCEPT_IF(cond, memberMap, testType)                                 AMT_FUNC_EXC_IF((cond), AMT_DATA()->memberMap.AppendAccept(testType))
+    #define AMT_MAP_APPEND_ACCEPT(memberMap, testType)                                          AMT_MAP_APPEND_ACCEPT_IF(ETrue, memberMap, testType)
+    #define AMT_MAP_RESET_ITEMS(memberMap, defaultValue, type)                                  AMT_FUNC_EXC(AMT_DATA()->memberMap.ResetItems(type, defaultValue))
+    #define AMT_MAP_RESET(memberMap)                                                            AMT_FUNC_EXC(AMT_DATA()->memberMap.Reset())
+    
+    #define AMT_PRINT_STATE()   AMT_FUNC_EXC(AMT_DATA()->PrintState())
+
+#endif // USE_MODULE_TEST_HOOKS_FOR_ALF
+
+
+// General defines
+// Text cursor handle is defined as constant because correct handle is not provided
+// from the window server for render stage.
+#define AMT_MAP_TEXT_CURSOR_HANDLE 0
+
+
+// Notice: 
+// Defines below will be empty if module test hook is not set.
+// If module test hook is set on, then these defines also use functionality defined above.  
+
+
+// Render stage defines
+
+#define AMT_MAP_RENDER_STAGE_NODE_CREATED() \
+        AMT_MAP_APPEND_IF( ( MWsWindowTreeNode::EWinTreeNodeClient == nodeType && aWindowTreeNode.Window() ), iIntMap, aWindowTreeNode.Window()->Handle(), 0, EAlfModuleTestTypeRenderStageCreateWindow ); \
+        AMT_MAP_APPEND_IF( ( MWsWindowTreeNode::EWinTreeNodeClient == nodeType && aWindowTreeNode.Window() ), iIntMap, aWindowTreeNode.Window()->Handle(), 0, EAlfModuleTestTypeRenderStageReleaseWindow ); \
+        AMT_MAP_APPEND_IF( ( MWsWindowTreeNode::EWinTreeNodeClient == nodeType && aWindowTreeNode.Window() ), iBoolMap, aWindowTreeNode.Window()->Handle(), EFalse, EAlfModuleTestTypeRenderStageActiveWindow ); \
+        AMT_MAP_APPEND_IF( ( MWsWindowTreeNode::EWinTreeNodeClient == nodeType && aWindowTreeNode.Window() ), iSizeMap, aWindowTreeNode.Window()->Handle(), TSize(), EAlfModuleTestTypeRenderStageChangeWindowSize ); \
+        AMT_MAP_APPEND_IF( ( MWsWindowTreeNode::EWinTreeNodeClient == nodeType && aWindowTreeNode.Window() ), iPositionMap, aWindowTreeNode.Window()->Handle(), TPoint(), EAlfModuleTestTypeRenderStageChangeWindowPosition ); \
+        AMT_MAP_APPEND_IF( ( MWsWindowTreeNode::EWinTreeNodeClient == nodeType && aWindowTreeNode.Window() ), iBoolMap, aWindowTreeNode.Window()->Handle(), EFalse, EAlfModuleTestTypeRenderStageChangeWindowVisibility ); \
+        AMT_MAP_APPEND_IF( ( MWsWindowTreeNode::EWinTreeNodeGroup == nodeType && aWindowTreeNode.WindowGroup() ), iIntMap, aWindowTreeNode.WindowGroup()->Identifier(), 0, EAlfModuleTestTypeRenderStageCreateWindowGroup ); \
+        AMT_MAP_APPEND_IF( ( MWsWindowTreeNode::EWinTreeNodeGroup == nodeType && aWindowTreeNode.WindowGroup() ), iIntMap, aWindowTreeNode.WindowGroup()->Identifier(), 0, EAlfModuleTestTypeRenderStageReleaseWindowGroup ); \
+        AMT_MAP_APPEND_IF( ( MWsWindowTreeNode::EWinTreeNodeStandardTextCursor == nodeType ), iIntMap, AMT_MAP_TEXT_CURSOR_HANDLE, 0, EAlfModuleTestTypeRenderStageChangeTextCursorType ); \
+        AMT_MAP_APPEND_IF( ( MWsWindowTreeNode::EWinTreeNodeStandardTextCursor == nodeType ), iIntMap, AMT_MAP_TEXT_CURSOR_HANDLE, 0, EAlfModuleTestTypeRenderStageChangeTextCursorClipRect ); \
+        AMT_MAP_APPEND_IF( ( MWsWindowTreeNode::EWinTreeNodeStandardTextCursor == nodeType ), iIntMap, AMT_MAP_TEXT_CURSOR_HANDLE, 0, EAlfModuleTestTypeRenderStageChangeTextCursorFlag ); \
+        AMT_MAP_APPEND_IF( ( MWsWindowTreeNode::EWinTreeNodeStandardTextCursor == nodeType ), iIntMap, AMT_MAP_TEXT_CURSOR_HANDLE, 0, EAlfModuleTestTypeRenderStageChangeTextCursorColor ); \
+        \
+        AMT_MAP_INC_VALUE_IF( ( MWsWindowTreeNode::EWinTreeNodeClient == nodeType && aWindowTreeNode.Window() ), iIntMap, aWindowTreeNode.Window()->Handle(), EAlfModuleTestTypeRenderStageCreateWindow ); \
+        AMT_MAP_INC_VALUE_IF( ( MWsWindowTreeNode::EWinTreeNodeGroup == nodeType && aWindowTreeNode.WindowGroup() ), iIntMap, aWindowTreeNode.WindowGroup()->Identifier(), EAlfModuleTestTypeRenderStageCreateWindowGroup )
+
+#define AMT_MAP_RENDER_STAGE_TEXT_CURSOR_CHANGE() \
+        AMT_MAP_INC_VALUE_IF( ( aWindowTreeNode.NodeType() == MWsWindowTreeNode::EWinTreeNodeStandardTextCursor && aAttribute == ECursorType ), iIntMap, AMT_MAP_TEXT_CURSOR_HANDLE, EAlfModuleTestTypeRenderStageChangeTextCursorType ); \
+        AMT_MAP_INC_VALUE_IF( ( aWindowTreeNode.NodeType() == MWsWindowTreeNode::EWinTreeNodeStandardTextCursor && aAttribute == ECursorClipRect ), iIntMap, AMT_MAP_TEXT_CURSOR_HANDLE, EAlfModuleTestTypeRenderStageChangeTextCursorClipRect ); \
+        AMT_MAP_INC_VALUE_IF( ( aWindowTreeNode.NodeType() == MWsWindowTreeNode::EWinTreeNodeStandardTextCursor && aAttribute == ECursorFlags ), iIntMap, AMT_MAP_TEXT_CURSOR_HANDLE, EAlfModuleTestTypeRenderStageChangeTextCursorFlag ); \
+        AMT_MAP_INC_VALUE_IF( ( aWindowTreeNode.NodeType() == MWsWindowTreeNode::EWinTreeNodeStandardTextCursor && aAttribute == ECursorColor ), iIntMap, AMT_MAP_TEXT_CURSOR_HANDLE, EAlfModuleTestTypeRenderStageChangeTextCursorColor )
+
+#define AMT_MAP_RENDER_STAGE_ADD_LAYER() \
+        AMT_MAP_APPEND_IF( aLayer, iSurfaceMap, AMT_MAP_PTR_TO_KEY_CAST( aLayer ), TSurfaceId::CreateNullId(), EAlfModuleTestTypeRenderStageCreateLayer ); \
+        AMT_MAP_APPEND_IF( aLayer, iSurfaceMap, AMT_MAP_PTR_TO_KEY_CAST( aLayer ), TSurfaceId::CreateNullId(), EAlfModuleTestTypeRenderStageReleaseLayer )
+
+#define AMT_MAP_RENDER_STAGE_ADD_LAYER_LINK() \
+        AMT_MAP_APPEND_LINK( iSurfaceMap, windowId, AMT_MAP_PTR_TO_KEY_CAST( &aLayer ), EAlfModuleTestTypeRenderStageCreateLayer ); \
+        AMT_MAP_APPEND_LINK( iSurfaceMap, windowId, AMT_MAP_PTR_TO_KEY_CAST( &aLayer ), EAlfModuleTestTypeRenderStageReleaseLayer ); \
+        \
+        AMT_MAP_SET_VALUE( iSurfaceMap, windowId, aLayer.Surface(), EAlfModuleTestTypeRenderStageCreateLayer )
+
+
+// Streamer defines
+                          
+#define AMT_MAP_STREAMER_NODE_WINDOW_CONSTRUCT() \
+        AMT_MAP_APPEND_AND_LINK( iIntMap, iId, iNodeWindowConstructionStruct.iWindowHandle, 0, EAlfModuleTestTypeHierarchyModelCreateWindow ); \
+        AMT_MAP_APPEND_AND_LINK( iIntMap, iId, iNodeWindowConstructionStruct.iWindowHandle, 0, EAlfModuleTestTypeHierarchyModelReleaseWindow ); \
+        AMT_MAP_APPEND_AND_LINK( iBoolMap, iId, iNodeWindowConstructionStruct.iWindowHandle, EFalse, EAlfModuleTestTypeHierarchyModelActiveWindow ); \
+        AMT_MAP_APPEND_AND_LINK( iSizeMap, iId, iNodeWindowConstructionStruct.iWindowHandle, TSize(), EAlfModuleTestTypeHierarchyModelChangeWindowSize ); \
+        AMT_MAP_APPEND_AND_LINK( iPositionMap, iId, iNodeWindowConstructionStruct.iWindowHandle, TPoint(), EAlfModuleTestTypeHierarchyModelChangeWindowPosition ); \
+        AMT_MAP_APPEND_AND_LINK( iBoolMap, iId, iNodeWindowConstructionStruct.iWindowHandle, EFalse, EAlfModuleTestTypeHierarchyModelChangeWindowVisibility )
+
+#define AMT_MAP_STREAMER_NODE_GROUP_CONSTRUCT() \
+        AMT_MAP_APPEND_AND_LINK( iIntMap, iId, clientHandle, 0, EAlfModuleTestTypeHierarchyModelCreateWindowGroup ); \
+        AMT_MAP_APPEND_AND_LINK( iIntMap, iId, clientHandle, 0, EAlfModuleTestTypeHierarchyModelReleaseWindowGroup )
+
+#define AMT_MAP_STREAMER_TEXT_CURSOR_CONSTRUCT() \
+        AMT_MAP_APPEND( iIntMap, AMT_MAP_TEXT_CURSOR_HANDLE, 0, EAlfModuleTestTypeHierarchyModelChangeTextCursorType ); \
+        AMT_MAP_APPEND( iIntMap, AMT_MAP_TEXT_CURSOR_HANDLE, 0, EAlfModuleTestTypeHierarchyModelChangeTextCursorClipRect ); \
+        AMT_MAP_APPEND( iIntMap, AMT_MAP_TEXT_CURSOR_HANDLE, 0, EAlfModuleTestTypeHierarchyModelChangeTextCursorFlag ); \
+        AMT_MAP_APPEND( iIntMap, AMT_MAP_TEXT_CURSOR_HANDLE, 0, EAlfModuleTestTypeHierarchyModelChangeTextCursorColor )
+
+#define AMT_MAP_STREAMER_TEXT_CURSOR_CHANGE() \
+        AMT_MAP_INC_VALUE_IF( ( attribute == MWsWindowTreeObserver::ECursorType ), iIntMap, AMT_MAP_TEXT_CURSOR_HANDLE, EAlfModuleTestTypeHierarchyModelChangeTextCursorType ); \
+        AMT_MAP_INC_VALUE_IF( ( attribute == MWsWindowTreeObserver::ECursorClipRect ), iIntMap, AMT_MAP_TEXT_CURSOR_HANDLE, EAlfModuleTestTypeHierarchyModelChangeTextCursorClipRect ); \
+        AMT_MAP_INC_VALUE_IF( ( attribute == MWsWindowTreeObserver::ECursorFlags ), iIntMap, AMT_MAP_TEXT_CURSOR_HANDLE, EAlfModuleTestTypeHierarchyModelChangeTextCursorFlag ); \
+        AMT_MAP_INC_VALUE_IF( ( attribute == MWsWindowTreeObserver::ECursorColor ), iIntMap, AMT_MAP_TEXT_CURSOR_HANDLE, EAlfModuleTestTypeHierarchyModelChangeTextCursorColor )
+
+                                 
+// Alfserver defines
+
+#define AMT_MAP_BRIDGE_ADD_VISUAL() \
+        AMT_MAP_APPEND_AND_LINK( iIntMap, aWindowNodeId, aClientSideId, 0, EAlfModuleTestTypeBridgeCreateWindow ); \
+        AMT_MAP_APPEND_AND_LINK( iIntMap, aWindowNodeId, aClientSideId, 0, EAlfModuleTestTypeBridgeReleaseWindow ); \
+        AMT_MAP_APPEND_AND_LINK( iBoolMap, aWindowNodeId, aClientSideId, EFalse, EAlfModuleTestTypeBridgeActiveWindow ); \
+        AMT_MAP_APPEND_AND_LINK( iSizeMap, aWindowNodeId, aClientSideId, TSize(), EAlfModuleTestTypeBridgeChangeWindowSize ); \
+        AMT_MAP_APPEND_AND_LINK( iPositionMap, aWindowNodeId, aClientSideId, TPoint(), EAlfModuleTestTypeBridgeChangeWindowPosition ); \
+        AMT_MAP_APPEND_AND_LINK( iBoolMap, aWindowNodeId, aClientSideId, EFalse, EAlfModuleTestTypeBridgeChangeWindowVisibility ); \
+        \
+        AMT_MAP_APPEND_AND_LINK_IF( aVisual, iRectMap, AMT_MAP_CPTR_TO_KEY_CAST( aVisual ), aClientSideId, TRect(), EAlfModuleTestTypeCoreToolkitDrawWindow ); \
+        AMT_MAP_APPEND_AND_LINK_IF( aVisual, iRectMap, AMT_MAP_CPTR_TO_KEY_CAST( aVisual ), aClientSideId, TRect(), EAlfModuleTestTypeCoreToolkitDrawFromRenderBuffer ); \
+        \
+        AMT_MAP_APPEND( iBoolMap, aClientSideId, ETrue, EAlfModuleTestTypeBridgeCreateWindow ); \
+        AMT_MAP_APPEND( iBoolMap, aClientSideId, EFalse, EAlfModuleTestTypeBridgeVisualVisibility ); \
+        AMT_MAP_APPEND_LINK_IF( aVisual, iBoolMap, AMT_MAP_CPTR_TO_KEY_CAST( aVisual ), aClientSideId, EAlfModuleTestTypeBridgeVisualVisibility ); \
+        AMT_MAP_APPEND( iBoolMap, aClientSideId, EFalse, EAlfModuleTestTypeBridgeReleaseWindow ); \
+        AMT_MAP_APPEND_LINK( iBoolMap, aWindowNodeId, aClientSideId, EAlfModuleTestTypeBridgeReleaseWindow ); \
+        \
+        AMT_MAP_INC_VALUE( iIntMap, aClientSideId, EAlfModuleTestTypeBridgeCreateWindow )
+        
+#define AMT_MAP_BRIDGE_CREATE_CONTROL_GROUP() \
+        AMT_MAP_APPEND_AND_LINK( iIntMap, aWindowGroupNodeId, aClientWindowGroupId, 0, EAlfModuleTestTypeBridgeCreateWindowGroup ); \
+        AMT_MAP_APPEND_AND_LINK( iIntMap, aWindowGroupNodeId, aClientWindowGroupId, 0, EAlfModuleTestTypeBridgeReleaseWindowGroup ); \
+        \
+        AMT_MAP_INC_VALUE( iIntMap, aClientWindowGroupId, EAlfModuleTestTypeBridgeCreateWindowGroup )
+
+#define AMT_MAP_BRIDGE_ADD_TEXT_CURSOR() \
+        AMT_MAP_APPEND( iIntMap, AMT_MAP_TEXT_CURSOR_HANDLE, 0, EAlfModuleTestTypeBridgeChangeTextCursorType ); \
+        AMT_MAP_APPEND( iIntMap, AMT_MAP_TEXT_CURSOR_HANDLE, 0, EAlfModuleTestTypeBridgeChangeTextCursorClipRect ); \
+        AMT_MAP_APPEND( iIntMap, AMT_MAP_TEXT_CURSOR_HANDLE, 0, EAlfModuleTestTypeBridgeChangeTextCursorFlag ); \
+        AMT_MAP_APPEND( iIntMap, AMT_MAP_TEXT_CURSOR_HANDLE, 0, EAlfModuleTestTypeBridgeChangeTextCursorColor )
+
+#define AMT_MAP_BRIDGE_TEXT_CURSOR_CHANGE() \
+        AMT_MAP_INC_VALUE_IF( viz, iIntMap, AMT_MAP_TEXT_CURSOR_HANDLE, EAlfModuleTestTypeBridgeChangeTextCursorType ); \
+        AMT_MAP_INC_VALUE_IF( viz, iIntMap, AMT_MAP_TEXT_CURSOR_HANDLE, EAlfModuleTestTypeBridgeChangeTextCursorClipRect ); \
+        AMT_MAP_INC_VALUE_IF( viz, iIntMap, AMT_MAP_TEXT_CURSOR_HANDLE, EAlfModuleTestTypeBridgeChangeTextCursorFlag ); \
+        AMT_MAP_INC_VALUE_IF( viz, iIntMap, AMT_MAP_TEXT_CURSOR_HANDLE, EAlfModuleTestTypeBridgeChangeTextCursorColor )
+
+        
+#endif // ALF_MODULE_TEST_DEFINES_H
+
+// End of File
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/uiacceltk/hitchcock/CommonInc/alfmoduletestitem.h	Mon May 03 13:22:43 2010 +0300
@@ -0,0 +1,204 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+/**
+ * @note This class is provided only if module test hooks are set on.
+ */
+
+#include "alfmoduletestconf.h"
+#ifdef USE_MODULE_TEST_HOOKS_FOR_ALF
+
+#ifndef ALFMODULETESTITEM_H
+#define ALFMODULETESTITEM_H
+
+#include <e32def.h> 
+#include "alfmoduletesttype.h"
+
+
+/**
+ * CAlfModuleTestItem
+ * 
+ * Provides key-value pair that is used in TAlfModuleTestMap.
+ */
+template< class T >
+NONSHARABLE_CLASS( TAlfModuleTestItem )
+    {
+    
+public:
+
+    /**
+     * Default constructor
+     * 
+     * This is provided for copy operations that may required default constructor.
+     * For normal cases, use another constructor instead to initialize the item
+     * with correct values.
+     */
+    TAlfModuleTestItem():
+        iTestType( EAlfModuleTestTypeNone ),    
+        iKey( 0 ),
+        iValueSetCount( 0 ),
+        iLinkTargetKey( KErrNotFound )
+        {    
+        }
+
+
+    /**
+     * Constructor to initialize variables.
+     * 
+     * @param aTestType Defines for what this test item is meant for.
+     * @param aKey Key that identifies the item.
+     *             In test cases this could be for example handle.
+     * @param aDefaultValue Default value for the map item.
+     */
+    TAlfModuleTestItem( const TAlfModuleTestType& aTestType, TInt aKey, const T& aDefaultValue ):
+        iTestType( aTestType ),
+        iKey( aKey ),
+        iValue( aDefaultValue ),
+        iValueSetCount( 0 ),
+        iLinkTargetKey( KErrNotFound )
+        {
+        }
+
+    
+    /**
+     * @note Be carefull when comparing items because some items may
+     * be link items instead of original items.
+     * 
+     * @param aTestType Test type of accepted item.
+     * @param aValue Item value to be compared.
+     * @return ETrue if given object equals the value of this item.
+     *         Else EFalse.
+     */
+    TBool Equals( const TAlfModuleTestType& aTestType, const T& aValue ) const
+        {
+        // Also, check that value has been set. If it has not been set,
+        // then think objects as unequals.
+        return ( iValueSetCount > 0 
+                 && iValue == aValue 
+                 && TestTypeMatch( aTestType ) );
+        }
+
+    
+    /**
+     * @return TInt Key that should be set during creation of this object.
+     */
+    TInt Key() const
+        {
+        return iKey;
+        }
+
+    
+    /**
+     * @see TAlfModuleTestItem::ValueSetCount to check if the value has already been set.
+     * 
+     * @return const T& Value that corresonds the key.
+     */
+    const T& Value() const
+        {
+        return iValue;
+        }
+    
+    
+    /**
+     * @param aValue Value to be set for the key
+     */
+    void SetValue( const T& aValue )
+        {
+        iValue = aValue;
+        ++iValueSetCount;
+        }
+
+    
+    /**
+     * @return TInt Informs how many times the value has been set. 
+     */
+    TInt ValueSetCount() const
+        {
+        return iValueSetCount;
+        }
+    
+    
+    /**
+     * @return const TAlfModuleTestType& Defines what the test is for.
+     */
+    const TAlfModuleTestType& TestType() const
+        {
+        return iTestType;
+        }
+
+    
+    /**
+     * @param aTestType Type of the test this item is for.
+     * @return TBool ETrue if flag matches this item. Else EFalse.
+     */
+    TBool TestTypeMatch( const TAlfModuleTestType& aTestType ) const
+        {
+        return ( EAlfModuleTestTypeAll == aTestType
+                 || EAlfModuleTestTypeAll == iTestType
+                 || iTestType == aTestType );
+        }
+
+    
+    /**
+     * @param aLinkTargetKey Key of the item that this item links to. 
+     *                       KErrNotFound if this is not a link item.
+     */
+    void SetLinkTargetKey( TInt aLinkTargetKey )
+        {
+        iLinkTargetKey = aLinkTargetKey;
+        }
+
+    
+    /**
+     * @return TInt Key of the item that this item links to. 
+     *              KErrNotFound if this is not a link item.
+     */    
+    TInt LinkTargetKey() const
+        {
+        return iLinkTargetKey;
+        }
+
+    
+    /**
+     * Resets this item to the given default value and 
+     * sets value set count to zero.
+     * 
+     * @note Type, key and link target remain unchanged.
+     * 
+     * @param aDefaultValue Default value for the item.
+     */
+    void Reset( const T& aDefaultValue )
+        {
+        iValue = aDefaultValue;
+        iValueSetCount = 0;
+        }
+
+    
+private: // data    
+
+    TAlfModuleTestType iTestType;
+    TInt iKey;
+    T iValue;
+    TInt iValueSetCount;
+    TInt iLinkTargetKey;
+    
+    };
+
+#endif // ALFMODULETESTITEM_H
+
+#endif // USE_MODULE_TEST_HOOKS_FOR_ALF
+
+// End of File
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/uiacceltk/hitchcock/CommonInc/alfmoduletestmap.h	Mon May 03 13:22:43 2010 +0300
@@ -0,0 +1,382 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+/**
+ * @note This class is provided only if module test hooks are set on.
+ */
+
+#include "alfmoduletestconf.h"
+#ifdef USE_MODULE_TEST_HOOKS_FOR_ALF
+
+#ifndef ALFMODULETESTMAP_H
+#define ALFMODULETESTMAP_H
+
+#include <e32def.h> 
+#include "alfmoduletestitem.h"
+#include "alfmoduletesttype.h"
+
+
+/**
+ * Class CAlfModuleTestMap
+ * 
+ * Provides map functionality for the key-value-pairs.
+ * In test cases, this should most likely be used so, that 
+ * first test case classes create items with certain keys, for example with handle values.
+ * Then, define hooks are used in the code to update values that corresond the correct handles.
+ * In the end, test case classes can check that items have correct values set and if the test
+ * is passed.
+ * 
+ * @note When this item is copied, also the contents of the map item array are copied
+ *       into new map item array. In other words, copy can be thought as deep copy
+ *       instead of just shallow copy of array pointer.
+ *       
+ * @see CAlfModuleTestItem
+ */
+template< class T >
+NONSHARABLE_CLASS( TAlfModuleTestMap )
+    {
+public:
+
+    // Maximum item count in the map
+    static const TInt KMaxArrayCount = 100;
+
+    // Maximum accepted test type count in the map
+    static const TInt KMaxAcceptArrayCount = 20;
+    
+    
+    /**
+     * Constructor to initialize variables.
+     */
+    TAlfModuleTestMap():
+        iArrayCount( 0 )
+        {
+        }
+
+    
+    /**
+     * @note This will return normal items and also items that are links.
+     * 
+     * @param aTestType Informs what type of test is accepted. Others are skipped.
+     * @param aKey Key of the map item.
+     * @return T* Ownership is not transferred.
+     *            NULL if item is not found.
+     */
+    TAlfModuleTestItem< T >* Find( const TAlfModuleTestType& aTestType, TInt aKey )
+        {
+        // Try to find the item corresponding the given key.
+        for ( TInt i = 0; i < iArrayCount; ++i )
+            {
+            TAlfModuleTestItem< T >& testItem( iArray[ i ] );
+            if ( testItem.Key() == aKey
+                 && testItem.TestTypeMatch( aTestType ) )
+                {
+                return &( testItem );
+                }
+            }
+        // Item corresponding the given key was not found.
+        return NULL;
+        }    
+
+    
+    /**
+     * Finds the actual item.
+     * 
+     * @note If the given key identifies a link item, 
+     *       then search is continued to the actual item
+     *       through the link chain.
+     *       Link item is not returned here.
+     * 
+     * @param aTestType Test type of the linked item and link item.
+     * @param aKey Key of the item. This can also be a key to a link item.
+     * @return TAlfModuleTestItem< T >* Actual item. 
+     *                                  NULL if item was not found.
+     *                                  Ownership is not transferred.
+     */
+    TAlfModuleTestItem< T >* FindActual( const TAlfModuleTestType& aTestType, TInt aKey )
+        {
+        TAlfModuleTestItem< T >* item( Find( aTestType, aKey ) );
+        while ( item && item->LinkTargetKey() != KErrNotFound )
+            {
+            // Item is link.
+            // So, find the actual item through link targets.
+            item = Find( aTestType, item->LinkTargetKey() );
+            }
+        return item;
+        }
+    
+    
+    /**
+     * Function to append new item into the map.
+     * 
+     * @param aTestType Describes for what case the appended test item is created for.
+     * @param aKey Key of the map item.
+     * @param aDefaultValue Default value for the map item.
+     * @return TInt System wide error code.
+     */    
+    TInt Append( const TAlfModuleTestType& aTestType, TInt aKey, const T& aDefaultValue )
+        {
+        if ( !Accept( aTestType ) )
+            {
+            // Given test type has not been set as accepted.
+            return KErrNotSupported;
+            }
+        else if ( Find( aTestType, aKey ) )
+            {
+            // Item already exists in the map.
+            return KErrAlreadyExists;
+            }        
+        else if ( iArrayCount == KMaxArrayCount )
+            {
+            // Array already full.
+            return KErrOverflow;
+            }
+        
+        // Append new item into the array.
+        iArray[ iArrayCount ] = TAlfModuleTestItem< T >( aTestType, aKey, aDefaultValue );
+        ++iArrayCount;
+        return KErrNone;        
+        }
+
+    
+    /**
+     * Creates and appends link item that links to another item.
+     * 
+     * @param aTestType Test type of the linked item and link item.
+     * @param aLinkKey Link item key.
+     * @param aTargetKey Target item key.
+     * @return TInt System wide error code.
+     */
+    TInt AppendLink( const TAlfModuleTestType& aTestType, TInt aLinkKey, TInt aTargetKey )
+        {
+        if ( !Accept( aTestType ) )
+            {
+            // Given test type has not been set as accepted.
+            return KErrNotSupported;
+            }
+        else if ( Find( aTestType, aLinkKey ) )
+            {
+            // Link item already exists in the map.
+            return KErrAlreadyExists;
+            }
+        else if ( !FindActual( aTestType, aTargetKey ) )
+            {
+            // Link has to point to another existing item.
+            // Also, link has to point to the chain that ends to actual item.
+            // Then, links will not create forever loops. Loops could occur
+            // if links in chain point to each other creating loops.
+            return KErrNotFound;
+            }
+        else if ( iArrayCount == KMaxArrayCount )
+            {
+            // Array already full.
+            return KErrOverflow;
+            }
+        
+        // Create link item because original item exists and link chain is correct.
+        // Append new link item into the array and link it to another link or to
+        // actual item.
+        TAlfModuleTestItem< T >* target( Find( aTestType, aTargetKey ) );
+        // Set value of the link same as its target's value.
+        iArray[ iArrayCount ] = TAlfModuleTestItem< T >( aTestType, aLinkKey, target->Value() );
+        iArray[ iArrayCount ].SetLinkTargetKey( target->Key() );
+        ++iArrayCount;
+        return KErrNone;            
+        }
+
+    
+    /**
+     * Sets the value for the actual item.
+     * Item itself should already appended into map and exist
+     * in the array before setting its value here.
+     * 
+     * @note Some items may be links. But, only the value of the
+     *       actual item in the end of the link chain is set here.
+     * 
+     * @param aTestType Describes for what case the item is for.
+     * @param aKey Key of the map item.
+     * @param aValue Value for the map item.
+     * @return TInt System wide error code.
+     */
+    TInt SetActualValue( const TAlfModuleTestType& aTestType, TInt aKey, const T& aValue )
+        {
+        TAlfModuleTestItem< T >* item( FindActual( aTestType, aKey ) );
+        if ( !item )
+            {
+            // Actual item was not found from the array.        
+            return KErrNotFound;            
+            }
+        
+        // Actual item exists and it is not link item. So, set its values.
+        item->SetValue( aValue );        
+        return KErrNone;
+        }
+
+    
+    /**
+     * Find an actual item if it exists and gets its value if item is found
+     * and value has been set.
+     * 
+     * @param aTestType Describes for what case the item is for.
+     * @param aKey Key of the map item.
+     * @param aValue If map item is found, value of the item is set here.
+     * @param aAcceptDefault ETrue if an existing object having its default value
+     *                       is accepted. EFalse if value should have been updated
+     *                       separately.
+     * @return TBool ETrue if map item is found and value has been set. Else EFalse. 
+     */    
+    TBool GetActualValue( 
+        const TAlfModuleTestType& aTestType, TInt aKey, T& aValue, TBool aAcceptDefault )
+        {
+        const TAlfModuleTestItem< T >* item( FindActual( aTestType, aKey ) );
+        if ( item && ( aAcceptDefault || item->ValueSetCount() > 0 ) )
+            {
+            aValue = item->Value();
+            return ETrue;
+            }
+        return EFalse;
+        }
+
+
+    /**
+     * Finds an actual item if it exists and checks if it equals the given value.
+     * 
+     * @param aTestType Describes for what case the item is for.
+     * @param aKey Key of the map item.
+     * @param aValue Value of the map item.
+     * @return TBool ETrue if item is found and its value equals given value. Else EFalse. 
+     */
+    TBool ActualEquals( const TAlfModuleTestType& aTestType, TInt aKey, const T& aValue )
+        {
+        T value( aValue );
+        if ( GetActualValue( aTestType, aKey, value, ETrue ) && value == aValue )
+            {
+            return ETrue;
+            }
+        return EFalse;
+        }
+
+
+    /**
+     * @return TInt Number of map items
+     */
+    TInt ItemCount() const
+        {
+        return iArrayCount;
+        }
+
+
+    /**
+     * @return const TAlfModuleTestItem< T >& Reference to the map item
+     */
+    const TAlfModuleTestItem< T >& Item( TInt aIndex ) const
+        {
+        return iArray[ aIndex ];
+        }
+
+    
+    /**
+     * Appends an accepted test type into the accepted array.
+     * 
+     * @note Only items of accepted test type can be appended
+     *       into this map.
+     * 
+     * @param aTestType Test item type that is accepted for this map.
+     * @return TInt System wide error code.
+     */
+    TInt AppendAccept( const TAlfModuleTestType& aTestType )
+        {
+        if ( Accept( aTestType ) )
+            {
+            // Type already exists in the array.
+            return KErrAlreadyExists;
+            }
+        else if ( iAcceptArrayCount == KMaxAcceptArrayCount )
+            {
+            // Array already full.
+            return KErrOverflow;
+            }
+
+        iAcceptArray[ iAcceptArrayCount ] = aTestType;
+        ++iAcceptArrayCount;
+        return KErrNone;
+        }
+    
+    
+    /**
+     * @param aTestType Test item type to be checked.
+     * @return TBool ETrue if given test type is set as accepted for this map.
+     *               Else EFalse.
+     */
+    TBool Accept( const TAlfModuleTestType& aTestType ) const
+        {
+        for ( TInt i = 0; i < iAcceptArrayCount; ++i )
+            {
+            if ( aTestType == iAcceptArray[ i ] )
+                {
+                return ETrue;
+                }
+            }
+        return EFalse;
+        }
+
+
+    /**
+     * Resets all the array items that match the given test type
+     * to given default value.
+     * 
+     * @param aTestType The test type of items that should be resetted.
+     * @param aValue Reference to the value that items are resetted to.
+     */
+    void ResetItems( const TAlfModuleTestType& aTestType, const T& aDefaultValue )
+        {
+        for ( TInt i = 0; i < iArrayCount; ++i )
+            {
+            if ( iArray[ i ].TestTypeMatch( aTestType ) )
+                {
+                iArray[ i ].Reset( aDefaultValue );
+                }
+            }
+        }
+
+
+    /**
+     * Resets the map
+     */
+    void Reset()
+        {
+        // Just reset the counter.
+        // We do not bother to reset map items, because when counter is reseted
+        // already set items and their info is left out of the scope.
+        iArrayCount = 0;
+        iAcceptArrayCount = 0;
+        }
+
+    
+private: // data
+    
+    TAlfModuleTestItem< T > iArray[ KMaxArrayCount ];
+    TInt iArrayCount;
+    
+    TAlfModuleTestType iAcceptArray[ KMaxAcceptArrayCount ];
+    TInt iAcceptArrayCount;
+    
+    };
+
+#endif // ALFMODULETESTMAP_H
+
+#endif // USE_MODULE_TEST_HOOKS_FOR_ALF
+
+// End of File
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/uiacceltk/hitchcock/CommonInc/alfmoduletesttype.h	Mon May 03 13:22:43 2010 +0300
@@ -0,0 +1,97 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+/**
+ * @note Contents of this file are provided only if module test hooks are set on.
+ */
+
+#include "alfmoduletestconf.h"
+#ifdef USE_MODULE_TEST_HOOKS_FOR_ALF
+
+#ifndef ALFMODULETESTTYPE_H
+#define ALFMODULETESTTYPE_H
+
+/**
+ * TAlfModuleTestType specifies recognized test types.
+ */
+enum TAlfModuleTestType
+    {
+    // Do not use this value when creating item.
+    EAlfModuleTestTypeNone,
+    
+    // Render stage component specific tests
+    EAlfModuleTestTypeRenderStageCreateLayer,
+    EAlfModuleTestTypeRenderStageReleaseLayer,
+    EAlfModuleTestTypeRenderStageCreateWindow,
+    EAlfModuleTestTypeRenderStageReleaseWindow,    
+    EAlfModuleTestTypeRenderStageCreateWindowGroup,
+    EAlfModuleTestTypeRenderStageReleaseWindowGroup,
+    EAlfModuleTestTypeRenderStageActiveWindow,
+    EAlfModuleTestTypeRenderStageChangeWindowSize,
+    EAlfModuleTestTypeRenderStageChangeWindowPosition,
+    EAlfModuleTestTypeRenderStageChangeWindowVisibility,
+    EAlfModuleTestTypeRenderStageChangeTextCursorType,
+    EAlfModuleTestTypeRenderStageChangeTextCursorClipRect,
+    EAlfModuleTestTypeRenderStageChangeTextCursorFlag,
+    EAlfModuleTestTypeRenderStageChangeTextCursorColor,
+    
+    // Streamer hierarchy model component specific tests
+    EAlfModuleTestTypeHierarchyModelCreateLayer,
+    EAlfModuleTestTypeHierarchyModelReleaseLayer,
+    EAlfModuleTestTypeHierarchyModelCreateWindow,
+    EAlfModuleTestTypeHierarchyModelReleaseWindow,    
+    EAlfModuleTestTypeHierarchyModelCreateWindowGroup,
+    EAlfModuleTestTypeHierarchyModelReleaseWindowGroup,
+    EAlfModuleTestTypeHierarchyModelActiveWindow,
+    EAlfModuleTestTypeHierarchyModelChangeWindowSize,
+    EAlfModuleTestTypeHierarchyModelChangeWindowPosition,
+    EAlfModuleTestTypeHierarchyModelChangeWindowVisibility,
+    EAlfModuleTestTypeHierarchyModelChangeTextCursorType,
+    EAlfModuleTestTypeHierarchyModelChangeTextCursorClipRect,
+    EAlfModuleTestTypeHierarchyModelChangeTextCursorFlag,
+    EAlfModuleTestTypeHierarchyModelChangeTextCursorColor,
+    
+    // Server bridge component specific tests
+    EAlfModuleTestTypeBridgeCreateLayer,
+    EAlfModuleTestTypeBridgeReleaseLayer,
+    EAlfModuleTestTypeBridgeCreateWindow,
+    EAlfModuleTestTypeBridgeReleaseWindow,    
+    EAlfModuleTestTypeBridgeCreateWindowGroup,
+    EAlfModuleTestTypeBridgeReleaseWindowGroup,
+    EAlfModuleTestTypeBridgeActiveWindow,
+    EAlfModuleTestTypeBridgeChangeWindowSize,
+    EAlfModuleTestTypeBridgeChangeWindowPosition,
+    EAlfModuleTestTypeBridgeChangeWindowVisibility,
+    EAlfModuleTestTypeBridgeChangeTextCursorType,
+    EAlfModuleTestTypeBridgeChangeTextCursorClipRect,
+    EAlfModuleTestTypeBridgeChangeTextCursorFlag,
+    EAlfModuleTestTypeBridgeChangeTextCursorColor,
+    EAlfModuleTestTypeBridgeVisualVisibility,
+    
+    // Core toolkit component specific tests
+    EAlfModuleTestTypeCoreToolkitDrawWindow,
+    EAlfModuleTestTypeCoreToolkitDrawFromRenderBuffer,
+    
+    // Do not use this value when creating item.
+    // This is just meant for Find operations when all tests are accepted.
+    EAlfModuleTestTypeAll
+    };
+
+#endif // ALFMODULETESTTYPE_H
+
+#endif // USE_MODULE_TEST_HOOKS_FOR_ALF
+
+// End of File
--- a/uiacceltk/hitchcock/ServerCore/Inc/alfbridge.h	Fri Apr 16 15:56:24 2010 +0300
+++ b/uiacceltk/hitchcock/ServerCore/Inc/alfbridge.h	Mon May 03 13:22:43 2010 +0300
@@ -134,7 +134,7 @@
             CAlfScreen* aScreen,
             TBool& aSubtreeVisible,
             TBool& aHasVisualsWithLayers,
-            TBool aChildCanBeOpaque );
+            TBool aChildCanBeOpaque, TBool aOnlyForEmbeddedAlfApp = EFalse );
 
     /**
      * Updates layer visibilities.
@@ -211,6 +211,7 @@
     
     void EnableSwRenderingL(TBool aEnable = ETrue);
     TBool PrepareSwRenderingTarget( CAlfScreen* aScreen );
+    void InitializeSwRenderingTarget(CFbsBitmap* aBitmap);
 
     /**
      * Sets memory level.
@@ -261,21 +262,34 @@
       * Sets HuiControlGroup as Alf application window group
       */
     void SetWindowGroupAsAlfApp(TInt aId);
+
+    /**
+      * removes Alf application window group tag
+      */
+    void RemoveWindowGroupAsAlfApp(TInt aId);
     
     // From MHuiSynchronizationObserver
     void Synchronized(TInt aId);
     
     /*
-     * HandleGfxEndFullScreenTimeout
+     * GfxTriggerEndFullScreen
      * 
      * GfxTransEffect API gives EndFullScreen events too late. Thus there is a two stage process for triggering 
      * the EndFullScreen effect after BeginFullScreen event arrived.
      * 
-     * For application start effects we give N milliseconds timeout for application to finish drawing after
-     * the first drawing has arrived. If after N milliseconds application has not drawn 75% of the screen, it
-     * gets another N milliseconds. Most cases, the first N milliseconds is enough.
      */
-    void HandleGfxEndFullScreenTimeout(CFullScreenEffectState* aFullScreenEffectData);
+    void GfxTriggerEndFullScreen(CFullScreenEffectState* aFullScreenEffectData);
+    
+   /*
+	*	GfxTriggerEffectWhenFullScreenDrawn
+	*
+	*	Goes through the given CHuiControl (group which is supposed to show the effect). 
+	*   Triggers the effect, if  drawing buffers in group cover the whole screen in the 
+	*   current orientation.
+	*
+	*	@param	aToGroup	Group to be analyzed
+	*/
+    TBool GfxTriggerEffectWhenFullScreenDrawn(CHuiControlGroup* aToGroup = NULL);
     
 	// Experimental
     TBool IsFullScreenDrawn( TInt aOrientation);
@@ -283,6 +297,8 @@
     void LayoutSwitchStart();
     void LayoutSwitchComplete();
     
+    RAlfBridgerClient* BridgerClient();
+    
 private:    
     
     
@@ -333,7 +349,17 @@
     
     // component effect handling
     void HandleGfxControlEffectsL( TAlfBridgerData data );
-    
+
+   /**
+	*	StoreLayoutIfRequiredByEffectL
+	*
+	*   @param aNeededStoredLayout	Returns ETrue, if storing is required. Otherwise EFalse.
+    *
+	*	@return ETrue	If storing was required and could be done.
+    *					OR storing was not required. 
+	*/    
+    TBool StoreLayoutIfRequiredByEffectL(CHuiLayout* aLayout, CFullScreenEffectState& aEvent, TBool& aNeededStoredLayout);
+
     /**
      * Handles begin and end fullscreen events
      */
@@ -762,6 +788,13 @@
     TBool HasActivePaintedAreas( CHuiCanvasVisual& aVisual, TBool aIncludeChildren );
     TBool HasActiveFadedChildren( CHuiCanvasVisual& aVisual );
 
+    /*
+     * This is for updating all the layout that are created to correspond the window server window groups.
+     * This should be called immediately when layout switch happens. Layout extents must be update then otherwise
+     * visibility calculations will clip to old sizes.
+     */
+    void UpdateRootVisualsToFullscreen();
+    
 private:
 
     RPointerArray<CAlfScreen> iAlfScreens;
@@ -954,6 +987,7 @@
     mutable RRegionBuf<KAlfBridgeRegionGranularity> iTempRegion;
     TBool iBgSurfaceFound;
     TBool iInLowMemMode;
+    TBool iLayoutSwitchInProgress;
 
     TBool iHomeScreenWallpaperWindowFound;
     TBool iBgAnimHidden;
@@ -969,6 +1003,8 @@
     TInt iIdForEAlfDSSynchronizeOp;
     TInt iIdForLayoutSwitchFrameSync;
     
+    RArray<TInt> iAlfNativeClientsWgIds;
+    
     #ifdef ALF_DEBUG_PRINT_WINDOWGROUP_ORDER
     TInt activevisualcount;
     TInt passivevisualcount;
--- a/uiacceltk/hitchcock/ServerCore/Inc/alfeffectutils.h	Fri Apr 16 15:56:24 2010 +0300
+++ b/uiacceltk/hitchcock/ServerCore/Inc/alfeffectutils.h	Mon May 03 13:22:43 2010 +0300
@@ -219,10 +219,6 @@
         
         void ConstructL(TInt aAction, RMemReadStream& aStream);
         
-        TBool InitDelayedEffectL(CAlfBridge* aBridge, TSize aDisplaySize);
-        
-        void NotifyDrawingTimeout();
-
         // Information from BeginFullScreen
         TInt iType;
         TInt iToWg;
--- a/uiacceltk/hitchcock/ServerCore/Inc/alfhierarchymodel.h	Fri Apr 16 15:56:24 2010 +0300
+++ b/uiacceltk/hitchcock/ServerCore/Inc/alfhierarchymodel.h	Mon May 03 13:22:43 2010 +0300
@@ -197,6 +197,11 @@
     
 	   CAlfNodeRoot* iRootNode;
     
+    #ifdef __WINS__
+	TInt iDebug_CheckNodeTableItegrityCounter;
+	void Debug_CheckNodeTableItegrity(const TDesC16& aContext);
+    #endif
+	
 private: // variables
 
     RChunk iChunk;
--- a/uiacceltk/hitchcock/ServerCore/Inc/alfnodes.h	Fri Apr 16 15:56:24 2010 +0300
+++ b/uiacceltk/hitchcock/ServerCore/Inc/alfnodes.h	Mon May 03 13:22:43 2010 +0300
@@ -224,6 +224,12 @@
         return iTrackNode;
         }
     
+    #ifdef __WINS__
+    void Debug_CheckSiblingOrder(const TDesC16& aContext);
+    #endif
+    
+public: // Data    
+    
     CAlfNode* iParent;
     
     CAlfNode* iChild;
--- a/uiacceltk/hitchcock/ServerCore/Inc/alfstreamerbridge.h	Fri Apr 16 15:56:24 2010 +0300
+++ b/uiacceltk/hitchcock/ServerCore/Inc/alfstreamerbridge.h	Mon May 03 13:22:43 2010 +0300
@@ -192,7 +192,7 @@
     };
 
 
-NONSHARABLE_CLASS(CAlfStreamerBridge): public CActive, public CHuiEnv::MHuiSwapObserver
+NONSHARABLE_CLASS(CAlfStreamerBridge): public CActive
 
     {
     public:
@@ -282,74 +282,44 @@
      * @return Pointer to the data struct 
      */
     const TAny* GetVarDataL( TInt aIndex );
-
     
-	/**
-     * SetStreamerServer()
-     *
-     * Sets Streamserver instance. 
-     */
-    void SetStreamerServer( CAlfStreamerServer& aStreamerServer );
-    /**
-     * StreamerServer()
-     *
-     * Gets Streamserver instance set with set functionality.
-	 * @see SetStreamerServer()
-     */
-    CAlfStreamerServer* StreamerServer();
-
+    /* deprecated */
     IMPORT_C TUid FindAppUidForWgId(TInt aWgId);
     IMPORT_C TInt FindWgForAppUid(TUid aAppUid);
 
+    void SetObserver(MAlfStreamerListener* aObserver)
+        {
+        iObserver = aObserver;
+        }        
+
 public: // from CActive
         
     void RunL();
-    
     void DoCancel();
     
-public: // from SwapObserver
-    void PrepareSwap();
-    void SwapComplete();
-    void ReleaseWindowServer(TBool aRelease = ETrue);
-    void SetWgIdArray(TInt* aArray); 
-    
 private:
-        
+
+    CAlfStreamerServer* iStreamerServer;        
     MAlfStreamerListener* iObserver;
-   
     MAlfBatchObs* iBatchObserver;
-    
     TThreadId iThread;
     
     RArray<TAlfBridgerData> iMessages;
-    
     RArray<TInt> iQueue;
     
     RCriticalSection iQueueSema;
     
     RBuf8 iDataBuf;
-   
-    TInt iItemsInBuffer;
+    volatile TInt iItemsInBuffer;
+    volatile TBool iVarDataAddedButNotPosted;
 
-    RArray<TAlfBridgerData> iFxMessages;
-    RArray<TInt> iFxQueue;
-    RBuf8 iFxBuf;
-    TInt iFxItemsInBuffer;
-    
-    CAlfStreamerServer* iStreamerServer;
 #ifdef ALF_DEBUG_TRACK_DRAWING    
     CAlfCommandDebug* iCommandDebugger;
 #endif
-    
-    volatile TBool iSwapActive;
-    volatile TBool iMakeCurrentActive;
 
-    TBool iFxQueueActive;
-    TInt* iWgArray;
-    TBool iVarDataAddedButNotPosted;
 public:
-    TAlfNativeWindowData iAlfWindowData;
-
+    volatile TAlfNativeWindowData iAlfWindowData;
+    volatile TInt iActiveEffectCount;
     };
 
 
--- a/uiacceltk/hitchcock/ServerCore/Inc/alfstreamerconsts.h	Fri Apr 16 15:56:24 2010 +0300
+++ b/uiacceltk/hitchcock/ServerCore/Inc/alfstreamerconsts.h	Mon May 03 13:22:43 2010 +0300
@@ -42,7 +42,11 @@
     EAlfPostDataToCompositionClient,
     EAlfPostDataToCompositionTarget,
     EAlfGetListOfWGsHavingInactiveSurfaces, 
-    EAlfQueueRequestBGSessions
+    EAlfQueueRequestBGSessions,
+    EAlfGetNumberOfActiveEffects,
+    EAlfRequestSignal,
+    EAlfCompleteSignal
+
     };
 
 enum TAlfCompOps{
@@ -83,5 +87,13 @@
     TInt  iAlfWindowGrpId;
     TUint iAlfWindowHandle;
     };
+
+/* bitfield*/
+enum TAlfSignalFlags
+    {
+    EAlfSignalEffectStarted = 0x1,
+    EAlfSignalEffectComplete = 0x2,    
+    
+    };
     
 #endif
--- a/uiacceltk/hitchcock/ServerCore/Inc/alfstreamerserver.h	Fri Apr 16 15:56:24 2010 +0300
+++ b/uiacceltk/hitchcock/ServerCore/Inc/alfstreamerserver.h	Mon May 03 13:22:43 2010 +0300
@@ -73,7 +73,9 @@
     void AddTargetFromInactiveSurfaces(TInt aTarget);
     void GetListOfWGsHavingInactiveSurfacesL(const RMessage2& aMessage, TBool aActiveAlso = ETrue);
     void QueueRequestBGAnimSessionsL(const TPtrC8& aPtr, TInt aOp);
-    
+
+    void AddSignal(CAlfStreamerServerSession* aSession, const RMessage2& aMessage);
+    void CompleteSignal(TInt aSignal, TInt aType);
     
 private:
     void ConstructL();
@@ -88,7 +90,6 @@
     TInt SearchCommonEntryForToken(const RMessage2& aMessage);
     CAlfStreamerServerSession* SearchSessionForToken(TInt aToken);
     
-    
 private:
     CAlfStreamerBridge* iBridge; // not owned
     mutable TUint iSessions;
@@ -130,6 +131,16 @@
 
     CAsyncCallBack * iRendezvous;
 
+    struct TAlfSignal
+        {
+        CAlfStreamerServerSession* iSession;
+        RMessagePtr2 iMessage;
+        TInt iHandle;
+        TInt iFlags;
+        };
+    
+    RArray<TAlfSignal> iSignals;
+
 public:    
     struct TAlfCompParams
         {
--- a/uiacceltk/hitchcock/ServerCore/Src/alfappserver.cpp	Fri Apr 16 15:56:24 2010 +0300
+++ b/uiacceltk/hitchcock/ServerCore/Src/alfappserver.cpp	Mon May 03 13:22:43 2010 +0300
@@ -1464,4 +1464,8 @@
     return result;
     }
 
+TInt CAlfAppServer::GetLastActiveClient()
+    {
+    return iLastActiveClientWg;
+    }
 
--- a/uiacceltk/hitchcock/ServerCore/Src/alfappservercore.mmp	Fri Apr 16 15:56:24 2010 +0300
+++ b/uiacceltk/hitchcock/ServerCore/Src/alfappservercore.mmp	Mon May 03 13:22:43 2010 +0300
@@ -24,6 +24,7 @@
 
 
 MACRO ALF_USE_CANVAS
+MACRO ALF_DRAW_FRAME_BEFORE_END_CALLBACK
 #define ALF_USE_CANVAS
 
 // Enable this to add GetWinIdListL method to CAlfWindowManager API.
--- a/uiacceltk/hitchcock/ServerCore/Src/alfappsrvsession.cpp	Fri Apr 16 15:56:24 2010 +0300
+++ b/uiacceltk/hitchcock/ServerCore/Src/alfappsrvsession.cpp	Mon May 03 13:22:43 2010 +0300
@@ -303,7 +303,7 @@
         }
     else
         {
-        ShowControlGroupsInOrderL(*display);
+//        ShowControlGroupsInOrderL(*display);
         }    
 
 	// This is needed for Huitk BitBlit() to succeed 
@@ -437,9 +437,9 @@
         }
     }
     
-void CAlfAppSrvSession::ShowControlGroupsInOrderL(CHuiDisplay& aDisplay)
+void CAlfAppSrvSession::ShowControlGroupsInOrderL(CHuiDisplay& /*aDisplay*/)
     {
-#ifdef SYMBIAN_BUILD_GCE
+/*#ifdef SYMBIAN_BUILD_GCE
     iControlGroupOrder.Reset();
     // gather all the control groups that belong to this session
     for ( TInt g = 0 ; g < aDisplay.Roster().Count() ; g++ )
@@ -474,7 +474,7 @@
             iControlGroupOrder.Remove(iControlGroupOrder.Count()-1);
             }
         }
-    iControlGroupOrder.Reset();
+    iControlGroupOrder.Reset();*/
     }
     
 void CAlfAppSrvSession::ReOrderControlGroupSessionsL( RPointerArray<CAlfSrvSubSessionBase>& aGroupSessions )
@@ -1238,7 +1238,8 @@
   
     
 #ifdef SYMBIAN_BUILD_GCE
-    CHuiLayout* hostContainer = controlGroup.Control(0).ContainerLayout( NULL );                
+    CHuiLayout* hostContainer = controlGroup.Control(0).ContainerLayout( NULL );      
+    controlGroup.SetAcceptInput(EFalse);
     if(hostContainer)
         hostContainer->SetFlags(EHuiVisualFlagUnderOpaqueHint);
 #else    
--- a/uiacceltk/hitchcock/ServerCore/Src/alfappui.cpp	Fri Apr 16 15:56:24 2010 +0300
+++ b/uiacceltk/hitchcock/ServerCore/Src/alfappui.cpp	Mon May 03 13:22:43 2010 +0300
@@ -53,12 +53,12 @@
 #include "alfshareddisplaycoecontrol.h"
 #include "alfuids.h"
 
-#ifdef SYMBIAN_BUILD_GCE
 #include "alfbridge.h"
 #include "alfstreamerserver.h"
 #include "alfdecoderserverclient.h"
 #include "alfstreamerconsts.h"
-#endif // #ifdef SYMBIAN_BUILD_GCE
+#include "HuiFxEngine.h"
+#include "alfstreamerconsts.h"
 
 // DISABLE this if you want to use the AHDemoApp layout switch. If this is enabled
 // and switch is done through AHDemoApp, the layout will be rotated too much.
@@ -67,6 +67,31 @@
 #define ALF_USE_EMULATOR_LAYOUT_SWITCH_BUTTON
 #endif
 
+NONSHARABLE_CLASS(TAlfEffectObserver): public MHuiEffectObserver
+    {
+    public:    
+    TAlfEffectObserver(volatile TInt* aEffectCount, CAlfBridge& aBridge):iEffectCount((TInt*)aEffectCount), iBridge(aBridge){}
+    void EffectAdded(CHuiFxEffect* aEffect)
+        {
+        if (iBridge.BridgerClient() && aEffect && aEffect->Handle())
+            {    
+            __ALFFXLOGSTRING1("Effect about to start 0x%x", aEffect->Handle());
+            iBridge.BridgerClient()->SendBlind(EAlfCompleteSignal, TIpcArgs(aEffect->Handle(), EAlfSignalEffectStarted));
+            }
+        (*iEffectCount)++;
+        }   
+    void EffectComplete(CHuiFxEffect* aEffect)
+        {
+        if (iBridge.BridgerClient() && aEffect && aEffect->Handle())
+            {    
+            __ALFFXLOGSTRING1("Effect complete 0x%x", aEffect->Handle());
+            iBridge.BridgerClient()->SendBlind(EAlfCompleteSignal, TIpcArgs(aEffect->Handle(), EAlfSignalEffectComplete));
+            }
+        (*iEffectCount)--;    
+        }
+    TInt* iEffectCount;
+    CAlfBridge& iBridge;
+    };
 
 _LIT(KAlfEventThreadName,"alfevents");
 NONSHARABLE_CLASS(CAlfEventCatcher): public CActive
@@ -407,11 +432,7 @@
         {
         iWsSession.ComputeMode(RWsSession::EPriorityControlDisabled);
         RThread thread; 
-#if defined(__EPOC32__)
-    thread.SetProcessPriority(EPriorityForeground);    
-#else
-    thread.SetPriority(EPriorityAbsoluteForegroundNormal);    
-#endif
+        thread.SetPriority(EPriorityAbsoluteForegroundNormal);    
         iScreenDevice =new(ELeave) CWsScreenDevice(iWsSession);
         iScreenDevice->Construct(0); // For main display only
 
@@ -627,20 +648,22 @@
             iEventAo->Cancel();
             }
         delete iEventAo; // before session is being terminated       
+        if (iHuiEnv && iHuiEnv->EffectsEngine())
+            {
+            iHuiEnv->EffectsEngine()->SetObserver(0);    
+            delete iAlfEffectObserver; // cannot exist if huienv was not present
+            }    
         delete iHuiEnv;
         delete iSharedWindow;
-#ifdef SYMBIAN_BUILD_GCE
         delete iBridgeObj;
-#endif // #ifdef SYMBIAN_BUILD_GCE
         }
     TBool iAllClientsClosed;
 
     // Boolean flag indicating if non-fading of shared window is enabled or disabled.
     TBool iSharedWindowNonFading;
-#ifdef SYMBIAN_BUILD_GCE
     CAlfBridge* iBridgeObj;
     CAlfStreamerBridge* iBridge;
-#endif // #ifdef SYMBIAN_BUILD_GCE
+    TAlfEffectObserver* iAlfEffectObserver;
     RWindow* iPlainWindow;
     CHuiDisplay* iMainDisplay;
     CHuiDisplay* iTVDisplay;
@@ -756,10 +779,6 @@
     {
 // In NGA master scene graph role, 
 // we must not close the server even there were no hitchcock app clients present
-#ifndef SYMBIAN_BUILD_GCE
-    iData->iAllClientsClosed = ETrue;
-    CAknEnv::Static()->RunAppShutter();
-#endif // #ifdef SYMBIAN_BUILD_GCE
     }
 
 // ---------------------------------------------------------------------------
@@ -838,11 +857,7 @@
     CHuiStatic::WsSession().ComputeMode(RWsSession::EPriorityControlDisabled);
 
     RThread thread; 
-#if defined(__EPOC32__)
-    thread.SetProcessPriority(EPriorityForeground);    
-#else
-    thread.SetPriority(EPriorityAbsoluteForegroundNormal);    
-#endif
+    thread.SetPriority(EPriorityAbsoluteForeground);    
 
     // delegates..
     iData->iResourceManager = CAlfSrvResourceManager::NewL( *iData->iHuiEnv );
@@ -868,11 +883,19 @@
         iData->iPlainWindow->SetBackgroundColor(~0);          
         }
 
-#ifdef SYMBIAN_BUILD_GCE    
+    iData->iBridge = CAlfStreamerBridge::NewL(0);
+    iData->iBridge->iAlfWindowData.iAlfWindowGrpId = mainWg.Identifier();
+    iData->iBridge->iAlfWindowData.iAlfWindowHandle =  iData->iPlainWindow->ClientHandle();
+    iData->iBridge->iAlfWindowData.iScreenNumber = 0; // TBD multiple screen support
 
     iData->iBridgeObj = CAlfBridge::NewL( &iData->iBridge, iData->iHuiEnv );
 	iData->iBridgeObj->iAppUi = this;
-		
+	
+	iData->iBridge->SetObserver(iData->iBridgeObj);
+	
+	iData->iAlfEffectObserver = new (ELeave) TAlfEffectObserver(&iData->iBridge->iActiveEffectCount, *iData->iBridgeObj);
+	iData->iHuiEnv->EffectsEngine()->SetObserver(iData->iAlfEffectObserver);
+			
     if( !iData->iPlainWindow)
         {
         // Create default CAlfScreen already now to be able to show controlgroups early enough... 
@@ -898,16 +921,10 @@
         }
 
     AppendDisplayOnSharedWindowL(*(iData->iBridgeObj->Display(0)));
-
-    iData->iBridge = CAlfStreamerBridge::NewL(iData->iBridgeObj);
-    iData->iBridge->iAlfWindowData.iAlfWindowGrpId = mainWg.Identifier();
-    iData->iBridge->iAlfWindowData.iAlfWindowHandle =  iData->iPlainWindow->ClientHandle();
-    iData->iBridge->iAlfWindowData.iScreenNumber = 0; // TBD multiple screen support
-        
+    
     TThreadId threadId;
   	CAlfStreamerServer::LaunchServer(threadId, iData->iBridge);
     
-#endif // #ifdef SYMBIAN_BUILD_GCE    
     // Inform texture manager that env has been created.
     iData->iServer->TextureManager().HandleEnvCreateL( *iData->iHuiEnv );
     
@@ -1335,9 +1352,7 @@
 //
 TInt CAlfAppUi::FirstAlfControlGroupIndex( TInt aScreenNumber )
     {
-#ifdef SYMBIAN_BUILD_GCE
     return iData->iBridgeObj->FirstAlfControlGroupIndex( aScreenNumber );
-#endif // #ifdef SYMBIAN_BUILD_GCE
     }
 
 // ---------------------------------------------------------------------------
@@ -1346,9 +1361,7 @@
 //
 TInt CAlfAppUi::LastAlfControlGroupIndex( TInt aScreenNumber )
     {
-#ifdef SYMBIAN_BUILD_GCE
     return iData->iBridgeObj->LastAlfControlGroupIndex( aScreenNumber );
-#endif // #ifdef SYMBIAN_BUILD_GCE
     }
 
 
@@ -1358,10 +1371,8 @@
 //
 void CAlfAppUi::ShowControlGroupL(CHuiRoster& aRoster, CHuiControlGroup& aGroup, TInt aWhere, TInt aScreenNumber )
     {
-#ifdef SYMBIAN_BUILD_GCE
     iData->iBridgeObj->ShowControlGroupL(aRoster, aGroup, aWhere, aScreenNumber);    
     iData->iBridgeObj->HandleVisualVisibility( aScreenNumber );    
-#endif // #ifdef SYMBIAN_BUILD_GCE
 
     }
 
@@ -1458,9 +1469,14 @@
     return iData->iBridgeObj->ReadPixels(aBitmap);
     }
     
-void CAlfAppUi::SetAlfAppWindowGroup( TInt aID )
+void CAlfAppUi::SetAlfAppWindowGroup( TInt aId )
     {
-    iData->iBridgeObj->SetWindowGroupAsAlfApp( aID );
+    iData->iBridgeObj->SetWindowGroupAsAlfApp( aId );
+    }
+
+void CAlfAppUi::RemoveAlfAppWindowGroup( TInt aId )
+    {
+    iData->iBridgeObj->RemoveWindowGroupAsAlfApp( aId );
     }
 
 CAlfAppSrvSessionBase* CAlfAppUi::SrvSessionForControlGroup(CHuiControlGroup& aGroup)
@@ -1468,6 +1484,12 @@
     return iData->iServer->SrvSessionForControlGroup(aGroup);
     }
 
+
+TInt CAlfAppUi::GetLastActiveClient()
+    {
+    return iData->iServer->GetLastActiveClient();
+    }
+	
 void CAlfAppUi::DoBlankScreen(const RMessage2& aMessage)
     {
     __ALFLOGSTRING("CAlfAppUi::DoBlankScreen >>");
--- a/uiacceltk/hitchcock/ServerCore/Src/alfbridge.cpp	Fri Apr 16 15:56:24 2010 +0300
+++ b/uiacceltk/hitchcock/ServerCore/Src/alfbridge.cpp	Mon May 03 13:22:43 2010 +0300
@@ -70,6 +70,7 @@
 #include "huicanvasrenderbuffer.h"
 #include "alfeffectutils.h"
 #include "alfrenderstageutils.h" // for KAlfPSUidSynchronizer & KAlfPSKeySynchronizer
+#include "alfdrawerinternal.h"
 
 #ifdef HUI_DEBUG_TRACK_DRAWING
 #include <alfcommanddebug.h>
@@ -100,7 +101,15 @@
 
 const TInt KFadeAction = 6000;
 
-// ======== MEMBER FUNCTIONS ========
+NONSHARABLE_CLASS( TAlfBridgeDrawerWrapper ) : public MAlfDrawerScreenInterface
+    {
+public:
+    TAlfBridgeDrawerWrapper(CAlfBridge& aBridge);
+    TInt GetSizeAndRotation(TSize& aSize, TInt& aRotation);
+    TInt ReadPixels(CFbsBitmap* aBitmap);
+private:
+    CAlfBridge& iBridge;
+    };
 
 // ======== MEMBER FUNCTIONS ========
 
@@ -141,6 +150,7 @@
 // 
 CAlfBridge::~CAlfBridge()
 	{
+    iAlfNativeClientsWgIds.Close();
 	delete iOrphanStorage;
 	delete iFadeEffectFile;
 	iWindowHashArray.Close();
@@ -343,6 +353,8 @@
     iPreviouslySearchedVisual = aVisual;
 
     AMT_INC_COUNTER( iTotalVisualCount );
+    
+    AMT_MAP_BRIDGE_ADD_VISUAL();
     }
 
 // ---------------------------------------------------------------------------
@@ -355,7 +367,10 @@
     iWindowHashArray.Remove( aWindowNodeId );
     iPreviouslySearchedVisualId = 0;
     
-    AMT_DEC_COUNTER( iTotalVisualCount );    
+    AMT_DEC_COUNTER( iTotalVisualCount );
+    
+    AMT_MAP_INC_VALUE( iIntMap, aWindowNodeId, EAlfModuleTestTypeBridgeReleaseWindow );
+    AMT_MAP_SET_VALUE( iBoolMap, aWindowNodeId, ETrue, EAlfModuleTestTypeBridgeReleaseWindow );
     }
     
 // ---------------------------------------------------------------------------
@@ -598,7 +613,7 @@
                         {
                         iFullScreenEffectData->iFromSecureId = iAlfScreens[0]->iControlGroups[j].iSecureId;
                         iFullScreenEffectData->iFromWg = iAlfScreens[0]->iControlGroups[j].iClientWindowGroupId;
-                        __ALFFXLOGSTRING2("CAlfBridge::ResolveAfterEffectAppearingApplicationL - Found underneath application uid: 0x%x, window group: %d -  Start track drawing for exit effect.", iFullScreenEffectData->iFromAppId, iFullScreenEffectData->iFromWg );
+                        __ALFFXLOGSTRING2("CAlfBridge::ResolveAfterEffectAppearingApplicationL - Found underneath application uid: 0x%x, window group: %d -  Start track drawing for exit effect.", iFullScreenEffectData->iFromSecureId, iFullScreenEffectData->iFromWg );
                         break;
                         }
                     }
@@ -619,6 +634,8 @@
             {
             if (iAlfScreens[aScreenNumber]->iDisplay)
                 {
+                RemoveWindowGroupAsAlfApp(iAlfScreens[aScreenNumber]->iControlGroups[i].iClientWindowGroupId);
+
                 CHuiControlGroup* controlGroup = iAlfScreens[aScreenNumber]->iControlGroups[i].iControlGroup;
                 CHuiControl& control = controlGroup->Control(0);
                 CHuiLayout* layout = (CHuiLayout*)&control.Visual(0);
@@ -701,7 +718,10 @@
             
             break;
             }
-        }        
+        }
+    
+    AMT_MAP_INC_VALUE( iIntMap, aWindowGroupNodeId,
+                       EAlfModuleTestTypeBridgeReleaseWindowGroup );
     }
 
 
@@ -736,6 +756,15 @@
         // So that's why opaque flag is set to this layout.
         layout->SetFlag(EHuiVisualFlagOpaqueHint); 
         
+        for( TInt i = 0 ; i < iAlfNativeClientsWgIds.Count() ; i++ )
+            {
+            if(iAlfNativeClientsWgIds[i] == aClientWindowGroupId)
+                {
+                group->iAlfApp = ETrue;
+                break;
+                }
+            }
+       
         TAlfControlGroupEntry entry;
         entry.iControlGroup = group;
         entry.iWindowGroupNodeId = aWindowGroupNodeId;
@@ -780,7 +809,8 @@
         
         AMT_INC_COUNTER( iTotalControlGroupCount );
         }
-    
+
+    AMT_MAP_BRIDGE_CREATE_CONTROL_GROUP();
 
     return *group;       
     }
@@ -892,6 +922,14 @@
         TBool move = EFalse; // indicates that controlgroup is already in the roster somewhere below the new index.
         for (TInt i=FirstAlfControlGroupIndex(aScreenNumber); i<last; i++)
             {
+            CHuiLayout* hostContainer = aRoster.ControlGroup(i).Control(0).ContainerLayout(NULL);
+            if(hostContainer->Flags() & EHuiVisualFlagUnderOpaqueHint)
+                {
+                // If the visual is inactive, we should skip it so that alf control
+                // group ordering would be correct
+                continue;
+                }
+        
             if (index == aWhere)
                 {
                 if( move )
@@ -953,7 +991,24 @@
                 TBool lSyncAlfAppAndAlfEventGroup = EFalse;
                 if ( i>0 &&  aRoster.ControlGroup(i).iAlfApp && aRoster.ControlGroup(i-1).ResourceId() == iAlfWindowGroupNodeId  && &aRoster.ControlGroup(i) != &aGroup)
                     {
-                    lSyncAlfAppAndAlfEventGroup = ETrue;
+                    // we still need to check that there are no other alf client window groups on top.
+					// if one native alf application is embedding another native alf application, WServ
+					// seems to update wg chains so that the following check must be done  
+                    TInt u = i+1;
+                    TBool clienWgFoundOntop =EFalse;
+                    for(;u < aRoster.Count() - screen->FixedControlGroupCount(); u++)
+                        {
+                        if(aRoster.ControlGroup(u).iAlfApp)
+                            {
+                            clienWgFoundOntop = ETrue;
+                            break;
+                            }
+                        }
+                    
+                    if(!clienWgFoundOntop)
+                        {
+                        lSyncAlfAppAndAlfEventGroup = ETrue;
+                        }
                     }
                 aRoster.ShowL(aGroup, i);
                 added = ETrue;
@@ -1319,11 +1374,9 @@
     TBool fullscreenCovered = EFalse;
     CAlfAppSrvSessionBase* topMostAlfSrvSession = NULL;
     
-    //iActiveVisualCount = 0;
     iBgSurfaceFound = EFalse;
     iHomeScreenWallpaperWindowFound = EFalse;
-    //iPaintedArea = 0;  
-    
+   
     // Check if effect group has an effect with opaque hint.
     CHuiControlGroup& fxcontrolgroup = *(iAlfScreens[aScreenNumber]->iFullscreenEffectControlGroup);
     CHuiControl& fxcontrol = fxcontrolgroup.Control(0);
@@ -1341,7 +1394,8 @@
     
 	
 	TBool alfWindowGroupFoundVisible = EFalse;
-
+	TBool alfClientWindowGroupVisible = EFalse;
+	
     AMT_SET_VALUE( iVisibleVisualCount, 0 );
 	
     // skip the topmost (effect) layer, start from floating sprite group
@@ -1386,22 +1440,29 @@
             {
             CHuiLayout* hostContainer = control.ContainerLayout( NULL );
             TInt flags = hostContainer->Flags();            
-            if (!fullscreenCovered)
+            if (!fullscreenCovered || alfClientWindowGroupVisible)
                 {
                 // clear inactive flag if client has not made this controlgroup hidden
                 if(!(flags&EHuiVisualFlagUnderOpaqueHint))
                     {
-                    alfWindowGroupFoundVisible = ETrue;
                     if(iAppUi)
                         {
                         topMostAlfSrvSession = iAppUi->SrvSessionForControlGroup(controlgroup);
                         }
-                    hostContainer->ClearFlags(EHuiVisualFlagInactive);
-
-                    // just add the rect to covered region because alf draws solid background
-                    iTempRegion.AddRect(fullscreen);
-                    iTempRegion.Tidy();
-                    fullscreenCovered = ETrue;
+                    TInt clientWindowGroupId = topMostAlfSrvSession->ClientWindowGroup();
+                    __ALFLOGSTRING1("Alf Application: clientWindowGroupId %d", clientWindowGroupId);
+                    // checking the case if there are multiple alf application openend.
+                    if (clientWindowGroupId == iAppUi->GetLastActiveClient())
+                        {
+                        alfWindowGroupFoundVisible = ETrue;
+                        hostContainer->ClearFlags(EHuiVisualFlagInactive);
+
+                        // just add the rect to covered region because alf draws solid background
+                        iTempRegion.AddRect(fullscreen);
+                        iTempRegion.Tidy();
+                        fullscreenCovered = ETrue;
+                        alfClientWindowGroupVisible = EFalse;  // change flag so that we don't go in this branch again
+                        }
                     }
                 else // else put as inactive
                     {
@@ -1446,14 +1507,49 @@
 #endif
             }
         
+		// if native alf app is found visible we can assume it should cover whole screen with alfcontent
+		// this is for embedded native alf application cases. Otherwise chained window groups tend to
+		// flicker from time to time
+        if(!fullscreenCovered && controlgroup.iAlfApp)
+            {
+            alfClientWindowGroupVisible = ETrue;
+            }
+        
+        
         TBool subTreeCovered = EFalse;
         TBool hasLayers = EFalse;
-        TBool hasActiveVisualsInVisualTree = 
-            HandleLayoutVisualVisibility( layout, controlgroup, control, 
-                fullscreenCovered, fullscreen, screen, 
-                subTreeCovered, hasLayers, IsVisualOpaque(*layout) );    
+        
+        TBool hasActiveVisualsInVisualTree(EFalse);
+        
+        //embedded native alf application assumes that it should cover whole screen with alfcontent
+        // it makes alfeventwindowgroup as inactive and fading is not done on alf content
+        // this call is exculsive for alfeventwindowgroup 
+        if (alfClientWindowGroupVisible && (controlgroup.ResourceId() == iAlfWindowGroupNodeId))
+            {
+            hasActiveVisualsInVisualTree = 
+               HandleLayoutVisualVisibility( layout, controlgroup, control, 
+                   hasActiveVisualsInVisualTree, fullscreen, screen, 
+                   subTreeCovered, hasLayers, IsVisualOpaque(*layout),alfClientWindowGroupVisible );
+            }
+        
+        else
+            {
+            hasActiveVisualsInVisualTree = 
+               HandleLayoutVisualVisibility( layout, controlgroup, control, 
+                   fullscreenCovered, fullscreen, screen, 
+                   subTreeCovered, hasLayers, IsVisualOpaque(*layout) );
+            }
+        
+
         TBool hasFadeEffectsInVisualTree = (layout->CanvasFlags() & EHuiCanvasFlagExternalFadeExistsInsideVisualTree);        
 
+        if(!fullscreenCovered && alfClientWindowGroupVisible)
+            {
+            iTempRegion.AddRect(fullscreen);
+            iTempRegion.Tidy();
+            fullscreenCovered = ETrue;
+            }
+        
         // If root visuals effect is marked as opaque, then add whole screen area as covered.
         if (!fullscreenCovered)
             {
@@ -1511,8 +1607,8 @@
 #endif
             
         }
-    
-    if (iActivated)
+        
+    if (iActivated && !iLayoutSwitchInProgress)
         {
         if (iBgSurfaceFound || iHomeScreenWallpaperWindowFound)
             {
@@ -1522,6 +1618,11 @@
                 SetLowMemory(ETrue);
                 iInLowMemMode = ETrue;
                 }
+            else if (!iBgSurfaceFound && iInLowMemMode)
+                {
+                SetLowMemory(EFalse);
+                iInLowMemMode = EFalse;                
+                }
 
             // if the background animation is not hidden yet, hide it now
             if (!iBgAnimHidden)
@@ -1601,7 +1702,8 @@
         CAlfScreen* aScreen,
         TBool& aSubtreeVisible, 
         TBool& aHasVisualsWithLayers,
-        TBool aChildCanBeOpaque )
+        TBool aChildCanBeOpaque,
+        TBool aOnlyForEmbeddedAlfApp)
     {
     TBool visualTreeActive = EFalse;
     TRect visualDisplayRect;
@@ -1663,10 +1765,18 @@
             visualDisplayRect = canvasVisual->DisplayRect();
     
             // Make sure we clip visual rect to visible screen area
+            ClipVisualRect(visualDisplayRect, aLayout->DisplayRect());
             ClipVisualRect(visualDisplayRect, aFullscreen);
             
-            // Check if this visual is covered by other opaque visuals which rects are in "covered" region           
-            visualRectIsCovered = IsRectCoveredByRegion(visualDisplayRect, iTempRegion);                    
+            
+            // Check if this visual is covered by other opaque visuals which rects are in "covered" region
+            // it should not check for alf event window group, when we have embedded alf application,
+            // because we have assumed that alf app will have full screen covered
+            if(!aOnlyForEmbeddedAlfApp)
+                {
+                visualRectIsCovered = IsRectCoveredByRegion(visualDisplayRect, iTempRegion);
+                }
+                                
             }
     
     /*            if ( layout->Effect() || canvasVisual->Effect() )
@@ -1762,12 +1872,22 @@
                 canvasVisual->LayerExtent() != TRect() &&
                 !canvasVisual->LayerUsesAlphaFlag() )
                 {
-                // if paintedareacount is exactly one, it means that the window
+                // if paintedareacount is exactly one or two, it means that the window
                 // has background surface but no drawing commands
-                if (canvasVisual->PaintedAreaCount() == 1) 
+                TInt areaCount = canvasVisual->PaintedAreaCount();
+                // special handling for camera...
+                TBool incamera = aControlGroup.SecureId() == 0x101f857a;
+                if (areaCount == 1 || areaCount == 2 || incamera) 
                     {
-                    THuiCanvasPaintedArea pa = canvasVisual->PaintedArea(0);
-                    TRect r = pa.iPaintedRect.Round();
+                    TBool onlyFullScreenAreas = ETrue;
+                    for (TInt count = 0; count < areaCount; count++)
+                        {
+                        TRect area = canvasVisual->PaintedArea(count).iPaintedRect.Round();
+                        if (area != Display(0)->VisibleArea())
+                            {
+                            onlyFullScreenAreas = EFalse;
+                            }
+                        }
                     // if we found a fullscreen surface with no other drawing commands
                     // we can safely assume that it's about the only thing to be visible
                     // and we can release memory occupied by other parts of the system
@@ -1778,7 +1898,7 @@
                     // memory state. We want to do it like this as otherwise
                     // we would be triggering for example background animation
                     // on / off quite rapidly........
-                    if ( r == Display(0)->VisibleArea())
+                    if ( onlyFullScreenAreas || incamera)
                         {
                         // Final test. Surface must not be ALF surface, but some other surface.                        
                         CHuiControlGroup* alfControlGroup = FindControlGroupBySecureId( iAlfSecureId );
@@ -1829,6 +1949,7 @@
                 if ( !canvasVisual->HasCustomShape() )
                     {
                     TRect displayRect(canvasVisual->DisplayRect());
+                    ClipVisualRect(displayRect, aLayout->DisplayRect());
                     ClipVisualRect(displayRect, aFullscreen);
 
 #ifdef ALF_DEBUG_PRINT_WINDOWGROUP_ORDER
@@ -1893,7 +2014,20 @@
         visualTreeActive |= visualIsActive;
         
         // iVisibleVisualCount is cleared in HandleVisualVisibility()
-        AMT_INC_COUNTER_IF( visualIsActive && !visualRectIsCovered , iVisibleVisualCount );
+        AMT_INC_COUNTER_IF( visualIsActive && visualIsOpaque && !visualRectIsCovered, iVisibleVisualCount );
+        
+        AMT_MAP_SET_VALUE_IF(
+                visualIsActive && visualIsOpaque && !visualRectIsCovered && (canvasVisual->CanvasFlags() & EHuiCanvasFlagIncludeToVisibilityCalculation),
+                iBoolMap,
+                AMT_MAP_CPTR_TO_KEY_CAST( canvasVisual ),
+                ETrue,
+                EAlfModuleTestTypeBridgeVisualVisibility);
+        AMT_MAP_SET_VALUE_IF(
+                !visualIsActive || !visualIsOpaque || visualRectIsCovered || !(canvasVisual->CanvasFlags() & EHuiCanvasFlagIncludeToVisibilityCalculation),
+                iBoolMap,
+                AMT_MAP_CPTR_TO_KEY_CAST( canvasVisual ),
+                EFalse,
+                EAlfModuleTestTypeBridgeVisualVisibility);
         } // for loop end : children checking loop
      
     return visualTreeActive;
@@ -2300,6 +2434,7 @@
 	                {
                     HandleSetLayoutSwitchEffectL();
 	                iAlfScreens[0]->iDisplay->SetOrientation(huiOrientation);
+	                UpdateRootVisualsToFullscreen();
 	                if (iAppUi)
 	                	{
 	                	iAppUi->AdjustWindowGroupPositionL(0,CAlfAppServer::EAlfWindowSize); // hackish, but one way to enforce alf window resizing
@@ -2658,9 +2793,9 @@
 
     AMT_INC_COUNTER_IF( viz, iVisualPositionChangedCount );
     AMT_SET_VALUE_IF( viz, iLatestVisualExtentRect, TRect( windowAttributes->iPosition, windowAttributes->iSize ) );
-    AMT_MAP_SET_VALUE_IF( ( viz && iWindowHashArray.Find( windowNodeId ) ),
-                          iPositionMap, iWindowHashArray.Find( windowNodeId )->iClientSideId, 
-                          windowAttributes->iPosition, EAlfModuleTestTypeBridgeChangePosition );    
+    AMT_MAP_SET_VALUE_IF( viz, iPositionMap, windowNodeId,
+                          windowAttributes->iPosition, 
+                          EAlfModuleTestTypeBridgeChangeWindowPosition );    
 	}
 
 // ---------------------------------------------------------------------------
@@ -2692,9 +2827,10 @@
     
     AMT_INC_COUNTER_IF(viz, iVisualSizeChangedCount );
     AMT_SET_VALUE_IF(viz, iLatestVisualExtentRect, TRect( windowAttributes->iPosition, windowAttributes->iSize ) );
-    AMT_MAP_SET_VALUE_IF( ( viz && iWindowHashArray.Find( windowNodeId ) ), 
-                          iSizeMap, iWindowHashArray.Find( windowNodeId )->iClientSideId, 
-                          windowAttributes->iSize, EAlfModuleTestTypeBridgeChangeSize );
+    
+    AMT_MAP_SET_VALUE_IF( viz, iSizeMap, windowNodeId, 
+                          windowAttributes->iSize, 
+                          EAlfModuleTestTypeBridgeChangeWindowSize );
 	}
 
 // ---------------------------------------------------------------------------
@@ -3106,7 +3242,6 @@
 	            && iFullScreenEffectData->iEffectType != CFullScreenEffectState::ENotDefinedEffect 
 	            && !iFullScreenEffectData->iEndFullScreen)
 	        {
-
 	        CHuiControlGroup *to_group = NULL;
             if (iFullScreenEffectData->iEffectType == CFullScreenEffectState::EExitEffect)
                 {
@@ -3122,22 +3257,10 @@
 	        // 2. only the first drawing commands will trigger EndFullScreen
 	        // (this mechanism is here because we want to remove delay from fullscreen effects - and EndFullScreens are coming from application too late)
 	        
-	        if (viz->Owner().ControlGroup() == to_group)
+	        if (viz && viz->Owner().ControlGroup() == to_group)
 	            {
-                if (!iFullScreenEffectData->iDrawingCompleteTimer)
-                    {
-                    iFullScreenEffectData->InitDelayedEffectL(this, iAlfScreens[0]->Size());
-                    }
-                THuiCanvasPaintedArea p = viz->PaintedArea(0);
-	            iFullScreenEffectData->iPaintedRegion.AddRect( p.iPaintedRect.Round() );
-	            TRect b = iFullScreenEffectData->iPaintedRegion.BoundingRect();
-	            __ALFFXLOGSTRING3(
-	                    "CAlfBridge::HandlePostCanvasBufferL : Effect to visual 0x%x, Covered rect: iTl.iX: %d , iTl.iY: %d",
-	                    viz, 
-	                    b.iTl.iX, 
-	                    b.iTl.iY);
-	            __ALFFXLOGSTRING2("CAlfBridge::HandlePostCanvasBufferL : iBr.iX: %d, iBr.iY: %d", b.iBr.iX, b.iBr.iY);
-	                        }
+                GfxTriggerEffectWhenFullScreenDrawn(to_group);
+	            }
 	        }
 #endif
 	}
@@ -3146,7 +3269,7 @@
 // HandleGfxEndFullScreenTimeout
 // ---------------------------------------------------------------------------
 // 
-void CAlfBridge::HandleGfxEndFullScreenTimeout(CFullScreenEffectState* aFullScreenEffectData)
+void CAlfBridge::GfxTriggerEndFullScreen(CFullScreenEffectState* aFullScreenEffectData)
     {
     if (aFullScreenEffectData->iEndFullScreen)
         {
@@ -3206,6 +3329,7 @@
         }
     else
         {
+        __ALFFXLOGSTRING2("CAlfBridge::SetWindowActiveL 0x%x has active effect. New state: %d", aVisual, aActive);
         // Has effect
 		// these flags are put to action in RemoveTemporaryPresenterItem
         if (aActive)
@@ -3213,8 +3337,11 @@
 			// this prevents windows appearing before their "effected" time
             if (!iEffectCleanupStack[effectIndex].iHideWhenFinished)
                 {
-                // this is appear effect. Lets show it
+                // this is appear effect. Lets show it. if effect would be stopped
+                // by some other effect, then EHuiVisualFlagShouldBeShown assures the correct state
+                // after cleanup.
                 aVisual->iOpacity.Set(KAlfVisualDefaultOpacity);
+                aVisual->SetFlag(EHuiVisualFlagShouldBeShown);
                 }
             else
                 {
@@ -3229,7 +3356,10 @@
             // will only break the "live view"
             if (iEffectCleanupStack[effectIndex].iCanDestroyOrHideImmediately && !aVisual->Effect())
                 {
-                aVisual->ClearFlags(EHuiVisualFlagShouldBeShown | EHuiVisualFlagShouldBeHidden);
+                aVisual->ClearFlags(EHuiVisualFlagShouldBeShown);
+                aVisual->SetFlag(EHuiVisualFlagShouldBeHidden);
+                //if effect would be stopped by some other effect, then EHuiVisualFlagShouldBeShown flag
+                // assures the correct state after cleanup.
                 aVisual->iOpacity.Set(0.0f);    
                 }
             else
@@ -3320,9 +3450,11 @@
     AMT_INC_COUNTER( iTotalVisualFlagChangedCount );
     AMT_INC_COUNTER_IF( windowAttributes->iActive, iActiveVisualCount );
     AMT_INC_COUNTER_IF( !windowAttributes->iActive, iPassiveVisualCount );
-    AMT_MAP_INC_VALUE_IF( ( iWindowHashArray.Find( windowNodeId ) ), 
-                          iIntMap, iWindowHashArray.Find( windowNodeId )->iClientSideId, 
-                          EAlfModuleTestTypeBridgeChangeFlag );    
+
+    AMT_MAP_SET_VALUE( iBoolMap, windowNodeId, windowAttributes->iActive,
+                       EAlfModuleTestTypeBridgeChangeWindowVisibility );
+    AMT_MAP_SET_VALUE( iBoolMap, windowNodeId, windowAttributes->iActive,
+                       EAlfModuleTestTypeBridgeActiveWindow );
 	}
 
 
@@ -3883,6 +4015,37 @@
     return has;
     }
 
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CAlfBridge::UpdateRootVisualsToFullscreen()
+    {
+    if (!iAlfScreens.Count())
+        {
+        return;    
+        }
+    
+    // update all the layouts even inactive ones.
+    CAlfScreen* screen = iAlfScreens[0];
+    TRect fullscreen = TRect(TPoint(0,0), screen->Size());
+    for (TInt j=screen->iDisplay->Roster().Count() - screen->FixedControlGroupCount(); j>=0; j--)
+        {                
+        CHuiControlGroup& controlgroup = screen->iDisplay->Roster().ControlGroup(j);
+        CHuiControl& control = controlgroup.Control(0);
+
+        if( control.Role() == EAlfWindowGroupContainer)
+            {
+            // Only update layout which are made to correspond window groups. 
+            // Layouts that fullscreen effects are applied to
+            CHuiCanvasVisual* layout = (CHuiCanvasVisual*)&control.Visual(0);
+            layout->SetPos(fullscreen.iTl);
+            layout->SetSize(fullscreen.Size());
+            }
+        }
+    }
+
+
 
 // ---------------------------------------------------------------------------
 // SetupFadeEffectL
@@ -4167,7 +4330,9 @@
         __ALFLOGSTRING1("CAlfBridge::HandleSetCursorDataL - WARNING! Cursor node 0x%x not found!", windowNodeId);
         }
     
-    AMT_INC_COUNTER_IF(viz, iTotalVisualAttributeChangedCount);   
+    AMT_INC_COUNTER_IF(viz, iTotalVisualAttributeChangedCount);
+    
+    AMT_MAP_BRIDGE_TEXT_CURSOR_CHANGE();    
     }
 
 // ---------------------------------------------------------------------------
@@ -4226,9 +4391,48 @@
     {
     return aEngine->FxmlUsesInput1(aFileName);
     }
-	
+TBool FxmlHasOpaqueHint(CHuiFxEngine *aEngine, const TDesC &aFileName)
+    {
+    return aEngine->FxmlUsesOpaqueHint(aFileName);
+    }
+
+// ---------------------------------------------------------------------------
+// StoreLayoutIfRequiredByEffectL
+//
+// Certains effects require screenshot to be taken when BeginFullScreen event
+// is triggered. This method will take a screenshot (of the whole screen), if 
+// there is enough memory available.
+// ---------------------------------------------------------------------------
+//
+TBool CAlfBridge::StoreLayoutIfRequiredByEffectL(CHuiLayout* aLayout, CFullScreenEffectState& aEvent, TBool& aNeededStoredLayout)
+    {
+    aNeededStoredLayout = NeedsStoredBuffers(iHuiEnv->EffectsEngine(), *aEvent.iEffectName);
+    __ALFFXLOGSTRING2("CAlfBridge::StoreLayoutIfRequiredByEffectL - aHandle: %d, Take screenhot: %d", aEvent.iHandle, aNeededStoredLayout);
+    if (aNeededStoredLayout)
+        {
+        TRAPD(err,StoreRenderBufferStartL(aLayout));
+        __ALFFXLOGSTRING1("CAlfBridge::StoreLayoutIfRequiredByEffectL - Screenshot result: KErrNone == %d", err);
+        if (err == KErrNone)
+            {
+            aLayout->SetFreezeState(ETrue);
+            aEvent.iCanDestroyOrHideImmediately = ETrue; // if children of this layout are hidden or destroyed during effect, that can happen immediately
+            return ETrue; // storing of content requesteds, could store the content => success
+            }
+        else
+            {
+            return EFalse; // could not store the content => failed
+            }
+        }
+    else
+        {
+        __ALFFXLOGSTRING("CAlfBridge::StoreLayoutIfRequiredByEffectL - Storing not required");
+        return ETrue; // no storing requred, no screenshot required => success
+        }
+    }
+
 TBool CAlfBridge::HandleGfxEventL(CFullScreenEffectState& aEvent, CHuiLayout* aToLayout, CHuiLayout *aFromLayout)
     {
+    __ALFFXLOGSTRING2("CAlfBridge::HandleGfxEventL - To SecureUid: 0x%x, From SecureUid: 0x%x", aEvent.iToSecureId, aEvent.iFromSecureId);
     __ALFFXLOGSTRING4("CAlfBridge::HandleGfxEventL - To layout: 0x%x, From layout: 0x%x, Effect handle: %d, Action: %d", aToLayout, aFromLayout, aEvent.iHandle, aEvent.iAction);
     TInt err = KErrNone;
     TBool failed = EFalse;
@@ -4251,22 +4455,26 @@
             case MAlfGfxEffectPlugin::EBeginFullscreen:
                 {
                 aToLayout->SetStoredRenderBufferModificationsEnabled(ETrue);
-                TBool needStoredBuffers = NeedsStoredBuffers(engine, *aEvent.iEffectName);
-                __ALFFXLOGSTRING2("CAlfBridge::HandleGfxEventL - EBeginFullScreen: %d, Take screenhot: %d", aEvent.iHandle, needStoredBuffers);
-                if (needStoredBuffers)
+                TBool neededStoredBuffers;
+                TBool success = StoreLayoutIfRequiredByEffectL(aToLayout, aEvent, neededStoredBuffers);
+				
+				// if screenshot was requested and it was possible to take one, then add this layout
+				// to effectcleanup stack
+                if (neededStoredBuffers)
                     {
-                    TRAP(err,StoreRenderBufferStartL(aToLayout));
-                    __ALFFXLOGSTRING1("CAlfBridge::HandleGfxEventL - EBeginFullScreen: Screenshot result: KErrNone == %d", err);
-                    if (err == KErrNone)
-                        {
-                        aToLayout->SetFreezeState(ETrue);
-                        aEvent.iCanDestroyOrHideImmediately = ETrue; // if children of this layout are hidden or destroyed during effect, that can happen immediately
-                        }
-                    else
-                        {
-                        return ETrue; // failed, effect will be canceled
-                        }
+                    TInt dummy;
+					if (!HasActiveEffect(aToLayout, dummy))
+						{
+						__ALFFXLOGSTRING2("CAlfBridge::HandleGfxEventL - Add layout 0x%x with handle %d to cleanupstack", aToLayout, aEvent.iHandle);
+                    	AddEffectItemL(aEvent.iHandle, aToLayout, NULL, NULL, EFalse, dummy, EFalse);
+						}
                     }
+				// Screenshot was requested, but it could not be taken. Lets cancel the effect.	
+				if (!success)
+					{
+					return ETrue; // this will cause effect cleanup
+					}	
+					      
 
                 switch(aEvent.iAction)
                     {
@@ -4279,6 +4487,7 @@
                         aToLayout->iOpacity.Set(0.0f);    // these are meant for applications that are not yet ready to be drawn, but possible already on the foreground
                         FreezeLayoutUntilEffectDestroyedL(aFromLayout, aEvent.iHandle);
                         aEvent.iEffectType = CFullScreenEffectState::EStartEffect;
+                        aEvent.iCanDestroyOrHideImmediately = ETrue; // enable hiding of windows during application start/activate effects
                         break;
                         }
                     case AknTransEffect::EApplicationExit:
@@ -4299,8 +4508,18 @@
                             __ALFFXLOGSTRING2("CAlfBridge::HandleGfxEventL - Found effect on layout 0x%x. Removing effect 0x%x", aToLayout, aToLayout->Effect());
                             aToLayout->SetEffect(NULL);
                             }
-                        if ( aEvent.iAction == AknTransEffect::EApplicationExit && !(aToLayout->Flags() & EHuiVisualFlagInactive)) 
+                        __ALFFXLOGSTRING2("CAlfBridge::HandleGfxEventL - Layout 0x%x is active:  %d", aToLayout, !TBool(aToLayout->Flags() & EHuiVisualFlagInactive) );
+                        if (!(aToLayout->Flags() & EHuiVisualFlagInactive)) 
                             {
+                            TInt index;
+                            if (aToLayout->StoredRenderBuffer() && HasActiveEffect(aToLayout, index) && index != KErrNotFound)
+                                {
+	                            // a screenshot has been saved into the layout, and the layout was added to cleanupstack
+    	                        // for cleaning. SetupEffectLayoutContainerL will add the same layout 
+        	                    // to the cleanupstack, but double cleaning is not a good idea. Thus it is removed here. 
+                                __ALFFXLOGSTRING1("CAlfBridge::HandleGfxEventL - Removing the layout 0x%x with screenshot from iEffectCleanupStack", aToLayout);
+                                iEffectCleanupStack.Remove(index);
+                                }
                             // this will tag the visual, that they cannot be hidden by HandleVisualVisibility
                             // Initialize layout for the exit effect  
                             iLayoutInitializedForExitEffect = SetupEffectLayoutContainerL(aEvent.iHandle, aToLayout, ETrue, aEvent.iCanDestroyOrHideImmediately);
@@ -4311,6 +4530,7 @@
                             {
                             iLayoutInitializedForExitEffect = EFalse;
                             aEvent.iSetupDone = EFalse;
+							failed = ETrue;
                             }
                          return failed;
                          }
@@ -4337,21 +4557,37 @@
                             {
                             // Exit effect was initialized earlier with EBeginFullscreen event
 						    layoutEffectable = aEvent.iSetupDone;
-						    __ALFFXLOGSTRING1("CAlfBridge::HandleGfxEventL - EEndFullScreen: %d", layoutEffectable);
+						    __ALFFXLOGSTRING1("CAlfBridge::HandleGfxEventL - EEndFullScreen: iSetupDone: %d", layoutEffectable);
                             }
                         else
                         	{
                             // add visuals to visual cleanupstack
                             aToLayout->SetStoredRenderBufferModificationsEnabled(EFalse);
+                            TInt index;
+                            if (aToLayout->StoredRenderBuffer() && HasActiveEffect(aToLayout, index) && index != KErrNotFound)
+                                {
+	                            // a screenshot has been saved into the layout, and the layout was added to cleanupstack
+    	                        // for cleaning. SetupEffectLayoutContainerL will add the same layout 
+        	                    // to the cleanupstack, but double cleaning is not a good idea. Thus it is removed here. 
+                                __ALFFXLOGSTRING1("CAlfBridge::HandleGfxEventL - Removing the layout 0x%x with screenshot from iEffectCleanupStack", aToLayout);
+                                iEffectCleanupStack.Remove(index);
+                                }
                             layoutEffectable = SetupEffectLayoutContainerL(aEvent.iHandle,aToLayout, EFalse, aEvent.iCanDestroyOrHideImmediately);
                             aEvent.iSetupDone = layoutEffectable; 
                             aToLayout->SetStoredRenderBufferModificationsEnabled(ETrue);
                             }
 
                         if (layoutEffectable)
-                            {                        
-                            TInt effectFlags = KHuiFxDelayRunUntilFirstFrameHasBeenDrawn;
-                            if (NeedsStoredBuffers(iHuiEnv->EffectsEngine(), *aEvent.iEffectName))
+                            {
+                            TInt effectFlags = 0;
+                            TInt activeEffectGroup = engine->ActiveGroupEffect();
+                            if (activeEffectGroup != KErrNotFound)
+                                {
+                                engine->AddEffectToGroup(activeEffectGroup);
+                                }
+                            __ALFFXLOGSTRING1("CAlfBridge::HandleGfxEventL - Active effect group: %d", activeEffectGroup);
+                            effectFlags = KHuiFxDelayRunUntilFirstFrameHasBeenDrawn; 
+                            if (FxmlHasOpaqueHint(iHuiEnv->EffectsEngine(), *aEvent.iEffectName))
                                 {
                                 // Performance improvement, but this would be better to be a special hint param in the fxml
                                 effectFlags |= KHuiFxOpaqueHint;
@@ -4359,11 +4595,11 @@
                             
                             if (aEvent.iRect != TRect())
                                 {
-                                TRAP( err, engine->LoadGroupEffectL( *aEvent.iEffectName, effect, aToLayout->Effectable(), engine->ActiveGroupEffect(), &aEvent.iRect, this, aEvent.iHandle, effectFlags ));
+                                TRAP( err, engine->LoadGroupEffectL( *aEvent.iEffectName, effect, aToLayout->Effectable(), activeEffectGroup, &aEvent.iRect, this, aEvent.iHandle, effectFlags ));
                                 }
                             else
                                 {
-                                TRAP( err, engine->LoadGroupEffectL( *aEvent.iEffectName, effect, aToLayout->Effectable(), engine->ActiveGroupEffect(), NULL, this, aEvent.iHandle, effectFlags ) );
+                                TRAP( err, engine->LoadGroupEffectL( *aEvent.iEffectName, effect, aToLayout->Effectable(), activeEffectGroup, NULL, this, aEvent.iHandle, effectFlags ) );
                                 }
                             effect = NULL;
                             // only use the effect if the effect file was correctly parsed
@@ -4419,6 +4655,8 @@
         {
         __ALFFXLOGSTRING("CAlfBridge::HandleGfxStopEvent - END: none");
         RemoveAllTemporaryPresenterVisuals();
+        delete iControlEffectData;
+        iControlEffectData = NULL;
         return;
         }
     
@@ -4426,7 +4664,7 @@
     iFullScreenEffectData = NULL;
     CleanupStack::PushL( fxData );
     
-     __ALFFXLOGSTRING2(" - handle: %d, toAppUid: 0x%x", fxData->iHandle, fxData->iToAppId);
+     __ALFFXLOGSTRING2("CAlfBridge::HandleGfxStopEvent - handle: %d, toAppUid: 0x%x", fxData->iHandle, fxData->iToAppId);
     
     // clean effects with this handle       
     RemoveTemporaryPresenterVisual(NULL, fxData->iHandle);
@@ -4440,6 +4678,9 @@
     // abort ALL other possible control effects
     RemoveAllTemporaryPresenterVisuals();
     
+    delete iControlEffectData;
+    iControlEffectData = NULL;
+    
     iHuiEnv->ContinueRefresh();
     
     if ( !aClientRequest )
@@ -4507,6 +4748,14 @@
     // operation tells if this is begin full screen or end full screen
     TInt operation = stream.ReadInt32L();
     
+    // If we are in low memory state, we don't want to do any effects
+    if(iHuiEnv->MemoryLevel() < EHuiMemoryLevelReduced)
+        {
+        __ALFFXLOGSTRING("CAlfBridge::HandleGfxEffectsL - Returning because memory level below NORMAL");
+		stream.Release();
+        return;
+        }
+     
     if ( operation == MAlfGfxEffectPlugin::EBeginFullscreen )
         {
         if ( !iFullScreenEffectData || !iFullScreenEffectData->iSetupDone )
@@ -4542,7 +4791,13 @@
                 RemoveEffectFromApp(iFullScreenEffectData->iFromSecureId, iFullScreenEffectData->iFromWg);
                 // Fullscreen effect for another 
                 }
-            
+
+            if (iFullScreenEffectData && iFullScreenEffectData->iToAppId != fxData->iToAppId)
+                {
+                // effected application has changed. Only single begin - end request supported at a time.
+                __ALFFXLOGSTRING2("CAlfBridge::HandleGfxEffectsL - Effect request has changed from appUid 0x%x to 0x%x. Cancel previous effect.", iFullScreenEffectData->iToAppId, fxData->iToAppId);
+                RemoveEffectFromApp(iFullScreenEffectData->iToAppId);
+                }
             delete iFullScreenEffectData;
             iFullScreenEffectData = fxData;
             iFullScreenEffectData->iAppStartScreenshotItemHandle = fxData->iHandle;
@@ -4595,43 +4850,11 @@
     __ALFFXLOGSTRING3("CAlfBridge::HandleGfxEffectsL - Operation: %d, handle: %d, type: %d", operation, fxData->iHandle, fxData->iType);
     __ALFFXLOGSTRING2("CAlfBridge::HandleGfxEffectsL - towg: %d, fromwg: %d", fxData->iToWg, fxData->iFromWg);
 
-    // find root nodes and attach effects to them
-    // First we need a windowgroup node id. So far we have a list of window ids
-
-    // wg2 is the window group that is supposed to disappear from view
-    // when a new application starts. We don't have any use for it now...
-
-    // This is the group that is disappearing
-    // Currently we don't add an effect to it.
-
-    // TODO: when ids available from wserv...
-    // if ( appUid2 )
-    //{
-    //	 group2 = FindControlGrouAppUId( appUid2, screen2, &alfGroup );
-    // }
-    //if ( toAppId2 )
-    //    {
-    //    group2 = FindControlGroupByAppId(toAppId2);
-    //    }
-    //if ( wg2 && wg2 != KErrNotFound )
-    //    {
-    //        group2 = FindControlGroupByWindowGroupId( wg2, screen2 );
-    //        }
-    //    if ( group2 )
-    //        {
-    //        CHuiControl& control = group2->Control(0);
-    //        layout2 = (CHuiLayout*)&control.Visual(0);
-    //        }
-
-    // This effect is triggered either by BeginFullScreen or by EndFullScreen
-    // depending on if we have an application that is already running or not
-
-    //    TAlfControlGroupEntry* alfGroup = NULL;
-
+    CHuiControlGroup* toGroup = NULL;
+    
     TBool failed = EFalse;
     if (fxData->iToAppId && fxData->iToAppId != KErrNotFound)
         {        
-        CHuiControlGroup* toGroup = NULL;
         CHuiLayout* toLayout = NULL; 
         toGroup = FindControlGroupByFullScreenToEffect();
 
@@ -4670,6 +4893,18 @@
         // Effect failed, reset state
         HandleGfxStopEvent( EFalse ); // destroys iFullScreenEffectData
         }
+    else
+        {
+        // it might be that the application is already having drawing for the whole screen. 
+		// If so, then trigger EndFullScreen immediately.
+        if (fxData && 
+                toGroup 
+                && fxData->iOperation == MAlfGfxEffectPlugin::EBeginFullscreen 
+                && fxData->iEffectType == CFullScreenEffectState::EStartEffect)
+            {
+            GfxTriggerEffectWhenFullScreenDrawn(toGroup);
+            }
+        }
     
     for (TInt i = 0; i < iAlfScreens.Count(); i++)
         {
@@ -4681,6 +4916,37 @@
     __ALFFXLOGSTRING("CAlfBridge::HandleGfxEffectsL - END");
     }
 
+TBool CAlfBridge::GfxTriggerEffectWhenFullScreenDrawn(CHuiControlGroup* aToGroup)
+    {
+    if (!aToGroup || (aToGroup && aToGroup->Count() == 0))
+        {
+        return EFalse;
+        }
+      iTempRegion.Clear();
+    
+    CAlfScreen* screen = iAlfScreens[0];
+    TRect fullscreen = TRect(TPoint(0,0), screen->Size());
+    TBool fullscreenCovered(EFalse);
+    TInt dummy = 0;
+    
+    CHuiControl& control = aToGroup->Control(0);
+    CHuiLayout* toLayout = control.VisualCount() > 0 ? (CHuiLayout*)&control.Visual(0) : NULL;
+    if (!toLayout)
+        {
+        return EFalse;
+        }
+    TBool opaque = ETrue; // in app start case the layout is propably not opaque. Fake it.
+    IsFullScreenDrawnRecursive(toLayout, *aToGroup, control, fullscreenCovered, fullscreen, screen, dummy, opaque, iAlfScreens[0]->iDisplay->Orientation());
+    fullscreenCovered = IsRectCoveredByRegion(fullscreen, iTempRegion);
+    __ALFFXLOGSTRING1("CAlfBridge::GfxTriggerEffectWhenFullScreenDrawn - Covered: %d", fullscreenCovered);
+    if (fullscreenCovered)
+        {
+        GfxTriggerEndFullScreen(iFullScreenEffectData);
+        return ETrue;
+        }
+    return EFalse;
+    }
+
 // TODO: add effect type to effect struct. remove all fullscreen effects. currently some might hang around
 void CAlfBridge::HandleGfxStopEffectsL(TAlfBridgerData data)
     {
@@ -4728,6 +4994,9 @@
     TInt handle = stream.ReadInt32L();
     stream.Release();
 
+    delete iControlEffectData;
+    iControlEffectData = NULL;
+        
     if (handle != KErrNotFound)
         {
         __ALFFXLOGSTRING1("CAlfBridge::HandleGfxStopControlEffectsL - Remove effect with handle: %d", handle);
@@ -4886,7 +5155,13 @@
                CHuiLayout& layout = static_cast<CHuiLayout&> (aSourceLayout->Visual(i));
                AddToEffectLayoutContainerL(aEffectHandle, &layout, NULL, aEffectControl, aItemsDestroyed, EFalse,aIsExitEffect, aCanDestroyOrHideImmediately );
                }
+           TInt oldItemsDestroyed = aItemsDestroyed;
            AddEffectItemL(aEffectHandle, &sourceVisual, aTargetLayout, aEffectControl, EFalse, aItemsDestroyed, aIsExitEffect, aCanDestroyOrHideImmediately);
+           if (oldItemsDestroyed != aItemsDestroyed)
+               {
+               // Visual was destroyed. If so, then we must adjust index.
+               --i;
+               }
            }
     __ALFFXLOGSTRING2("CAlfBridge::AddToEffectLayoutContainerL 0x%x end of children", aSourceLayout, aSourceLayout->Count());
     }
@@ -4947,6 +5222,15 @@
         delete iControlEffectData;
         iControlEffectData = NULL;
         }
+    
+    // If we are in low memory state, we don't want to do any effects
+    if(iHuiEnv->MemoryLevel() < EHuiMemoryLevelReduced)
+        {
+        __ALFFXLOGSTRING("CAlfBridge::HandleGfxControlEffectsL - Returning because memory level below NORMAL");
+        stream.Release();
+        return;
+        }
+    
     CControlEffectState* fxData = new (ELeave) CControlEffectState;
     CleanupStack::PushL(fxData);
     fxData->ConstructL(action, stream);
@@ -4969,7 +5253,7 @@
         }
     else
         {
-        __ALFFXLOGSTRING2("CAlfBridge::HandleGfxControlEffectsL - Control not found. iClientHandle 0x%x, iClientGroupHandle 0x%x", 
+        __ALFFXLOGSTRING2("CAlfBridge::HandleGfxControlEffectsL - Control not found. iClientHandle %d, iClientGroupHandle %d", 
                 iControlEffectData->iClientHandle, 
                 iControlEffectData->iClientGroupHandle);
         return;
@@ -5009,7 +5293,6 @@
             RemoveTemporaryPresenterVisual(aCanvasVisual);
             }
         TBool layoutEffectable(EFalse);
-        aCanvasVisual->iOpacity.Set(KAlfVisualDefaultOpacity);
         if (aEvent.iAction == KGfxControlDisappearAction)
             { // TODO: revise
             // The control stays visible because the inactive flag is not set
@@ -5030,7 +5313,21 @@
             }
         if (layoutEffectable)
             {
-            TRAP( err, engine->LoadGroupEffectL(*aEvent.iEffectName, effect, aCanvasVisual->Effectable(), engine->ActiveGroupEffect(), NULL, this, aEvent.iHandle, KHuiFxDelayRunUntilFirstFrameHasBeenDrawn ) );
+            TInt effectFlags = 0;
+            
+            // effect will start delayed anyway when it is syncronized. this flag would break syncronization between effects.
+            effectFlags = KHuiFxDelayRunUntilFirstFrameHasBeenDrawn; 
+            if (FxmlHasOpaqueHint(iHuiEnv->EffectsEngine(), *aEvent.iEffectName))
+                {
+                effectFlags |= KHuiFxOpaqueHint;
+                }
+
+            TInt activeEffectGroup = engine->ActiveGroupEffect();
+            if (activeEffectGroup != KErrNotFound)
+                {
+                engine->AddEffectToGroup(activeEffectGroup);
+                }
+            TRAP( err, engine->LoadGroupEffectL(*aEvent.iEffectName, effect, aCanvasVisual->Effectable(), activeEffectGroup, NULL, this, aEvent.iHandle, effectFlags ) );
             }
         else
             {
@@ -5348,12 +5645,12 @@
     // iFinishedCleanupStackEffects.Append(aHandle);
     if (!iEffectEndTimer->IsActive())
         {
-        iEffectEndTimer->AddFinishedHandleL(aHandle);
+        TRAP_IGNORE(iEffectEndTimer->AddFinishedHandleL(aHandle));
         iEffectEndTimer->Start(KEffectCleanupDelayInMs * 1000);
         }
     else
         {
-        iEffectEndTimer->AddFinishedHandleL(aHandle);
+        TRAP_IGNORE(iEffectEndTimer->AddFinishedHandleL(aHandle));
         }
 
     // We should do visual visibility scan after effect is ended
@@ -5583,8 +5880,8 @@
 void CAlfBridge::PostQTCommandBufferL( TAlfQtCommandBufferParams params )
     {       
     CHuiCanvasVisual* huiVisual = NULL;       
-    if ((*iHost))
-        {
+/*    if ((*iHost))
+        {  
         if( (*iHost)->StreamerServer() )
             { 
             if ((*iHost)->StreamerServer()->WindowMgr())
@@ -5606,7 +5903,7 @@
                 }
             }
         }
-    
+*/    
     if ( huiVisual )
        {
        TPtrC8 commands( (TUint8 *)params.iPtr, params.iLength );
@@ -5640,10 +5937,10 @@
 // visual
 // ---------------------------------------------------------------------------
 // 
-void CAlfBridge::SetClientWindowForDrawingL(TInt aWindowGroupId, TInt aClientWindowHandle, 
-	CHuiVisual* aExternalContentVisual)
+void CAlfBridge::SetClientWindowForDrawingL(TInt /*aWindowGroupId*/, TInt /*aClientWindowHandle*/, 
+	CHuiVisual* /*aExternalContentVisual*/)
 	{    	
-    RArray<TAlfWServInfo> winInfoList;
+  /*  RArray<TAlfWServInfo> winInfoList;
     CleanupClosePushL(winInfoList);
 
 	// Find canvas visual for the RWindow
@@ -5696,7 +5993,7 @@
 		}
 		
 	CleanupStack::PopAndDestroy(); // winInfoList
-	}
+*/	}
 
 void CAlfBridge::SetVisualTreeVisibilityChanged(TBool aChanged)
     {
@@ -5728,11 +6025,17 @@
             iAlfScreens[i]->iDisplay->SetForegroundBitmapL( iAlfScreens[i]->iSwRenderingTarget );
             CleanupStack::Pop(texture);
             iAlfScreens[i]->iDisplay->SetForegroundTexture(texture);
+#ifdef ALF_DRAW_FRAME_BEFORE_END_CALLBACK 
+            iHuiEnv->SetRefreshMode(EHuiRefreshModeManual);
+#endif // #ifdef ALF_DRAW_FRAME_BEFORE_END_CALLBACK 
             }
         else
             {
             iAlfScreens[i]->iDisplay->SetForegroundBitmapL(NULL);            
             iAlfScreens[i]->iDisplay->SetForegroundTexture(NULL);
+#ifdef ALF_DRAW_FRAME_BEFORE_END_CALLBACK 
+            iHuiEnv->SetRefreshMode(EHuiRefreshModeAutomatic);
+#endif // #ifdef ALF_DRAW_FRAME_BEFORE_END_CALLBACK 
             }
             
         // SetCapturingBufferL is called from HandleVisualVisibility.
@@ -5771,6 +6074,11 @@
             // For tests
             //TUint32* data = aScreen->iSwRenderingTarget->DataAddress();
             }
+        
+        if (modified && aScreen->iSwRenderingTarget)
+            {
+            InitializeSwRenderingTarget(aScreen->iSwRenderingTarget);
+            }
         }
     else
         {
@@ -5785,6 +6093,18 @@
 // ---------------------------------------------------------------------------
 // ---------------------------------------------------------------------------
 // 
+void CAlfBridge::InitializeSwRenderingTarget(CFbsBitmap* aBitmap)
+    {
+    __ALFLOGSTRING("CAlfBridge::InitializeSwRenderingTarget");
+    TAlfBridgeDrawerWrapper wrapper(*this);
+    AlfDrawerInternal::CopyScreenToBitmap(&wrapper, aBitmap, 
+        TRect(aBitmap->SizeInPixels()));
+    __ALFLOGSTRING("CAlfBridge::InitializeSwRenderingTarget ok");
+    }
+
+// ---------------------------------------------------------------------------
+// ---------------------------------------------------------------------------
+// 
 void CAlfBridge::SetMemoryLevel(THuiMemoryLevel aMemoryLevel)
     {
     iCurrentMemoryLevel = aMemoryLevel;
@@ -5818,9 +6138,9 @@
 void CAlfBridge::DoUpdateMemoryLevel()
     {
     THuiMemoryLevel memoryLevel = iCurrentMemoryLevel;
-    if ( iLowMemoryMode && ( memoryLevel > EHuiMemoryLevelLow ) )
-        {
-        memoryLevel = EHuiMemoryLevelLow;
+    if ( iLowMemoryMode && ( memoryLevel > EHuiMemoryLevelReduced ) )
+        {
+        memoryLevel = EHuiMemoryLevelReduced;
         }
     if ( iForcedSwRendering && ( memoryLevel > EHuiMemoryLevelLowest ) )
         {
@@ -5831,9 +6151,10 @@
     
     if ( memoryLevel != iHuiEnv->MemoryLevel() )
         {    
+
         __ALFLOGSTRING1("CAlfBridge::DoUpdateMemoryLevel -> %d", memoryLevel);
-        TBool nowGoodMemory = !(memoryLevel < EHuiMemoryLevelNormal);
-        TBool wasGoodMemory = !(iHuiEnv->MemoryLevel() < EHuiMemoryLevelNormal);
+        TBool nowGoodMemory = !(memoryLevel < EHuiMemoryLevelReduced);
+        TBool wasGoodMemory = !(iHuiEnv->MemoryLevel() < EHuiMemoryLevelReduced);
         
         if (iActivated)
             {
@@ -5851,7 +6172,7 @@
                 }
             }
         
-        if ( memoryLevel <= EHuiMemoryLevelLowest)
+        if ( memoryLevel < EHuiMemoryLevelReduced)
             {
             OnLowMemoryModifyAllEffects();
             }
@@ -5966,7 +6287,39 @@
             if ( lBreak )
                break;
             }
-            
+    TBool alreadyExists = EFalse;
+    for( TInt i = 0 ; i < iAlfNativeClientsWgIds.Count() ; i++ )
+        {
+        if(iAlfNativeClientsWgIds[i] == aId)
+            {
+            alreadyExists = ETrue;
+            }
+        }
+    if(!alreadyExists)
+        {
+        iAlfNativeClientsWgIds.Append(aId);
+        }
+    }
+
+void CAlfBridge::RemoveWindowGroupAsAlfApp( TInt aId )
+    {
+    for ( TInt j = 0; j < iAlfScreens.Count(); j++ )
+            {
+            for ( TInt i = 0; i < iAlfScreens[j]->iControlGroups.Count(); i++ )
+                {
+                if ( iAlfScreens[j]->iControlGroups[i].iClientWindowGroupId == aId )
+                    {
+                    iAlfScreens[j]->iControlGroups[i].iControlGroup->iAlfApp = EFalse;
+                    }
+                }   
+            }
+    for( TInt i = 0 ; i < iAlfNativeClientsWgIds.Count() ; i++ )
+        {
+        if(iAlfNativeClientsWgIds[i] == aId)
+            {
+            iAlfNativeClientsWgIds.Remove(i);
+            }
+        }
     }
 
 // ---------------------------------------------------------------------------
@@ -5990,11 +6343,7 @@
     __ALFFXLOGSTRING3("CAlfBridge::IsFullScreenDrawn - new orientation %d, screen size: (%d,%d)", aOrientation, fullscreen.iBr.iX, fullscreen.iBr.iY );
     TBool fullscreenCovered = EFalse;
     CAlfAppSrvSessionBase* topMostAlfSrvSession = NULL;
-    
-    //iActiveVisualCount = 0;
-    iBgSurfaceFound = EFalse;
-    //iPaintedArea = 0;  
-    
+        
     // Check if effect group has an effect with opaque hint.
     CHuiControlGroup& fxcontrolgroup = *(iAlfScreens[0]->iFullscreenEffectControlGroup);
     CHuiControl& fxcontrol = fxcontrolgroup.Control(0);
@@ -6011,21 +6360,16 @@
         }    
     
     TBool alfWindowGroupFoundVisible = EFalse;
+
+    AMT_SET_VALUE( iVisibleVisualCount, 0 );
     
     // skip the topmost (effect) layer, start from floating sprite group
     for (TInt j=screen->iDisplay->Roster().Count() - screen->FixedControlGroupCount(); j>=0; j--)
         {                
         CHuiControlGroup& controlgroup = iAlfScreens[0]->iDisplay->Roster().ControlGroup(j);
         CHuiControl& control = controlgroup.Control(0);
-
-            for (TInt ii=0; ii<iAlfScreens[0]->iControlGroups.Count();ii++)
-                {
-                if( iAlfScreens[0]->iControlGroups[ii].iControlGroup == &controlgroup )
-                    {
-                    __ALFFXLOGSTRING1("CAlfBridge::IsFullScreenDrawn : Group owner 0x%x", iAlfScreens[0]->iControlGroups[ii].iSecureId);
-                    break;
-                    }
-                }
+		__ALFFXLOGSTRING1("CAlfBridge::IsFullScreenDrawn : Group owner 0x%x", controlgroup.SecureId());
+                
         
         if (control.Role() == EAlfFpsIndicatorContainer)
             {
@@ -6043,7 +6387,6 @@
             for(TInt ii=0;ii< iTempRegion.Count(); ii++)
                 {
                 __ALFFXLOGSTRING4("CAlfBridge::IsFullScreenDrawn (%d,%d)-(%d,%d)", iTempRegion[ii].iTl.iX, iTempRegion[ii].iTl.iY , iTempRegion[ii].iBr.iX, iTempRegion[ii].iBr.iY );
-                return ETrue;
                 }
             }
         
@@ -6205,6 +6548,9 @@
                 }
             }                                   
         visualTreeActive |= visualIsActive;
+        
+        // iVisibleVisualCount is cleared in HandleVisualVisibility()
+        AMT_INC_COUNTER_IF( visualIsActive && !visualRectIsCovered , iVisibleVisualCount );
         } // for loop end : children checking loop
     return visualTreeActive;
     }
@@ -6217,6 +6563,7 @@
         {
         return;    
         }
+    iLayoutSwitchInProgress = ETrue;
     CAlfScreen* screen = iAlfScreens[0];
     // skip the topmost (effect) layer, start from floating sprite group
     for (TInt j=screen->iDisplay->Roster().Count() - screen->FixedControlGroupCount(); j>=0; j--)
@@ -6252,8 +6599,9 @@
     
             if (!canvasVisual->LayerExtent().IsEmpty())
                 {
-                canvasVisual->ClearCanvasFlags(EHuiCanvasFlagSurfaceVisible);
-                canvasVisual->SetCanvasFlags(EHuiCanvasFlagSurfaceInvisible);
+                // Force update
+                canvasVisual->ClearCanvasFlags( EHuiCanvasFlagSurfaceInvisible );
+                canvasVisual->ClearCanvasFlags( EHuiCanvasFlagSurfaceVisible );
                 }
             }
         }
@@ -6268,6 +6616,7 @@
         }
         */
     // request syncronized frame
+    iLayoutSwitchInProgress = EFalse;
     if ( iHuiEnv )
         {
         iIdForLayoutSwitchFrameSync = iIdForEAlfDSSynchronizeOp - KPreventingCollisionOfIdsInSynchDrawRequests;
@@ -6275,5 +6624,29 @@
         }
     }
 
+TAlfBridgeDrawerWrapper::TAlfBridgeDrawerWrapper(CAlfBridge& aBridge)
+    : iBridge( aBridge )
+    {
+    }
+    
+TInt TAlfBridgeDrawerWrapper::GetSizeAndRotation(TSize& aSize, TInt& aRotation)
+    {
+    return iBridge.GetSizeAndRotation(aSize, aRotation);
+    }
+    
+TInt TAlfBridgeDrawerWrapper::ReadPixels(CFbsBitmap* aBitmap)
+    {
+    return iBridge.ReadPixels(aBitmap);
+    }
+
+RAlfBridgerClient* CAlfBridge::BridgerClient()
+    {
+    if (iActivated)
+        {
+        return &iBridgerClient;
+        }
+    return 0;      
+    }
+
 
 // end of file
--- a/uiacceltk/hitchcock/ServerCore/Src/alfeffectutils.cpp	Fri Apr 16 15:56:24 2010 +0300
+++ b/uiacceltk/hitchcock/ServerCore/Src/alfeffectutils.cpp	Mon May 03 13:22:43 2010 +0300
@@ -21,8 +21,6 @@
 #include <alflogger.h>
 
 const TInt KRosterFreezeEndTimeoutInMs = 100;
-const TInt KFirstTimeoutForApplicationEndFullScreenInMs = 20;
-const TReal KMinimumPaintedAreaBeforeForcedEffect = 0.75;
 
 // ---------------------------------------------------------
 // CAlfRosterFreezeEndTimer
@@ -60,6 +58,7 @@
     __ALFLOGSTRING("CAlfRosterFreezeEndTimer::Start");
     if (!IsActive())
         {
+        iSafeCounter = 0;
         After( aPeriod );
         }
     }
@@ -657,7 +656,7 @@
 //
 TBool CAlfLayoutSwitchEffectCoordinator::IsThemeEffectEnabled() const
     {
-    TBool memoryOk = !( iBridge.iHuiEnv->MemoryLevel() <= EHuiMemoryLevelLowest );
+    TBool memoryOk = !( iBridge.iHuiEnv->MemoryLevel() <= EHuiMemoryLevelLow );
     TBool tfxOn = CAknTransitionUtils::TransitionsEnabled(AknTransEffect::ELayoutswitchTransitionsOff );
     TBool tfxExists = LayoutSwitchEffectsExist();
 
@@ -847,46 +846,6 @@
     iCompletionHandle = iHandle;
     }
 
-TInt doNotifyDrawingTimeout( TAny* aPtr )
-    {
-    ((CFullScreenEffectState*)aPtr)->NotifyDrawingTimeout();
-    return 0; // must return something
-    }
-
-TBool CFullScreenEffectState::InitDelayedEffectL(CAlfBridge* aBridge, TSize aDisplaySize)
-    {
-    iBridge = aBridge;
-    iDisplaySize = aDisplaySize;
-    if (!iDrawingCompleteTimer)
-        {
-        iDrawingCompleteTimer = CPeriodic::NewL( EPriorityNormal );
-        iDrawingCompleteTimer->Start( 
-                KFirstTimeoutForApplicationEndFullScreenInMs * 1000 , 
-                KFirstTimeoutForApplicationEndFullScreenInMs * 1000 , TCallBack( doNotifyDrawingTimeout, this ));
-        return ETrue;
-        }
-    return EFalse;
-    }
-
-void CFullScreenEffectState::NotifyDrawingTimeout()
-    {
-    
-    iPaintedRegion.ClipRect(TRect(0,0, iDisplaySize.iWidth, iDisplaySize.iHeight));
-    iPaintedRegion.Tidy(); // remove overlapping regions
-    TInt size(0);
-    for(TInt i=0; i< iPaintedRegion.Count();i++ )
-        {
-        size += iPaintedRegion[i].Width()*iPaintedRegion[i].Height();
-        }
-    // lets continue, if the covered area is more than 75% of the screen. This is usually enough.
-    if ( size > KMinimumPaintedAreaBeforeForcedEffect  * (iDisplaySize.iWidth * iDisplaySize.iHeight))
-        {
-        iBridge->HandleGfxEndFullScreenTimeout(this);
-        delete iDrawingCompleteTimer;
-        iDrawingCompleteTimer = NULL;
-        }
-    }
-
 void CControlEffectState::ConstructL(TInt aAction,
         RMemReadStream& aStream)
     {
--- a/uiacceltk/hitchcock/ServerCore/Src/alfhierarchymodel.cpp	Fri Apr 16 15:56:24 2010 +0300
+++ b/uiacceltk/hitchcock/ServerCore/Src/alfhierarchymodel.cpp	Mon May 03 13:22:43 2010 +0300
@@ -734,6 +734,14 @@
         case MWsWindowTreeNode::EWinTreeNodeClient:
             {
             node = CAlfNodeWindow::NewL( this, iStream, iScreenNumber );
+            
+            #ifdef __WINS__
+            if (++iDebug_CheckNodeTableItegrityCounter > 100) // Do not check too often as is can be slow
+                {
+                Debug_CheckNodeTableItegrity(_L("CAlfHierarchyModel::DoNodeCreatedL"));
+                }            
+            #endif
+            
             break;
             }
         case MWsWindowTreeNode::EWinTreeNodeRoot:
@@ -797,7 +805,12 @@
 
     AMT_INC_COUNTER_IF(node && (nodeType==MWsWindowTreeNode::EWinTreeNodeClient), iWindowNodeCount ); 
     AMT_INC_COUNTER_IF(node && (nodeType==MWsWindowTreeNode::EWinTreeNodeGroup),  iWindowGroupNodeCount ); 
-    AMT_INC_COUNTER_IF(node, iTotalNodeCount );         
+    AMT_INC_COUNTER_IF(node, iTotalNodeCount );
+    
+    AMT_MAP_INC_VALUE_IF( node && nodeType == MWsWindowTreeNode::EWinTreeNodeClient,
+                          iIntMap, node->iId, EAlfModuleTestTypeHierarchyModelCreateWindow );
+    AMT_MAP_INC_VALUE_IF( node && nodeType == MWsWindowTreeNode::EWinTreeNodeGroup,
+                          iIntMap, node->iId, EAlfModuleTestTypeHierarchyModelCreateWindowGroup );
     }
 
 // ---------------------------------------------------------------------------
@@ -830,7 +843,12 @@
 
     AMT_DEC_COUNTER_IF(node && (nodeType==MWsWindowTreeNode::EWinTreeNodeClient), iWindowNodeCount ); 
     AMT_DEC_COUNTER_IF(node && (nodeType==MWsWindowTreeNode::EWinTreeNodeGroup),  iWindowGroupNodeCount ); 
-    AMT_DEC_COUNTER_IF(node, iTotalNodeCount );     
+    AMT_DEC_COUNTER_IF(node, iTotalNodeCount );
+    
+    AMT_MAP_INC_VALUE_IF( node && nodeType == MWsWindowTreeNode::EWinTreeNodeClient,
+                          iIntMap, nodeId, EAlfModuleTestTypeHierarchyModelReleaseWindow );
+    AMT_MAP_INC_VALUE_IF( node && nodeType == MWsWindowTreeNode::EWinTreeNodeGroup,
+                          iIntMap, nodeId, EAlfModuleTestTypeHierarchyModelReleaseWindowGroup );
     }
 
 // ---------------------------------------------------------------------------
@@ -851,7 +869,11 @@
         USER_INVARIANT();
         }
     
-    AMT_INC_COUNTER_IF( node && (nodeType==MWsWindowTreeNode::EWinTreeNodeClient), iWindowNodeActivatedCount ); 
+    AMT_INC_COUNTER_IF( node && (nodeType==MWsWindowTreeNode::EWinTreeNodeClient), iWindowNodeActivatedCount );
+    
+    AMT_MAP_SET_VALUE_IF( node && nodeType == MWsWindowTreeNode::EWinTreeNodeClient,
+                          iBoolMap, nodeId, ETrue,
+                          EAlfModuleTestTypeHierarchyModelActiveWindow );    
     }
 
 // ---------------------------------------------------------------------------
@@ -884,12 +906,12 @@
 
     AMT_INC_COUNTER_IF(node, iNodeExtentChangedCount );
     AMT_SET_VALUE_IF(node, iLatestNodeExtentRect, rect );
-    AMT_MAP_SET_VALUE_IF( ( node && node->iWindow ),
+    AMT_MAP_SET_VALUE_IF( node && node->iWindow,
                           iSizeMap, node->iWindow->WsInfo().iClientSideId.iWindowIdentifer, 
-                          rect.Size(), EAlfModuleTestTypeHierarchyModelChangeSize );
-    AMT_MAP_SET_VALUE_IF( ( node && node->iWindow ),
+                          rect.Size(), EAlfModuleTestTypeHierarchyModelChangeWindowSize );
+    AMT_MAP_SET_VALUE_IF( node && node->iWindow,
                           iPositionMap, node->iWindow->WsInfo().iClientSideId.iWindowIdentifer, 
-                          rect.iTl, EAlfModuleTestTypeHierarchyModelChangePosition );
+                          rect.iTl, EAlfModuleTestTypeHierarchyModelChangeWindowPosition );
     }
 
 // ---------------------------------------------------------------------------
@@ -951,9 +973,11 @@
         }
 
     AMT_INC_COUNTER_IF(node, iTotalNodeFlagChangedCount );
-    AMT_MAP_INC_VALUE_IF( ( node && node->iWindow ),
-                          iIntMap, node->iWindow->WsInfo().iClientSideId.iWindowIdentifer, 
-                          EAlfModuleTestTypeHierarchyModelChangeFlag );    
+    AMT_MAP_SET_VALUE_IF( node && node->iWindow && MWsWindowTreeObserver::EVisible == flag,
+                          iBoolMap, 
+                          node->iWindow->WsInfo().iClientSideId.iWindowIdentifer,
+                          newValue,
+                          EAlfModuleTestTypeHierarchyModelChangeWindowVisibility ); 
     }
 
 // ---------------------------------------------------------------------------
@@ -1152,7 +1176,7 @@
         USER_INVARIANT(); // attribute change for unexpected node type. new code needed!
         }
 
-    AMT_INC_COUNTER_IF(node, iTotalNodeAttributeChangedCount );    
+    AMT_INC_COUNTER_IF(node, iTotalNodeAttributeChangedCount );
     }
     
 // ---------------------------------------------------------------------------
@@ -1271,5 +1295,35 @@
             }
         }
     }
+
+
+#ifdef __WINS__
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CAlfHierarchyModel::Debug_CheckNodeTableItegrity(const TDesC16& aContext)
+    {  
+    iDebug_CheckNodeTableItegrityCounter = 0;
     
+    // Loop through the all items     
+    TInt count = 0;
+    THashMapIter <TUint32,CNodeHashStruct> ptrHashSetIter(iNodeHashArray);
+    for ( ; ; )        
+        {        
+        const CNodeHashStruct* resNext = ptrHashSetIter.NextValue();        
+        if (!resNext)            
+            {             
+            break;            
+            }  
+        count++;
+        if (resNext->iNode->Type() == MWsWindowTreeNode::EWinTreeNodeClient)
+            {
+            resNext->iNode->Debug_CheckSiblingOrder(aContext);
+            }
+        }
+    }
+#endif
 
+
+
--- a/uiacceltk/hitchcock/ServerCore/Src/alfnodes.cpp	Fri Apr 16 15:56:24 2010 +0300
+++ b/uiacceltk/hitchcock/ServerCore/Src/alfnodes.cpp	Mon May 03 13:22:43 2010 +0300
@@ -1082,9 +1082,18 @@
                 //                           ^^^ 
                 // if iterNode gets to NULL, then we must have found both matches 
                 // - i.e. either the new or current/old position is the rightmost node   
-                ASSERT(oldPrevNode!=NULL && newPrevNode!=NULL); 
+                if (oldPrevNode == NULL || newPrevNode == NULL )
+                    {
+                    // Fatal error! Node tree is corrupted.
+                    __ALFLOGSTRING4("CAlfNode::SiblingOrderChanged(). Fatal error! Node tree is corrupted. oldPrevNode=0x%x, newPrevNode=0x%x, iterNodePosition=%d, aNewPos=%d", 
+                            oldPrevNode, newPrevNode, iterNodePosition, aNewPos);                    
+                    __ALFLOGSTRING4("CAlfNode::SiblingOrderChanged(). This node=0x%x, type = %d, parent node=0x%x, parent type=%d", this, Type(), iParent, iParent->Type());
+                    __ALFLOGSTRING2("CAlfNode::SiblingOrderChanged(). This node id=0x%x, parent node id=0x%x", iId, iParent->iId);
+                    __ASSERT_ALWAYS(EFalse, USER_INVARIANT());    
+                    //__ASSERT_DEBUG(EFalse, USER_INVARIANT()); 
+                    return;  
+                    }
                 } 
-
             ASSERT(iterPrevNode!=NULL);                 
         } // end while loop 
 
@@ -1720,6 +1729,8 @@
     ResolveParent( iNodeWindowConstructionStruct.iParentId, iId );
     CreateWindowL( iNodeWindowConstructionStruct.iWindowGroupHandle, iNodeWindowConstructionStruct.iWindowHandle, iNodeWindowConstructionStruct.iParentId );
     UpdateOrdinalPosition();
+    
+    AMT_MAP_STREAMER_NODE_WINDOW_CONSTRUCT();
 	}
 
 // ---------------------------------------------------------------------------
@@ -1900,6 +1911,8 @@
             iGroupId, 
             iId, 
             (TAny*)offset );
+    
+    AMT_MAP_STREAMER_NODE_GROUP_CONSTRUCT();
 	}
 
 // ---------------------------------------------------------------------------
@@ -2133,6 +2146,8 @@
             (TAny*)offset );
     
     UpdateOrdinalPosition();
+    
+    AMT_MAP_STREAMER_TEXT_CURSOR_CONSTRUCT();
     }
 
 // ---------------------------------------------------------------------------
@@ -2151,6 +2166,8 @@
 
 void CAlfNodeTextCursor::AttributeChangedL( RMemReadStream* aStream )
     {
+    AMT_MAP_BRIDGE_ADD_TEXT_CURSOR();
+    
     // TODO: PASS FORWARD!!!
     TInt attribute = aStream->ReadInt32L();
     switch ( attribute )
@@ -2189,6 +2206,8 @@
                iGroupId, 
                iId, 
                (TAny*)offset );
+       
+   AMT_MAP_STREAMER_TEXT_CURSOR_CHANGE();
     }
 CAlfNodeTextCursor::~CAlfNodeTextCursor( )
     {
@@ -2204,5 +2223,50 @@
         }
     }
 
+#ifdef __WINS__
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+void CAlfNode::Debug_CheckSiblingOrder(const TDesC16& aContext)
+   {
+   if (!iParent || Type() != MWsWindowTreeNode::EWinTreeNodeClient)
+       {
+       return;
+       }
+   
+   TBool foundMyself = EFalse;
+   TInt iterNodePosition = 0; 
+   
+   // Search for myselk in iParent sibling list
+   for(CAlfNode* iterNode = iParent->iChild; iterNode != NULL; iterNode = iterNode->iSibling, iterNodePosition++)
+       {
+       if (iterNode == this) 
+           {
+           foundMyself = ETrue;
+           }  
+       }
+   
+   if(!foundMyself)
+       {
+       // Did not find myself from the parent sibling list ==> error!
+       __ALFLOGSTRING2("CAlfNode::Test_CheckSiblingOrder(). Fatal error! Node tree is corrupted.  at %S: iId=0x%x", &aContext, iId );                    
+       __ALFLOGSTRING3("CAlfNode::Test_CheckSiblingOrder(). iterNodePosition=%d, iChild=0x%x, iSibling=0x%x", iterNodePosition, iChild, iSibling );                    
+       __ALFLOGSTRING3("CAlfNode::Test_CheckSiblingOrder(). iSpriteChild=0x%x, iAnimChild=0x%x, iTextCursor=0x%x", iSpriteChild, iAnimChild, iTextCursor );                    
+       __ALFLOGSTRING4("CAlfNode::Test_CheckSiblingOrder(). This node=0x%x, type = %d, parent node=0x%x, parent type=%d", this, Type(), iParent, iParent->Type());
+       // Print sibling list
+       iterNodePosition=0;     
+       __ALFLOGSTRING("CAlfNode::Test_CheckSiblingOrder(). SIBLINGS:");
+       for(CAlfNode* iterNode2 = iParent->iChild; iterNode2!=NULL; iterNode2 = iterNode2->iSibling, iterNodePosition++)
+           {
+           __ALFLOGSTRING4("CAlfNode::Test_CheckSiblingOrder(). *** iterNodePosition=%d, id=%d, this=0x%x, iChild=0x%x", iterNodePosition, iterNode2->iId, iterNode2, iterNode2->iChild );                    
+           __ALFLOGSTRING3("CAlfNode::Test_CheckSiblingOrder(). iSpriteChild=0x%x, iAnimChild=0x%x, iTextCursor=0x%x", iterNode2->iSpriteChild, iterNode2->iAnimChild, iterNode2->iTextCursor );                    
+           }                 
+       
+       __ASSERT_ALWAYS(EFalse, USER_INVARIANT());   
+       }
+   }
+#endif
+
 // end of file
 
--- a/uiacceltk/hitchcock/ServerCore/Src/alfsrvdisplaysubsession.cpp	Fri Apr 16 15:56:24 2010 +0300
+++ b/uiacceltk/hitchcock/ServerCore/Src/alfsrvdisplaysubsession.cpp	Mon May 03 13:22:43 2010 +0300
@@ -234,7 +234,16 @@
     	#endif
         }
         
-   
+    // if this is a last displaysubsession remove "alfnative client wg" tag from bridge
+     RPointerArray<CAlfSrvSubSessionBase> displays;
+     CleanupClosePushL( displays );
+     Session().GetSubsessionsByTypeL( displays, EHuiObjectTypeDisplay );
+
+     if( displays.Count() == 0 )
+         {
+         Session().AlfAppUi()->RemoveAlfAppWindowGroup(Session().ClientWindowGroup());
+         }
+     CleanupStack::PopAndDestroy( &displays ); // displays.Close()
     }
 
 // ---------------------------------------------------------------------------
--- a/uiacceltk/hitchcock/ServerCore/Src/alfstreamerbridge.cpp	Fri Apr 16 15:56:24 2010 +0300
+++ b/uiacceltk/hitchcock/ServerCore/Src/alfstreamerbridge.cpp	Mon May 03 13:22:43 2010 +0300
@@ -21,6 +21,7 @@
 #include <coemain.h>
 #include "alfstreamerbridge.h"
 #include "alfstreamerserver.h"
+#include "alfbridge.h"
 #include "alflogger.h"
 
 #ifdef ALF_DEBUG_TRACK_DRAWING
@@ -28,7 +29,8 @@
 #endif
 
 
-// #define EGL_TALKS_TO_WINDOW_SERVER
+// From MMP macro nowadays
+//#define ALF_DRAW_FRAME_BEFORE_END_CALLBACK    
 
 // ---------------------------------------------------------------------------
 // constructor
@@ -83,7 +85,6 @@
 #ifdef ALF_DEBUG_TRACK_DRAWING
     iCommandDebugger = CAlfCommandDebug::NewL();
 #endif
-    CHuiEnv::Static()->iSwapObserver = this;
     }
 
 // ---------------------------------------------------------------------------
@@ -93,7 +94,6 @@
 // 
 CAlfStreamerBridge::~CAlfStreamerBridge()
     {
-    CHuiEnv::Static()->iSwapObserver = 0;
     iDataBuf.Close();
     iQueueSema.Close();
 #ifdef ALF_DEBUG_TRACK_DRAWING
@@ -173,21 +173,14 @@
 // 
 TInt CAlfStreamerBridge::AddData( TAlfDecoderServerBindings aOp,TInt aI1,TInt aI2 ,TAny* aPtr )
     {
-    if (iSwapActive && aOp == EAlfRequestCommitBatch)
-        {
-        __ALFLOGSTRING("CAlfStreamerBridge::AddData() just release window server");    
-        iBatchObserver->BridgerCallback(KRELEASEWINDOWSERVER,KRELEASEDBEFOREQUEUE);
-        return KErrNone;
-        }
-    
     TInt err = KErrNotFound;
         {    
 #ifdef ALF_DEBUG_TRACK_DRAWING    
         iCommandDebugger->SetDescription( aOp, R_ALF_BRIDGE_COMMAND_DESCRIPTION_ARRAY );
         __ALFLOGSTRING2("CAlfStreamerBridge::AddData op %S, iQueue.Length = %d", &iCommandDebugger->Text(), iQueue.Count());
-    #else
+#else
         __ALFLOGSTRING2("CAlfStreamerBridge::AddData op %d, iQueue.Length = %d", aOp, iQueue.Count());    
-    #endif
+#endif
         err = KErrNone;
         for(TInt i = 0; i < iMessages.Count(); i++ )
             {
@@ -229,56 +222,6 @@
     return data;    
     }
 
-void CAlfStreamerBridge::PrepareSwap()
-    {
-#ifdef EGL_TALKS_TO_WINDOW_SERVER
-    __ALFLOGSTRING("CAlfStreamerBridge:: Prepare swap, flush the queue");    
-    iSwapActive = ETrue;
-    if (iStatus.Int() >=0 && iMessages.Count() > iStatus.Int() )
-        {
-        Cancel(); // remove from scheduler
-        RunL(); // run manually (and activate)
-        }
-    __ALFLOGSTRING("CAlfStreamerBridge:: Prepare swap, the queue emptied");    
-#endif //#ifdef EGL_TALKS_TO_WINDOW_SERVER
-    }
-
-void CAlfStreamerBridge::SwapComplete()
-    {
-#ifdef EGL_TALKS_TO_WINDOW_SERVER
-    __ALFLOGSTRING("CAlfStreamerBridge:: Swap buffers complete");    
-    iSwapActive = EFalse;
-#endif // #ifdef EGL_TALKS_TO_WINDOW_SERVER
-
-    }
-	
-#ifdef EGL_TALKS_TO_WINDOW_SERVER
-void CAlfStreamerBridge::ReleaseWindowServer(TBool aRelease)
-    {
-    __ALFLOGSTRING1("CAlfStreamerBridge::ReleaseWindowServer: %d",aRelease);    
-    if (aRelease)
-        {
-        iMakeCurrentActive = ETrue;    
-        if (iBatchObserver && !iSwapActive)    
-            {
-            iBatchObserver->BridgerCallback(KRELEASEWINDOWSERVER);
-            }
-        }
-    else
-        {
-        iMakeCurrentActive = EFalse;
-        }                
-#else
-void CAlfStreamerBridge::ReleaseWindowServer(TBool)
-	{
-#endif
-    }
-
-void CAlfStreamerBridge::SetWgIdArray(TInt* aArray)
-    {
-    iWgArray = aArray;
-    }
-
 EXPORT_C TUid CAlfStreamerBridge::FindAppUidForWgId(TInt /*aWgId*/)
     {
     __ASSERT_DEBUG(EFalse, User::Leave(KErrNotSupported));
@@ -308,8 +251,16 @@
 #endif
     switch ( operation )
         {
-        // Just call back to Alf decoder thread
         case EAlfRequestCommitBatch:
+#ifdef ALF_DRAW_FRAME_BEFORE_END_CALLBACK    
+            {
+            CAlfBridge* bridge = dynamic_cast<CAlfBridge*>(iObserver);
+            if (bridge)
+                {
+                bridge->iHuiEnv->RefreshCallBack((TAny*)bridge->iHuiEnv);
+                }
+            } // fall through
+#endif
         case EAlfRequestCommandReadNotification:
         case EAlfReleaseTemporaryChunk:
             {
@@ -324,6 +275,7 @@
             {
             // Handle command
             __ALFLOGSTRING("CAlfStreamerBridge:: calling observer callback");
+            __ASSERT_ALWAYS(iObserver, User::Invariant());
             iObserver->HandleCallback(iStatus.Int());
             
             // For "getters" also call back to Alf decoder thread
@@ -353,6 +305,15 @@
     switch ( operation2 )
             {
             case EAlfRequestCommitBatch:
+#ifdef ALF_DRAW_FRAME_BEFORE_END_CALLBACK    
+            {
+            CAlfBridge* bridge = dynamic_cast<CAlfBridge*>(iObserver);
+            if (bridge)
+                {
+                bridge->iHuiEnv->RefreshCallBack((TAny*)bridge->iHuiEnv);
+                }
+            } // fall through
+#endif
             case EAlfRequestCommandReadNotification:
             case EAlfReleaseTemporaryChunk:
                 {
@@ -368,6 +329,7 @@
                 {
 	            // Handle command
                 __ALFLOGSTRING("CAlfStreamerBridge:: calling observer callback");
+                __ASSERT_ALWAYS(iObserver, User::Invariant());
 	            iObserver->HandleCallback(iQueue[0]);
 	            
 	            // For "getters" also call back to Alf decoder thread
@@ -416,13 +378,7 @@
     {
     // Queue marker. Basically we could use one new member to assert that there can
     // be only one marker
-    __ALFLOGSTRING1("CAlfStreamerBridge:: Request command read notification, swap active: %d", iSwapActive );    
-   if ( iSwapActive || iMakeCurrentActive )
-        {
-        __ALFLOGSTRING("CAlfStreamerBridge::StartNewBlock() just release window server");    
-        iBatchObserver->BridgerCallback(KRELEASEWINDOWSERVER,KRELEASEDBEFOREQUEUE);
-        return;
-        }
+    //__ALFLOGSTRING1("CAlfStreamerBridge:: Request command read notification, swap active: %d", iSwapActive );    
     AddData(EAlfRequestCommitBatch,0,0,0);
     }
 
@@ -503,21 +459,3 @@
     {
     return GetVarDataL(aIndex);
     }
-
-// ---------------------------------------------------------------------------
-// SetStreamerServer
-// ---------------------------------------------------------------------------
-// 
-void CAlfStreamerBridge::SetStreamerServer( CAlfStreamerServer& aStreamerServer )
-    {
-    iStreamerServer = &aStreamerServer;   
-    }
-
-// ---------------------------------------------------------------------------
-// StreamerServer
-// ---------------------------------------------------------------------------
-// 
-CAlfStreamerServer* CAlfStreamerBridge::StreamerServer()
-    {
-    return iStreamerServer;
-    }
--- a/uiacceltk/hitchcock/ServerCore/Src/alfstreamerserver.cpp	Fri Apr 16 15:56:24 2010 +0300
+++ b/uiacceltk/hitchcock/ServerCore/Src/alfstreamerserver.cpp	Mon May 03 13:22:43 2010 +0300
@@ -149,7 +149,6 @@
     
     iWindowHierarcy = CAlfHierarchyModel::NewL(*this);
     iWindowMgr = CAlfWindowManager::NewL(iWindowHierarcy);
-    iBridge->SetStreamerServer( *this );
     iThemesListener = CThemeRepositoryListener::NewL();
     iThemesListener->IssueRequest();
     iRendezvous = new (ELeave) CAsyncCallBack(EPriorityHigh*3);
@@ -199,6 +198,16 @@
         {
         WindowMgr()->HandleClientExit(aClient->ThreadId());
         }
+        
+    for (TInt i = iSignals.Count()-1; i >= 0 ; i--)
+        {
+        if (iSignals[i].iSession == aClient)
+            {
+            // Don't complete because client is already being deleted    
+            iSignals.Remove(i);
+            }         
+        }
+                
     if (!iSessions)
         {
         // CActiveScheduler::Stop(); // TODO: lets not die, if client dies.
@@ -692,6 +701,28 @@
    __ALFLOGSTRING("CAlfStreamerServer::GetListOfWGsHavingInactiveSurfacesL <<")
     }
 
+void CAlfStreamerServer::AddSignal(CAlfStreamerServerSession* aSession, const RMessage2& aMessage)
+    {
+    TAlfSignal signal = { aSession, aMessage, aMessage.Int0(), aMessage.Int1()};
+    if (iSignals.Append(signal))
+        {
+        aMessage.Complete(KErrNoMemory);
+        }    
+    }    
+    
+void CAlfStreamerServer::CompleteSignal(TInt aSignal, TInt aType)
+    {
+    for (TInt i = iSignals.Count()-1; i >= 0 ; i--)
+        {
+        if (iSignals[i].iHandle == aSignal && (iSignals[i].iFlags & aType))
+            {
+            iSignals[i].iMessage.Complete(iSignals[i].iHandle);
+            iSignals.Remove(i);
+            //break;
+            }       
+        }  
+    }    
+
 // ---------------------------------------------------------------------------
 // constructor
 // ---------------------------------------------------------------------------
@@ -846,7 +877,7 @@
             } 
         case EAlfGetNativeWindowHandles:
             {
-            TPckgC<TAlfNativeWindowData> data(server->Bridge()->iAlfWindowData);
+            TPckgC<volatile TAlfNativeWindowData> data(server->Bridge()->iAlfWindowData);
             aMessage.WriteL(0, data);
             break;    
             }
@@ -907,7 +938,7 @@
             }
         case EAlfGetListOfWGsHavingInactiveSurfaces:
             {
-            server->GetListOfWGsHavingInactiveSurfacesL(aMessage, EFalse);
+            server->GetListOfWGsHavingInactiveSurfacesL(aMessage, aMessage.Int1());
             break;    
             }
         
@@ -930,8 +961,24 @@
                 }
             break;    
             }
-            
-            
+        case EAlfGetNumberOfActiveEffects:
+            {
+            if (server->Bridge()) // though always there
+                {    
+                aMessage.Complete(server->Bridge()->iActiveEffectCount);
+                }
+            break;    
+            }
+        case EAlfRequestSignal:
+            {
+            server->AddSignal(this, aMessage);    
+            return;
+            }
+        case EAlfCompleteSignal:
+            {
+            server->CompleteSignal(aMessage.Int0(), aMessage.Int1());    
+            break;    
+            }                   
         default:
             {
             aMessage.Complete(KErrNotSupported);
--- a/uiacceltk/hitchcock/backgroundanim/inc/bganimhost.h	Fri Apr 16 15:56:24 2010 +0300
+++ b/uiacceltk/hitchcock/backgroundanim/inc/bganimhost.h	Mon May 03 13:22:43 2010 +0300
@@ -111,4 +111,5 @@
         RAknsSrvSession iSkinSrv;
         HBufC* iCurrentPluginDllName;
         HBufC* iCurrentPluginAssetDir;
+        TBool iIsUIReady;
     };
--- a/uiacceltk/hitchcock/backgroundanim/src/bganimhost.cpp	Fri Apr 16 15:56:24 2010 +0300
+++ b/uiacceltk/hitchcock/backgroundanim/src/bganimhost.cpp	Mon May 03 13:22:43 2010 +0300
@@ -21,7 +21,7 @@
 #include <AknsItemDef.h>
 
 #include "bganimhost.h"
-
+#include <platform/ssm/startupdomainpskeys.h>
 
 typedef void* (*plugingetinterfacefunc)(int);
 
@@ -31,7 +31,7 @@
 static const TUint KMaxGPUMemUsage = 1024*1024*4;
 
 
-CBgAnimHost::CBgAnimHost() 
+CBgAnimHost::CBgAnimHost():iIsUIReady(EFalse) 
     {
     }
     
@@ -516,6 +516,19 @@
         {
         return;
         }
+    if (!iIsUIReady)
+        {
+        TInt lValOfNoUse;
+        TInt  err = RProperty::Get( KPSUidStartup,
+                                     KPSStartupUiPhase,
+                                     lValOfNoUse);
+        if (err == KErrNotFound)
+            {
+            iTimer->CallBack(500);
+            return;
+            }
+        }
+    iIsUIReady = ETrue;
     TTime start;
     start.UniversalTime();
     iPlugin->produceframe();
--- a/uiacceltk/hitchcock/coretoolkit/BWINS/hitchcocku.DEF	Fri Apr 16 15:56:24 2010 +0300
+++ b/uiacceltk/hitchcock/coretoolkit/BWINS/hitchcocku.DEF	Mon May 03 13:22:43 2010 +0300
@@ -1390,7 +1390,7 @@
 	??1CHuiFxEngine@@UAE@XZ @ 1389 NONAME ; CHuiFxEngine::~CHuiFxEngine(void)
 	?RegisterParameterL@CHuiFxVisualLayer@@IAEXABVTDesC16@@PAM@Z @ 1390 NONAME ; void CHuiFxVisualLayer::RegisterParameterL(class TDesC16 const &, float *)
 	?NewL@CHuiFxEffect@@SAPAV1@AAVCHuiFxEngine@@@Z @ 1391 NONAME ; class CHuiFxEffect * CHuiFxEffect::NewL(class CHuiFxEngine &)
-	?ConstructL@CHuiFxVisualLayer@@IAEXAAVMHuiEffectable@@@Z @ 1392 NONAME ; void CHuiFxVisualLayer::ConstructL(class CHuiVisual &)
+	?ConstructL@CHuiFxVisualLayer@@IAEXPAVMHuiEffectable@@@Z @ 1392 NONAME ; void CHuiFxVisualLayer::ConstructL(class MHuiEffectable *)
 	?Draw@CHuiFxEffect@@QAEHAAVCHuiGc@@ABVTRect@@@Z @ 1393 NONAME ; int CHuiFxEffect::Draw(class CHuiGc &, class TRect const &)
 	?TargetRect@CHuiFxLayer@@QBEABVTRect@@XZ @ 1394 NONAME ; class TRect const & CHuiFxLayer::TargetRect(void) const
 	?AdvanceTime@CHuiFxVisualLayer@@UAEXM@Z @ 1395 NONAME ; void CHuiFxVisualLayer::AdvanceTime(float)
@@ -1428,7 +1428,7 @@
 	?AdvanceTime@CHuiFxLayer@@UAEXM@Z @ 1427 NONAME ; void CHuiFxLayer::AdvanceTime(float)
 	?SetEffectEndObserver@CHuiFxEffect@@QAEXPAVMAlfGfxEffectObserver@@H@Z @ 1428 NONAME ; void CHuiFxEffect::SetEffectEndObserver(class MAlfGfxEffectObserver *, int)
 	?BufferType@CHuiFxRenderbuffer@@QBEABW4TRenderBufferType@@XZ @ 1429 NONAME ; enum TRenderBufferType const & CHuiFxRenderbuffer::BufferType(void) const
-	?NewL@CHuiFxVisualLayer@@SAPAV1@AAVMHuiEffectable@@@Z @ 1430 NONAME ; class CHuiFxVisualLayer * CHuiFxVisualLayer::NewL(class CHuiVisual &)
+	?NewL@CHuiFxVisualLayer@@SAPAV1@PAVMHuiEffectable@@@Z @ 1430 NONAME ; class CHuiFxVisualLayer * CHuiFxVisualLayer::NewL(class MHuiEffectable *)
 	?RegisterParameterL@CHuiFxVisualLayer@@IAEXABVTDesC16@@PAVTRgb@@@Z @ 1431 NONAME ; void CHuiFxVisualLayer::RegisterParameterL(class TDesC16 const &, class TRgb *)
 	?SetVisualRect@CHuiFxLayer@@QAEXABVTRect@@@Z @ 1432 NONAME ; void CHuiFxLayer::SetVisualRect(class TRect const &)
 	?SetVisualRect@CHuiFxFilter@@QAEXABVTRect@@@Z @ 1433 NONAME ; void CHuiFxFilter::SetVisualRect(class TRect const &)
@@ -1595,4 +1595,6 @@
 	?SecureId@CHuiControlGroup@@QAEHXZ @ 1594 NONAME ; int CHuiControlGroup::SecureId(void)
 	?SetSecureId@CHuiControlGroup@@QAEXH@Z @ 1595 NONAME ; void CHuiControlGroup::SetSecureId(int)
 	?HasTransParentClear@CHuiCanvasVisual@@QBEHXZ @ 1596 NONAME ; int CHuiCanvasVisual::HasTransParentClear(void) const
+	?AddEffectToGroup@CHuiFxEngine@@QAEHH@Z @ 1597 NONAME ; int CHuiFxEngine::AddEffectToGroup(int)
+	?FxmlUsesOpaqueHint@CHuiFxEngine@@QAEHABVTDesC16@@@Z @ 1598 NONAME ; int CHuiFxEngine::FxmlUsesOpaqueHint(class TDesC16 const &)
 
--- a/uiacceltk/hitchcock/coretoolkit/eabi/hitchcocku.DEF	Fri Apr 16 15:56:24 2010 +0300
+++ b/uiacceltk/hitchcock/coretoolkit/eabi/hitchcocku.DEF	Mon May 03 13:22:43 2010 +0300
@@ -1785,14 +1785,14 @@
 	_ZN17CHuiFxFilterLayer11AdvanceTimeEf @ 1784 NONAME
 	_ZN17CHuiFxFilterLayer12PrepareDrawLER12CHuiFxEngine @ 1785 NONAME
 	_ZN17CHuiFxFilterLayer4DrawER12CHuiFxEngineR6CHuiGcR18CHuiFxRenderbufferS5_ @ 1786 NONAME
-	_ZN17CHuiFxVisualLayer10ConstructLER14MHuiEffectable @ 1787 NONAME
+	_ZN17CHuiFxVisualLayer10ConstructLEP14MHuiEffectable @ 1787 NONAME
 	_ZN17CHuiFxVisualLayer10VisualAreaER5TRect @ 1788 NONAME
 	_ZN17CHuiFxVisualLayer11AdvanceTimeEf @ 1789 NONAME
 	_ZN17CHuiFxVisualLayer12PrepareDrawLER12CHuiFxEngine @ 1790 NONAME
 	_ZN17CHuiFxVisualLayer18RegisterParameterLERK7TDesC16P4TRgb @ 1791 NONAME
 	_ZN17CHuiFxVisualLayer18RegisterParameterLERK7TDesC16Pf @ 1792 NONAME
 	_ZN17CHuiFxVisualLayer4DrawER12CHuiFxEngineR6CHuiGcR18CHuiFxRenderbufferS5_ @ 1793 NONAME
-	_ZN17CHuiFxVisualLayer4NewLER14MHuiEffectable @ 1794 NONAME
+	_ZN17CHuiFxVisualLayer4NewLEP14MHuiEffectable @ 1794 NONAME
 	_ZN17CHuiFxVisualLayer9ParameterERK7TDesC16 @ 1795 NONAME
 	_ZN17CHuiFxVisualLayerD0Ev @ 1796 NONAME
 	_ZN17CHuiFxVisualLayerD1Ev @ 1797 NONAME
@@ -1996,4 +1996,6 @@
 	_ZN16CHuiControlGroup11SetSecureIdEi @ 1995 NONAME
 	_ZN16CHuiControlGroup8SecureIdEv @ 1996 NONAME
 	_ZNK16CHuiCanvasVisual19HasTransParentClearEv @ 1997 NONAME
+	_ZN12CHuiFxEngine16AddEffectToGroupEi @ 1998 NONAME
+	_ZN12CHuiFxEngine18FxmlUsesOpaqueHintERK7TDesC16 @ 1999 NONAME
 
--- a/uiacceltk/hitchcock/coretoolkit/inc/HuiFxConstants.h	Fri Apr 16 15:56:24 2010 +0300
+++ b/uiacceltk/hitchcock/coretoolkit/inc/HuiFxConstants.h	Mon May 03 13:22:43 2010 +0300
@@ -94,7 +94,7 @@
 
 // parameter for visual
 _LIT(KLitSrc, "src" ); // source for the effect
-
+_LIT(KLitOpaque, "opaque");
 _LIT(KLitBlending, "blending" );
 _LIT(KLitParam, "param" );
 _LIT(KLitReplace, "replace" );
@@ -129,6 +129,8 @@
 _LIT(KLitAccelerate, "accelerate");
 _LIT(KLitImpulse, "impulse");
 */
+_LIT(KLitTrue,"true");
+_LIT(KLitFalse,"false");
 _LIT(KLitAt, "at" );
 _LIT(KLitMarker, "marker" );
 _LIT(KLitLoopStart, "loop_start" );
--- a/uiacceltk/hitchcock/coretoolkit/inc/HuiFxEffect.h	Fri Apr 16 15:56:24 2010 +0300
+++ b/uiacceltk/hitchcock/coretoolkit/inc/HuiFxEffect.h	Mon May 03 13:22:43 2010 +0300
@@ -40,7 +40,10 @@
 /** Effect is not applied to children visuals. */
 const TInt KHuiFxEffectExcludeChildrenFlag = 0x4;
 
-/** Effect is grouped and syncronized with other effect(s)*/
+/** Effect is grouped and syncronized with other effect(s)
+ * 
+ *  Indicates that the EndGroup event has not yet been received.
+ */
 const TInt KHuiFxWaitGroupSyncronization = 0x8;
 
 /** Effect duration is started after it has first time been drawn. */
@@ -61,6 +64,16 @@
 /** Background pixels are not read for every frame (only once in a while), thus background content looks frozen if it is visible. */
 const TInt KHuiFxFrozenBackground = 0x200;
 
+/** 
+ * EndGroup request has been received, but this effect has not yet drawn itself.
+ */
+const TInt KHuiFxWaitGroupToStartSyncronized = 0x400;
+
+/** EndGroup request has been received and this effect has drawn itself once and it is
+ *  now waiting for the others in the group to be drawn.
+ */
+const TInt KHuiFxReadyAndWaitingGroupToStartSyncronized = 0x800;
+
 class MAlfGfxEffectObserver
     {
     public:
@@ -98,6 +111,9 @@
     IMPORT_C void SetEngine( CHuiFxEngine *aEngine );
 
     IMPORT_C void SetEffectFlags( TInt aFlags );
+    void SetEffectFlag( TInt aFlag );
+    void ClearEffectFlag( TInt aFlag );
+    
     IMPORT_C void SetEffectGroup(TInt aGroupId);
     IMPORT_C TInt EffectFlags();
     IMPORT_C TInt GroupId();
@@ -137,6 +153,13 @@
     TBool CachedDraw(CHuiGc& aGc, const TRect& aDisplayRect, TBool aRefreshCachedRenderTarget, TBool aOpaque);
 
     void FxmlVisualInputs(RArray<THuiFxVisualSrcType> &aArray);
+    
+	TBool FxmlUsesOpaqueHint() const;
+	
+    TInt Handle() const
+        {
+        return iHandle;    
+        }
 private:
 
     TBool IsAppliedToBackground();
@@ -167,6 +190,8 @@
     TInt iGroupId;
 	
     TInt iFramesDrawn;
+    TReal32 iElapsedTime;
+    TBool iNotifiedEffectReady;
     };
 
 #endif /*HUIFXEFFECT_H_*/
--- a/uiacceltk/hitchcock/coretoolkit/inc/HuiFxEffectCache.h	Fri Apr 16 15:56:24 2010 +0300
+++ b/uiacceltk/hitchcock/coretoolkit/inc/HuiFxEffectCache.h	Mon May 03 13:22:43 2010 +0300
@@ -40,6 +40,8 @@
     virtual void ParsingEndedBefore()=0;
     virtual void ParsingEndedAfter(MHuiFxEffectCacheNode *aCached)=0;
     virtual TBool FxmlUsesInput1()=0;
+    virtual TBool FxmlUsesOpaqueHint() const=0;
+
     virtual void Delete()=0;
 };
 
@@ -53,8 +55,9 @@
     IMPORT_C void UnUse(MHuiFxEffectCacheNode *aNode);
     IMPORT_C ~CHuiFxEffectCache();
     void ParsingEnded(TInt aHandle);
-    MHuiFxEffectCacheNode *FindCached(const TDesC &aId);
+    MHuiFxEffectCacheNode *FindCached(const TDesC &aId) const;
     TBool FxmlUsesInput1(const TDesC &aFileName);
+    TBool FxmlUsesOpaqueHint(const TDesC &aFileName) const;
 private:
     struct IDNode
         {
@@ -88,7 +91,7 @@
 {
 public:
      CHuiFxEffectCacheEffectNode(const TDesC &aFileName, CHuiFxEffect *&aEffect, MHuiEffectable *aVisual, TRect *extRect, CHuiFxEngine *aEngine) 
-	: iFileName(aFileName.AllocL()), iEffect(aEffect), iVisual(aVisual), iExtRect(extRect), iEffectCached(0), iEngine(aEngine), iRefCount(0), iParser(0) { }
+	: iFileName(aFileName.AllocL()), iEffect(aEffect), iVisual(aVisual), iExtRect(extRect), iEffectCached(0), iEngine(aEngine), iRefCount(0), iParser(0), iGroup(KErrNotFound) { }
      IMPORT_C ~CHuiFxEffectCacheEffectNode();
      void SetEffectEndObserver( MAlfGfxEffectObserver* aEffectEndObserver, TInt aHandle );
      void SetEffectFlags( TInt aFlags );
@@ -104,6 +107,7 @@
      void ParsingEndedBefore();
      void ParsingEndedAfter(MHuiFxEffectCacheNode *aCached);
      TBool FxmlUsesInput1();
+     TBool FxmlUsesOpaqueHint() const;
      void Delete();
 
 private:
--- a/uiacceltk/hitchcock/coretoolkit/inc/HuiFxEffectParser.h	Fri Apr 16 15:56:24 2010 +0300
+++ b/uiacceltk/hitchcock/coretoolkit/inc/HuiFxEffectParser.h	Mon May 03 13:22:43 2010 +0300
@@ -92,6 +92,7 @@
     THuiFxFilterType GetFilterTypeL( CMDXMLNode* aNode );
     THuiFxReferencePoint GetReferencePointL( CMDXMLNode* aNode, TReal32& aRefValue, TBool& aNeedRefValue );
     THuiFxVisualSrcType GetSrcTypeL( CMDXMLNode* aNode, TPtrC16& aBitmap );
+    TBool GetOpaqueHintL( CMDXMLNode *aNode );
     TReal32 ParseFloatValueL(CMDXMLNode* aNode);
     TRgb ParseColorValueL(CMDXMLNode* aNode);
     TReal32 ParseFloatAttributeL(CMDXMLNode* aNode, const TDesC& aName, TBool aMustExist = ETrue);
--- a/uiacceltk/hitchcock/coretoolkit/inc/HuiFxEngine.h	Fri Apr 16 15:56:24 2010 +0300
+++ b/uiacceltk/hitchcock/coretoolkit/inc/HuiFxEngine.h	Mon May 03 13:22:43 2010 +0300
@@ -39,6 +39,13 @@
 class MAlfGfxEffectObserver;
 class CHuiGc;
 
+class MHuiEffectObserver
+    {
+    public:
+    virtual void EffectAdded(CHuiFxEffect* aEffect) = 0;
+    virtual void EffectComplete(CHuiFxEffect* aEffect) = 0;
+    };
+
 class CHuiFxEngine : public CBase, public MHuiLowMemoryObserver, public MHuiMemoryLevelObserver
     {
     // important constant! Affects memory fragmentation in backend too small 
@@ -107,7 +114,7 @@
             TInt aFlags = 0 );
     
     IMPORT_C TBool FxmlUsesInput1(const TDesC &aFileName);
-
+    IMPORT_C TBool FxmlUsesOpaqueHint(const TDesC &aFileName);
     
     IMPORT_C void AdvanceTime(TReal32 aElapsedTime);
     
@@ -126,10 +133,10 @@
 	 * time.
 	 */
 	IMPORT_C void BeginGroupEffect(TInt aGroup);
-
     
     IMPORT_C TInt ActiveGroupEffect();
     
+    IMPORT_C TBool AddEffectToGroup(TInt aGroup);
     /*
 	 * StartGroupEffect
 	 *
@@ -140,6 +147,7 @@
     TInt LowMemoryState();
     
     TBool HasActiveEffects() const;
+    TBool HasActiveFadeEffect() const;
     
     void ClearCache();
     
@@ -147,6 +155,19 @@
     
     IMPORT_C void SetMemoryLevel(THuiMemoryLevel aLevel);
     
+    void SetObserver(MHuiEffectObserver* aObserver)
+        {
+        iEffectObserver = aObserver;    
+        }
+	
+	/**
+	 * Group effects wait until each effect has been drawn once. 
+	 *
+	 * Group effects are set into motion by NotifyEffectReady, when all effects in
+	 * the group have been drawn at least once.
+	 */
+    void NotifyEffectReady(TInt aGroupId);
+    
 protected:
     IMPORT_C void AddEffectL(CHuiFxEffect* aEffect);
     IMPORT_C void RemoveEffect(CHuiFxEffect* aEffect);
@@ -157,6 +178,7 @@
 private:
     
     TBool FxmlUsesInput1(CHuiFxEffect& aEffect);
+    TInt FindEffectGroup(TInt aGroup);
     
 private:
     // Render buffer management --- native implementations
@@ -189,7 +211,24 @@
     TRect                        iExtRect;
     CHuiFxEffectCache *iCache;
     TInt iLowGraphicsMemoryMode;
-    RArray<TInt> iActiveEffectGroups;
+    
+    NONSHARABLE_STRUCT(TEffectGroupStruct)
+        {
+    public:
+            
+        TEffectGroupStruct(TInt aGroup) : iGroup(aGroup), iWaiting(0), iEndCalled(EFalse){};
+
+        TInt iGroup;
+        TInt iWaiting;
+        TBool iEndCalled;
+        };
+    
+	/**
+	 * Only one simultanious effect group is supported
+	 */
+    RArray<TEffectGroupStruct> iActiveEffectGroups;
+    
+    MHuiEffectObserver* iEffectObserver;
     };
 
 #endif /*HUIFXENGINE_H_*/
--- a/uiacceltk/hitchcock/coretoolkit/inc/HuiFxGroupLayer.h	Fri Apr 16 15:56:24 2010 +0300
+++ b/uiacceltk/hitchcock/coretoolkit/inc/HuiFxGroupLayer.h	Mon May 03 13:22:43 2010 +0300
@@ -51,6 +51,7 @@
     TInt LayerCount() const;
     CHuiFxLayer& Layer(TInt aIndex) const;
     void FxmlVisualInputs(RArray<THuiFxVisualSrcType> &aArray);
+    TBool FxmlUsesOpaqueHint() const;
     virtual void EnableMarginApplyChildren(TBool aEnable);
     virtual void SetAlwaysReadSurfacePixels(TBool aAlwaysReadSurfacePixels);
 
--- a/uiacceltk/hitchcock/coretoolkit/inc/HuiFxLayer.h	Fri Apr 16 15:56:24 2010 +0300
+++ b/uiacceltk/hitchcock/coretoolkit/inc/HuiFxLayer.h	Mon May 03 13:22:43 2010 +0300
@@ -56,6 +56,7 @@
     IMPORT_C virtual void SetExtRect( TRect *aExtRect )=0;
     IMPORT_C virtual void SetVisual( CHuiVisual *aVisual )=0;
     IMPORT_C virtual void SetVisual( MHuiEffectable *aVisual )=0;
+    virtual TBool FxmlUsesOpaqueHint() const { return EFalse; }
     IMPORT_C void CopyFromL(const CHuiFxLayer *aOldLayer);
 
 
@@ -78,7 +79,7 @@
     // Internal flag to tell wheter transparency is enabled
     virtual TBool IsSemitransparent() const;
     
-    virtual void FxmlVisualInputs(RArray<THuiFxVisualSrcType> &aArray) { }
+    virtual void FxmlVisualInputs(RArray<THuiFxVisualSrcType> & /*aArray*/) { }
     
     TBool AlwaysReadSurfacePixels() const;
     virtual void SetAlwaysReadSurfacePixels(TBool aAlwaysReadSurfacePixels);
--- a/uiacceltk/hitchcock/coretoolkit/inc/HuiFxParameter.inl	Fri Apr 16 15:56:24 2010 +0300
+++ b/uiacceltk/hitchcock/coretoolkit/inc/HuiFxParameter.inl	Mon May 03 13:22:43 2010 +0300
@@ -221,7 +221,7 @@
 template <typename TYPE, typename TIMELINE_TYPE, THuiFxParameterType TYPE_CODE>
 void CHuiFxGenericParameter<TYPE, TIMELINE_TYPE, TYPE_CODE>::AdvanceTime(TReal32 aElapsedTime)
     {
-    if (!iTimeLine)
+    if (!iTimeLine || iAnimationFinished)
         {
         return;
         }
--- a/uiacceltk/hitchcock/coretoolkit/inc/HuiFxVisualLayer.h	Fri Apr 16 15:56:24 2010 +0300
+++ b/uiacceltk/hitchcock/coretoolkit/inc/HuiFxVisualLayer.h	Mon May 03 13:22:43 2010 +0300
@@ -29,7 +29,7 @@
 class CHuiFxVisualLayer: public CHuiFxLayer
     {
 public:
-    IMPORT_C static CHuiFxVisualLayer* NewL(MHuiEffectable& aVisual);
+    IMPORT_C static CHuiFxVisualLayer* NewL(MHuiEffectable* aVisual); // param mandatory
     IMPORT_C ~CHuiFxVisualLayer();
     IMPORT_C TBool PrepareDrawL(CHuiFxEngine& aEngine);
     IMPORT_C void Draw(CHuiFxEngine& aEngine, CHuiGc& aGc, CHuiFxRenderbuffer& aTarget, CHuiFxRenderbuffer& aSource);
@@ -51,8 +51,11 @@
     IMPORT_C void SetVisual( MHuiEffectable *aVisual );
 
     void FxmlVisualInputs(RArray<THuiFxVisualSrcType> &aArray);
+    void SetFxmlUsesOpaqueHint(TBool aValue);
+    TBool FxmlUsesOpaqueHint() const;
+    
 protected:
-    IMPORT_C void ConstructL(MHuiEffectable& aVisual);
+    IMPORT_C void ConstructL(MHuiEffectable* aVisual);
     
     void RegisterParameterL(const TDesC& aName, TRgb* aValue);
     void RegisterParameterL(const TDesC& aName, TReal32* aValue);
@@ -93,7 +96,7 @@
     
     HBufC* iExtBitmapFile;
     TReal32 iOpacity;
-
+    TBool iOpaqueHint;
     };
 
 #endif /*HUIFXVISUALLAYER_*/
--- a/uiacceltk/hitchcock/coretoolkit/inc/huiextension.h	Fri Apr 16 15:56:24 2010 +0300
+++ b/uiacceltk/hitchcock/coretoolkit/inc/huiextension.h	Mon May 03 13:22:43 2010 +0300
@@ -83,4 +83,7 @@
     TInt iErrorCode;
     };
 
+// Uid for Release Cached Textures extension for CHuiSkin.
+const TUid KHuiSkinReleaseCachedTextures = { 0x2002E6D4 };
+
 #endif // __HUIEXTENSION_H__
--- a/uiacceltk/hitchcock/coretoolkit/inc/huistatictlsdata.h	Fri Apr 16 15:56:24 2010 +0300
+++ b/uiacceltk/hitchcock/coretoolkit/inc/huistatictlsdata.h	Mon May 03 13:22:43 2010 +0300
@@ -22,6 +22,14 @@
 #define __HUISTATICTLSDATA_H__
 
 
+// For testing purposes, insert additional test data into TLS.
+// Notice, that TTlsData object is inserted into TLS. So, test
+// object needs to be added into TTLSData and not inserted directly
+// into TLS.
+#define AMT_CONTROL() static_cast<TTlsData*>(Dll::Tls())->iAlfModuleTestDataControl
+#include "alfmoduletest.h"
+
+
 LOCAL_D const TInt KMaxClocks = 10;
 
 
@@ -109,7 +117,12 @@
     RFs* iFs;
     
     CAppFwProxy* iAppFwProxy;
-   
+
+#ifdef USE_MODULE_TEST_HOOKS_FOR_ALF
+    // For testing purposes, test data needs to be included into TLS object.
+    CAlfModuleTestDataControl* iAlfModuleTestDataControl;
+#endif
+
     CWsScreenDevice* WsScreenDevice(TInt aScreenNumber)
         {
         if (aScreenNumber < iScreenDevices.Count())
@@ -138,6 +151,13 @@
                 
      void DoInitL()
         {
+#ifdef USE_MODULE_TEST_HOOKS_FOR_ALF
+    // For testing purposes, test data needs to be included into TTlsData object because
+    // TTlsData object itself is inserted into TLS.
+    iAlfModuleTestDataControl = new(ELeave) CAlfModuleTestDataControl();
+    User::LeaveIfError( iAlfModuleTestDataControl->OpenGlobalObjects() );
+#endif
+
         CCoeEnv* coe = CCoeEnv::Static();
         if (coe)
             {
@@ -206,6 +226,11 @@
         iFs = 0;
 
         RFbsSession::Disconnect();
+        
+#ifdef USE_MODULE_TEST_HOOKS_FOR_ALF
+        delete iAlfModuleTestDataControl;
+        iAlfModuleTestDataControl = NULL;
+#endif        
         }
     };
 
--- a/uiacceltk/hitchcock/coretoolkit/rendervg10/inc/HuiFxVg10OnscreenRenderbuffer.h	Fri Apr 16 15:56:24 2010 +0300
+++ b/uiacceltk/hitchcock/coretoolkit/rendervg10/inc/HuiFxVg10OnscreenRenderbuffer.h	Mon May 03 13:22:43 2010 +0300
@@ -46,6 +46,10 @@
 protected:
     void ConstructL(CHuiVg10RenderPlugin& aPlugin, CHuiVg10RenderSurface& aSurface);
     void PrepareForReuse(const TSize& /* aReusedRect */);
+    
+    void CreateVgImage();
+    void ReleaseVgImage();
+    
 private:
     CHuiVg10RenderPlugin*   iPlugin;
     CHuiVg10RenderSurface*  iSurface;
--- a/uiacceltk/hitchcock/coretoolkit/rendervg10/inc/HuiVg10Gc.h	Fri Apr 16 15:56:24 2010 +0300
+++ b/uiacceltk/hitchcock/coretoolkit/rendervg10/inc/HuiVg10Gc.h	Mon May 03 13:22:43 2010 +0300
@@ -385,7 +385,7 @@
      */
     void SetPaintPattern(CHuiTexture* aTexture, const TPoint& aTextureOrigin);
     
-    void DrawArc(const TRect& aRect, THuiFillMode aDrawMode, const TInt aThickness, TReal32 aStart, TReal32 aEnd, TBool aIsPie);
+    void DrawArc(const TRect& aRect, THuiFillMode aDrawMode, const TInt aThickness, TReal32 aStart, TReal32 aEnd, TBool aIsPie) __SOFTFP;
 
 protected:
 
@@ -482,7 +482,7 @@
                           TReal32 aBorderWidth,
                           TReal32 aBorderHeight, 
                           THuiRealPoint aOffset,
-                          const THuiImage* aImage);
+                          const THuiImage* aImage) __SOFTFP;
 
 
     /**
@@ -495,7 +495,7 @@
                                 TReal32 aRightBorderWidth, 
                                 TReal32 aTopBorderHeight,
                                 TReal32 aBottomBorderHeight, 
-                                const THuiImage* aImage);
+                                const THuiImage* aImage) __SOFTFP;
     
     
     void CreateVgObjectsL();
--- a/uiacceltk/hitchcock/coretoolkit/rendervg10/src/HuiFxVg10OnscreenRenderbuffer.cpp	Fri Apr 16 15:56:24 2010 +0300
+++ b/uiacceltk/hitchcock/coretoolkit/rendervg10/src/HuiFxVg10OnscreenRenderbuffer.cpp	Mon May 03 13:22:43 2010 +0300
@@ -36,33 +36,12 @@
     iPlugin = &aPlugin;
     iSurface = &aSurface;
     iTextureUsage = ERenderbufferUsageReadWrite;
-    
-#ifndef __WINS__ // Should possibly query the supported mode instead?
-    VGImageFormat imageInternalFormat = VG_sARGB_8888_PRE;
-#else
-    VGImageFormat imageInternalFormat = VG_sARGB_8888;
-#endif
-    
-    iImage = vgCreateImage(imageInternalFormat, Size().iWidth, Size().iHeight, VG_IMAGE_QUALITY_NONANTIALIASED);
-    HUIFX_VG_INVARIANT();
-    
-    // Initialize the context
-    iGc = iPlugin->CreateGcL();
-    BindAsRenderTarget();
-    iGc->InitState();
-    UnbindAsRenderTarget();
-    
-    // Let renderer know that we have been fiddlling with OpenVg state directly
-    // "iGc->InitState" confuses scissoring setting, so lets notify it.
-    CHuiVg10RenderPlugin& renderer = CHuiStatic::Vg10Renderer();
-    renderer.AddRestoreStateFlags(EHuiVg10GcStateFlagDirtyScissor);    
-    renderer.AddRestoreStateFlags(EHuiVg10GcStateFlagDirtyBlendMode);        
     }
 
+
 CHuiFxVg10OnscreenRenderbuffer::~CHuiFxVg10OnscreenRenderbuffer()
     {
-    vgDestroyImage(iImage);
-    HUIFX_VG_INVARIANT();
+    ReleaseVgImage();
     
     delete iGc;
     }
@@ -87,6 +66,7 @@
     iTextureUsage = aUsage;
     if (aUsage == ERenderbufferUsageReadWrite || aUsage == ERenderbufferUsageReadOnly)
         {
+        CreateVgImage();
         BindAsRenderTarget();
         vgGetPixels(iImage, 0, 0, 0, 0, Size().iWidth, Size().iHeight);
         HUIFX_VG_INVARIANT();
@@ -103,6 +83,7 @@
         vgSetPixels(0, 0, iImage, 0, 0, Size().iWidth, Size().iHeight);
         HUIFX_VG_INVARIANT();
         UnbindAsRenderTarget();
+        ReleaseVgImage();
         }
     }
 
@@ -123,3 +104,34 @@
     // this should never happen.
     ASSERT(FALSE);
     }
+
+void CHuiFxVg10OnscreenRenderbuffer::CreateVgImage()
+    {
+#ifndef __WINS__ // Should possibly query the supported mode instead?
+    VGImageFormat imageInternalFormat = VG_sARGB_8888_PRE;
+#else
+    VGImageFormat imageInternalFormat = VG_sARGB_8888;
+#endif
+    
+    iImage = vgCreateImage(imageInternalFormat, Size().iWidth, Size().iHeight, VG_IMAGE_QUALITY_NONANTIALIASED);
+    HUIFX_VG_INVARIANT();
+    
+    // Initialize the context
+    iGc = iPlugin->CreateGcL();
+    BindAsRenderTarget();
+    iGc->InitState();
+    UnbindAsRenderTarget();
+    
+    // Let renderer know that we have been fiddlling with OpenVg state directly
+    // "iGc->InitState" confuses scissoring setting, so lets notify it.
+    CHuiVg10RenderPlugin& renderer = CHuiStatic::Vg10Renderer();
+    renderer.AddRestoreStateFlags(EHuiVg10GcStateFlagDirtyScissor);    
+    renderer.AddRestoreStateFlags(EHuiVg10GcStateFlagDirtyBlendMode);        
+    }
+
+void CHuiFxVg10OnscreenRenderbuffer::ReleaseVgImage()
+    {
+    vgDestroyImage(iImage);
+    HUIFX_VG_INVARIANT();
+    }
+
--- a/uiacceltk/hitchcock/coretoolkit/rendervg10/src/HuiVg10Gc.cpp	Fri Apr 16 15:56:24 2010 +0300
+++ b/uiacceltk/hitchcock/coretoolkit/rendervg10/src/HuiVg10Gc.cpp	Mon May 03 13:22:43 2010 +0300
@@ -1555,7 +1555,7 @@
     
     }
 
-void CHuiVg10Gc::DrawArc(const TRect& aRect, THuiFillMode aDrawMode, const TInt aThickness, TReal32 aStart, TReal32 aEnd, TBool aIsPie)
+void CHuiVg10Gc::DrawArc(const TRect& aRect, THuiFillMode aDrawMode, const TInt aThickness, TReal32 aStart, TReal32 aEnd, TBool aIsPie) __SOFTFP
     {
     // Fix given destination rect to be in th middle of openvg pixels
     THuiRealRect destinationRect = aRect;
@@ -1759,7 +1759,7 @@
                                   TReal32 aBorderWidth,
                                   TReal32 aBorderHeight, 
                                   THuiRealPoint aOffset,
-                                  const THuiImage* aImage)
+                                  const THuiImage* aImage) __SOFTFP
     {
     // If there is no image, draw a solid border
     if (!aImage || !aImage->HasTexture())
@@ -1872,7 +1872,7 @@
                                         TReal32 aRightBorderWidth, 
                                         TReal32 aTopBorderHeight,
                                         TReal32 aBottomBorderHeight, 
-                                        const THuiImage* aImage)
+                                        const THuiImage* aImage) __SOFTFP
     {
     // If there is no image, draw a solid border
     if (!aImage || !aImage->HasTexture())
--- a/uiacceltk/hitchcock/coretoolkit/src/HuiCanvasTextureCache.cpp	Fri Apr 16 15:56:24 2010 +0300
+++ b/uiacceltk/hitchcock/coretoolkit/src/HuiCanvasTextureCache.cpp	Mon May 03 13:22:43 2010 +0300
@@ -2100,7 +2100,7 @@
 CHuiCanvasTextureCache::CHuiCanvasTextureCache()
     {
     SetMemoryLevel(EHuiMemoryLevelNormal);
-    CHuiStatic::Env().AddLowMemoryObserver(this);
+    CHuiStatic::Env().AddMemoryLevelObserver(this);
     }
 
 // ---------------------------------------------------------------------------
@@ -2109,7 +2109,7 @@
 //
 CHuiCanvasTextureCache::~CHuiCanvasTextureCache()
     {
-    CHuiStatic::Env().RemoveLowMemoryObserver(this);
+    CHuiStatic::Env().RemoveMemoryLevelObserver(this);
     iCachedTexts.ResetAndDestroy();
     iCachedImages.ResetAndDestroy();        
     iRecycledTextures.ResetAndDestroy();
@@ -3170,7 +3170,7 @@
 
     for(TInt i=entries.Count() - 1; i >= 0; i--)
         {
-        if (iCachedRenderBuffers[i]->iCanvasRenderBuffer)
+        if (entries[i]->iCanvasRenderBuffer)
             {        
             TSize renderBufferSize = entries[i]->iCanvasRenderBuffer->Size();    
             totalUnusedRenderBufferBytes += renderBufferSize.iWidth * renderBufferSize.iHeight * KHuiCanvasRenderBufferEstimatedBpp/8.f;
@@ -3473,6 +3473,25 @@
             delete entry;            
             }                    
         }
+    else if(iMemoryLevel <= EHuiMemoryLevelReduced)
+        {
+        // free all the caches but allow using renderbuffers
+        #ifdef HUI_DEBUG_PRINT_PERFORMANCE_INTERVAL
+        RDebug::Print(_L("-- CHuiCanvasTextureCache::SetMemoryLevel: Enabling recuded memory state"));
+        RDebug::Print(_L("-- CHuiCanvasTextureCache::SetMemoryLevel: Caching of textures disabled but renderbuffers enabled"));
+        #endif
+        // Set cache sizes to minimum
+        iMaxTextureMemoryInKBytes = 0;
+        iMaxRenderBufferMemoryInKBytes = 0;
+        
+        // Set flags to make sure we check all entries
+        iHasReleasedTexts = ETrue;
+        iHasReleasedImages = ETrue;
+        iHasReleasedRenderBuffers = ETrue;
+        
+        // Delete released cached entries
+        DeleteAllReleasedEntries(EFalse);
+        }
     else
         {
         #ifdef HUI_DEBUG_PRINT_PERFORMANCE_INTERVAL
--- a/uiacceltk/hitchcock/coretoolkit/src/HuiCanvasVisual.cpp	Fri Apr 16 15:56:24 2010 +0300
+++ b/uiacceltk/hitchcock/coretoolkit/src/HuiCanvasVisual.cpp	Mon May 03 13:22:43 2010 +0300
@@ -80,6 +80,9 @@
 
     RRegionBuf<5> iShapeRegion;
     TPoint iShapeOrigin;
+
+    // Flag to indicate if this has received commands while inactive
+    TBool iCommandsReceivedWhileNoCache;
     };
 
 EXPORT_C CHuiCanvasVisual* CHuiCanvasVisual::AddNewL(CHuiControl& aOwnerControl,
@@ -125,6 +128,8 @@
     
     iCanvasVisualData->iShapeOrigin = TPoint();
     
+    iCanvasVisualData->iCommandsReceivedWhileNoCache = EFalse;
+    
     // subwindow effects
     //EnableBrushesL(ETrue);
     }
@@ -274,6 +279,15 @@
 
 void CHuiCanvasVisual::HandleBuffer(TRect& aDisplayRect, TInt aAction, CHuiGc* aGc) const
     {
+    TBool touchCountWasEnabled = EFalse;
+    if (iCanvasVisualData->iCommandsReceivedWhileNoCache)
+        {
+        // Commands were received while this visual didn't keep cache. 
+        // So it's possible that some images are still in texture cache but haven't been updated.
+        touchCountWasEnabled = Env().CanvasTextureCache().IsTouchCountCheckEnabled();
+        Env().CanvasTextureCache().EnableTouchCountCheck();
+        }
+        
     if (iCanvasVisualData->iCommandSetType == ECommandBufferWs || iCanvasVisualData->iCommandSetType == ECommandBufferAlf)
         {
         TRAPD(err, iCanvasVisualData->iCanvasPainter->HandleBufferL(aDisplayRect, aAction, *this, aGc, DisplayRect().iTl.Round()));  
@@ -287,6 +301,14 @@
         // do nothing    
         }                
     
+    if (iCanvasVisualData->iCommandsReceivedWhileNoCache)
+        {
+        Env().CanvasTextureCache().EnableTouchCountCheck( touchCountWasEnabled );
+        if ( !KeepNoCache() && aAction == EDrawBuffer )
+            {
+            iCanvasVisualData->iCommandsReceivedWhileNoCache = EFalse;
+            }   
+        }
     }
 
 
@@ -772,13 +794,9 @@
 	TRAP_IGNORE(iCanvasVisualData->iCanvasPainter->SetCommandSetL(aCommands));	
 
 	// Memory optimization. Do not prepare cache if visual is inactive.
-    TBool rosterFrozen = Display() && Display()->Roster().IsVisibleContentFrozen();
-    TBool inactive = EFalse; 
-    inactive |= Flags() & EHuiVisualFlagInactive;
-    inactive |= Flags() & EHuiVisualFlagUnderOpaqueHint;
-
-    if (rosterFrozen || inactive)
+    if (KeepNoCache())
         {
+        iCanvasVisualData->iCommandsReceivedWhileNoCache = ETrue;
         ClearCache();
         }
     else
@@ -846,13 +864,9 @@
     TRAP_IGNORE(iCanvasVisualData->iCanvasPainter->AddCommandSetL(aMoreCommands));
     
     // Memory optimization. Do not prepare cache if visual is inactive.
-    TBool rosterFrozen = Display() && Display()->Roster().IsVisibleContentFrozen();
-    TBool inactive = EFalse; 
-    inactive |= Flags() & EHuiVisualFlagInactive;
-    inactive |= Flags() & EHuiVisualFlagUnderOpaqueHint;
-
-    if (rosterFrozen || inactive)
+    if (KeepNoCache())
         {
+        iCanvasVisualData->iCommandsReceivedWhileNoCache = ETrue;
         ClearCache();
         }
     else
@@ -998,7 +1012,11 @@
                 background.iPaintedRect = DisplayRect();
                 background.iPaintType = /*(iCanvasVisualData->iBackground->BackgroundColor().Alpha() == 255) ?*/ EHuiCanvasPaintTypeOpaque;// : EHuiCanvasPaintTypeTransparent; 
                 return background;
-                }                
+                }          
+            else 
+                {
+                aIndex--;
+                }
             }                                            
         }
 
@@ -1543,3 +1561,13 @@
     {
     return iCanvasVisualData->iCanvasPainter->HasCommandBuffers(EHuiCanvasBufferContainsTransparentClear);
     }
+
+TBool CHuiCanvasVisual::KeepNoCache() const
+    {
+    TBool rosterFrozen = Display() && Display()->Roster().IsVisibleContentFrozen();
+    TBool inactive = EFalse; 
+    inactive |= Flags() & EHuiVisualFlagInactive;
+    inactive |= Flags() & EHuiVisualFlagUnderOpaqueHint;
+    
+    return rosterFrozen || inactive;
+    }
--- a/uiacceltk/hitchcock/coretoolkit/src/HuiDisplay.cpp	Fri Apr 16 15:56:24 2010 +0300
+++ b/uiacceltk/hitchcock/coretoolkit/src/HuiDisplay.cpp	Mon May 03 13:22:43 2010 +0300
@@ -638,6 +638,12 @@
         return EFalse;
         }
     
+    if (!iForegroundTextureTransparency && iForegroundTexture)
+        {
+        // When we can blit foreground texture, we shouldn't need any textures in skin side.
+        iEnv.Skin().ReleaseCachedTextures();
+        }
+    
     TBool useDirtyRects = (RenderSurface().Flags() & MHuiRenderSurface::EFlagUseDirtyRects) 
     					  == MHuiRenderSurface::EFlagUseDirtyRects;
  	
@@ -748,6 +754,23 @@
 	iGc->SetPenColor(iBackgroundColor);
 	iGc->InitNewFrame();
 
+	
+	// if there is a fade effect in progress, we
+	// need to clear the screen as fade effect uses
+	// always blending. If we do not clear here
+	// fade leaves trails in certain situations.
+	if (iEnv.EffectsEngine()->HasActiveFadeEffect() 
+	        || RosterImpl().IsVisibleContentFrozen() // guaranteen, that transparent pixels of the UI surface are drawn correctly during layout switch.
+	        )
+	    {
+        iGc->SetPenColor(KRgbBlack);
+        iGc->SetPenAlpha(0);
+        iGc->Disable(CHuiGc::EFeatureClipping);
+        iGc->Disable(CHuiGc::EFeatureBlending);
+        iGc->Clear();
+	    }
+	
+	
     if ( iDrawDirtyRegions )
         {
         // Show dirty. 
@@ -1035,6 +1058,12 @@
 
     iClearBackground = aClearBackground;
     iBackgroundItems.Reset();
+    
+    // release background texture if clearing is set to None
+    if(aClearBackground == EClearNone)
+        {
+        iEnv.Skin().ReleaseTexture(EHuiSkinBackgroundTexture);
+        }
     }
 
 
@@ -1628,6 +1657,12 @@
 EXPORT_C void CHuiDisplay::SetForegroundTextureOptions(TBool aTransparency)
     {
     iForegroundTextureTransparency = aTransparency;
+
+    if (!iForegroundTextureTransparency && iForegroundTexture)
+        {
+        // When we can blit foreground texture, we shouldn't need any textures in skin side.
+        iEnv.Skin().ReleaseCachedTextures();
+        }
     }
 
 void CHuiDisplay::UpdateForegroundTexture(const TRect& aRect)
--- a/uiacceltk/hitchcock/coretoolkit/src/HuiFxEffect.cpp	Fri Apr 16 15:56:24 2010 +0300
+++ b/uiacceltk/hitchcock/coretoolkit/src/HuiFxEffect.cpp	Mon May 03 13:22:43 2010 +0300
@@ -76,12 +76,20 @@
     {
     delete iRoot;
     iRoot = NULL;
-    
     NotifyEffectEndObserver();
     
     ReleaseCachedRenderTarget();
     
     iEngine->RemoveEffect(this);
+    if (iEngine && iGroupId != KErrNotFound && !iNotifiedEffectReady)
+        {
+        // if effect was deleted before it was drawn, the group must be notified. If this was the last effect in the group
+        // the group will be removed by the EffectReadyToStart
+        // effect group does not not know, which effects have notified about themselves. thus iNotifiedEffectReady flag is used.
+        iNotifiedEffectReady = ETrue;
+        iEngine->NotifyEffectReady(iGroupId);
+        }
+    
 #ifdef HUIFX_TRACE    
     RDebug::Print(_L("CHuiFxEffect::~CHuiFxEffect - 0x%x"), this);
 #endif
@@ -89,12 +97,18 @@
 
 void CHuiFxEffect::NotifyEffectEndObserver()
     {
-    if ( iEffectEndObserver )
+	// fade effect should not have observers
+    if (iFlags & KHuiFadeEffectFlag)
+        {
+        return;
+        }
+    if (iEffectEndObserver)
         {
         // The callback can be called only once when the effect finishes
-        iEffectEndObserver->AlfGfxEffectEndCallBack( iHandle );
+        MAlfGfxEffectObserver* effectEndObserver = iEffectEndObserver;
         iEffectEndObserver = NULL;
-        iHandle = 0;
+        // Note: The call below may synchronously delete me (CHuiFxEffect instance)
+        effectEndObserver->AlfGfxEffectEndCallBack( iHandle );
         }    
     }
 
@@ -308,10 +322,9 @@
                 }
             
             // Write cached buffer to the display
-            if (cachedRenderTargetNeedsRefresh)
-                {
-                iEngine->Composite(aGc, *iCachedRenderTarget, targetRect.iTl, aOpaque && !(EffectFlags() & KHuiFxAlwaysBlend), aAlpha);
-                }
+           
+	       iEngine->Composite(aGc, *iCachedRenderTarget, targetRect.iTl, aOpaque && !(EffectFlags() & KHuiFxAlwaysBlend), aAlpha);
+           
 
             if (aClipRegion.Count())
                 {
@@ -437,7 +450,11 @@
 EXPORT_C void CHuiFxEffect::SetEffectEndObserver( MAlfGfxEffectObserver* aEffectEndObserver, TInt aHandle )
     {
     iEffectEndObserver = aEffectEndObserver;
-    iHandle = aHandle;
+    
+    if (aHandle != 0) // override handle only if someone is interested
+        {
+        iHandle = aHandle;
+        }    
     }
 
 EXPORT_C void CHuiFxEffect::SetEffectFlags( TInt aFlags )
@@ -445,6 +462,22 @@
     iFlags = aFlags;
     }
 
+void CHuiFxEffect::SetEffectFlag( TInt aFlag )
+    {
+#ifdef HUIFX_TRACE
+    RDebug::Printf("CHuiFxEffect::SetEffectFlag - Setting flag 0x%x for 0x%x, before: iFlags: 0x%x", aFlag, this, iFlags);
+#endif
+    iFlags |= aFlag;
+    }
+
+void CHuiFxEffect::ClearEffectFlag( TInt aFlag )
+    {
+#ifdef HUIFX_TRACE
+    RDebug::Printf("CHuiFxEffect::ClearEffectFlag - Clearing flag 0x%x for 0x%x, before: iFlags: 0x%x", aFlag, this, iFlags);
+#endif    
+    iFlags &= ~aFlag;
+    }
+
 EXPORT_C void CHuiFxEffect::SetEffectGroup(TInt aGroupId)
     {
     iGroupId = aGroupId;
@@ -462,25 +495,63 @@
 
 EXPORT_C void CHuiFxEffect::AdvanceTime(TReal32 aElapsedTime)
     {
+#ifdef HUIFX_TRACE
+    RDebug::Printf("CHuiFxEffect::AdvanceTime 0x%x, aElapsed time: %f, Total elapsed time: %f, Frames drawn: %d, iFlags: 0x%x, iGroup %d, iHandle: %d", 
+            this, 
+            aElapsedTime, 
+            iElapsedTime, 
+            iFramesDrawn, 
+            iFlags,
+            iGroupId,
+            iHandle);
+#endif
+    // KHuiFxDelayRunUntilFirstFrameHasBeenDrawn flag is for giving effect chance to run
+    // its whole timeline by starting the time only when first frame has been drawn.
     if (iFlags & KHuiFxDelayRunUntilFirstFrameHasBeenDrawn)
         {
+        // Sometimes the effect does not get any frames. Force the time to start, because
+        // otherwise will jam itself and possible the group, where the effect is.
+        if (iElapsedTime > 0.2 && iFramesDrawn == 0)
+            {
+            iFramesDrawn = 1;
+#ifdef HUIFX_TRACE            
+            RDebug::Printf("CHuiFxEffect::AdvanceTime - Not drawn, but cannot wait. release 0x%x in time %f", this, iElapsedTime);
+#endif
+            }
+        
         if (iFramesDrawn)
-            {
+            { 
+            if (iFlags & KHuiFxReadyAndWaitingGroupToStartSyncronized)
+                {
+	            // this has drawn atleast once, but all the effect in this group have not drawn. Must hang on little more.
+                return;
+                }
+        
+            if (iFlags & KHuiFxWaitGroupToStartSyncronized)
+                {
+				// Group has been started, waiting the others in the group to be drawn
+                ClearEffectFlag(KHuiFxWaitGroupToStartSyncronized);
+                SetEffectFlag(KHuiFxReadyAndWaitingGroupToStartSyncronized);
+				// NotifyEffectReady will clear KHuiFxReadyAndWaitingGroupToStartSyncronized flag
+				// if all items in the group are ready.
+                iEngine->NotifyEffectReady(iGroupId);
+                iNotifiedEffectReady = ETrue;
+                return;
+                }
+
             if (iFramesDrawn == 1)
                 {
                 aElapsedTime = 0;
                 iFramesDrawn++;
                 }
-            iRoot->AdvanceTime(aElapsedTime);
-            }
-        else
-            {
+                iRoot->AdvanceTime(aElapsedTime);
             }
         }
     else
         {
         iRoot->AdvanceTime(aElapsedTime);
         }
+    iElapsedTime += aElapsedTime;
     }
     
 EXPORT_C TBool CHuiFxEffect::IsAnimated() const
@@ -560,3 +631,8 @@
     {
     iRoot->FxmlVisualInputs(aArray);
     }
+
+TBool CHuiFxEffect::FxmlUsesOpaqueHint() const
+    {
+    return iRoot->FxmlUsesOpaqueHint();
+    }
--- a/uiacceltk/hitchcock/coretoolkit/src/HuiFxEffectCache.cpp	Fri Apr 16 15:56:24 2010 +0300
+++ b/uiacceltk/hitchcock/coretoolkit/src/HuiFxEffectCache.cpp	Mon May 03 13:22:43 2010 +0300
@@ -234,7 +234,7 @@
 	   }
     return 0;
     }
-MHuiFxEffectCacheNode *CHuiFxEffectCache::FindCached(const TDesC &aId)
+MHuiFxEffectCacheNode *CHuiFxEffectCache::FindCached(const TDesC &aId) const
     {
     TInt size2 = iCachedEffects.Count();
     for(TInt i=0;i<size2;i++)
@@ -257,6 +257,16 @@
         return EFalse;
     }
 
+TBool CHuiFxEffectCache::FxmlUsesOpaqueHint(const TDesC &aFileName) const
+    {
+    MHuiFxEffectCacheNode *node = FindCached(aFileName);
+    if (node)
+        return node->FxmlUsesOpaqueHint();
+    else
+        return EFalse;
+    }
+
+
 
 void CHuiFxEffectCache::Remove(RHashMap<TInt, MHuiFxEffectCacheNode*> & /*aMap*/, MHuiFxEffectCacheNode * /*aNode*/)
     {
@@ -431,3 +441,9 @@
     array.Close();
     return EFalse;
     }
+
+TBool CHuiFxEffectCacheEffectNode::FxmlUsesOpaqueHint() const
+    {
+    CHuiFxEffect *effect = iEffect;
+    return effect->FxmlUsesOpaqueHint();
+    }
--- a/uiacceltk/hitchcock/coretoolkit/src/HuiFxEffectParser.cpp	Fri Apr 16 15:56:24 2010 +0300
+++ b/uiacceltk/hitchcock/coretoolkit/src/HuiFxEffectParser.cpp	Mon May 03 13:22:43 2010 +0300
@@ -345,9 +345,11 @@
 #endif
             TPtrC16 extBitmap;
             THuiFxVisualSrcType srcType = GetSrcTypeL( aNode, extBitmap );
-            CHuiFxVisualLayer* visual = CHuiFxVisualLayer::NewL( *iVisual );
+            TBool opaqueHint = GetOpaqueHintL(aNode);
+            CHuiFxVisualLayer* visual = CHuiFxVisualLayer::NewL( iVisual );
             CleanupStack::PushL( visual );
             visual->SetSourceType( srcType );
+            visual->SetFxmlUsesOpaqueHint( opaqueHint );
             if ( srcType == EVisualSrcBitmap && extBitmap.Length() > 0 )
                 {
                 visual->SetExtBitmapFileL( extBitmap );
@@ -1159,6 +1161,35 @@
 #endif
     return ref;
     }
+TBool CHuiFxEffectParser::GetOpaqueHintL( CMDXMLNode *aNode )
+    {
+    if (aNode->NodeType() != CMDXMLNode::EElementNode)
+        {
+        FAIL(KErrGeneral, _L("Text node expected while reading visual source type"));
+        }
+    TInt attributeIndex = ((CMDXMLElement*)aNode)->FindIndex( KLitOpaque );
+    if (attributeIndex == KErrNotFound)
+        {
+        // If src not found, the source defaults to visual itself
+        return EFalse;
+        }
+      
+    TPtrC attributeValue;
+    TPtrC attributeName;
+    User::LeaveIfError(((CMDXMLElement*)aNode)->AttributeDetails( attributeIndex, attributeName, attributeValue ));
+  
+    if( attributeValue.Compare( KLitTrue ) == 0 )
+        {
+        return ETrue;
+        }
+    
+    if( attributeValue.Compare( KLitFalse ) == 0 )
+        {
+        return EFalse;
+        }
+
+    return EFalse;
+    }
 
 THuiFxVisualSrcType CHuiFxEffectParser::GetSrcTypeL( CMDXMLNode* aNode, TPtrC16& aBitmap )
     {
--- a/uiacceltk/hitchcock/coretoolkit/src/HuiFxEngine.cpp	Fri Apr 16 15:56:24 2010 +0300
+++ b/uiacceltk/hitchcock/coretoolkit/src/HuiFxEngine.cpp	Mon May 03 13:22:43 2010 +0300
@@ -16,7 +16,6 @@
 */
 
 
-
 #include "HuiFxEngine.h"
 #include "HuiFxEffectParser.h"
 #include "HuiFxEffect.h"
@@ -66,6 +65,7 @@
 #endif
 #endif
     CHuiStatic::Env().AddMemoryLevelObserver(this);
+    iActiveEffectGroups.Reserve(2);
     }
 
 EXPORT_C TBool CHuiFxEngine::FxmlUsesInput1(const TDesC &aFileName)
@@ -77,6 +77,15 @@
     return EFalse;
 #endif
     }
+EXPORT_C TBool CHuiFxEngine::FxmlUsesOpaqueHint(const TDesC &aFileName)
+    {
+#ifdef HUIFX_EFFECTCACHE_ENABLED
+    return iCache->FxmlUsesOpaqueHint(aFileName);
+#endif
+#ifndef HUIFX_EFFECTCACHE_ENABLED
+    return EFalse;
+#endif    
+    }
 
 TBool CHuiFxEngine::FxmlUsesInput1(CHuiFxEffect& aEffect)
     {
@@ -282,8 +291,11 @@
     for ( TInt i = iActiveEffects.Count() - 1; i >= 0; i-- )
         {
         CHuiFxEffect* effect = iActiveEffects[i];
-        if (!effect->Changed())
+        if (!(effect->EffectFlags() & KHuiFadeEffectFlag) && !effect->Changed())
             {
+#ifdef HUIFX_TRACE
+            RDebug::Printf("void CHuiFxEngine::NotifyEffectEndObservers() calling NotifyEffectEndObserver");
+#endif
             effect->NotifyEffectEndObserver();
             }
         }    
@@ -295,13 +307,14 @@
     TInt i;
     TBool refreshRequired = EFalse;
 #ifdef HUIFX_TRACE    
-    RDebug::Print(_L("CHuiFxEngine::AdvanceTime - 0x%x "), this);   
+    RDebug::Print(_L("CHuiFxEngine::AdvanceTime - 0x%x, effect count: %d"), this, iActiveEffects.Count());   
 #endif
     // Go through the list in reverse order.
 // If the effect has ended, and has the callback set,
 // the effect will be removed, and will no longer be part of iActiveEffects set.
 // We must check if the effect is still in our list, but the indices change
 // if something is removed from the middle of the list
+    TInt skipGroup = KErrNotFound;
     for ( i = iActiveEffects.Count() - 1; i >= 0; i-- )
         {
         CHuiFxEffect* effect = iActiveEffects[i];
@@ -309,10 +322,26 @@
             {
             refreshRequired = ETrue;
             }
-        if ( i < iActiveEffects.Count() && effect == iActiveEffects[i] && !(effect->EffectFlags() & KHuiFxWaitGroupSyncronization))
+        TInt flags = effect->EffectFlags();
+        if ( !(flags & KHuiFxWaitGroupSyncronization)
+                && !(flags & KHuiFadeEffectFlag) // fade is not animated. Note, if animated effect would be used, remove this!
+                && (skipGroup == KErrNotFound || skipGroup != effect->GroupId())
+               )
             {
             // The effect is still in its place, it did not go away yet
+            TBool waitingGroupBefore = flags & KHuiFxWaitGroupToStartSyncronized;
             effect->AdvanceTime(aElapsedTime);
+            
+            if (waitingGroupBefore)
+                {
+                flags = effect->EffectFlags();
+                if (!(flags & KHuiFxReadyAndWaitingGroupToStartSyncronized) && !(flags & KHuiFxWaitGroupToStartSyncronized))
+                    {
+                    // effects in this group are all ready to start drawing. Skip this group in AdvanceTime, 
+					// that they can start syncronized on the next round
+                    skipGroup = effect->GroupId();
+                    }
+                }
             }
         }
     
@@ -332,6 +361,10 @@
 #endif // #ifdef HUIFX_TRACE    
 
     iActiveEffects.AppendL(aEffect);
+    if (iEffectObserver)
+        {
+        iEffectObserver->EffectAdded(aEffect);    
+        }
     }
 
 EXPORT_C void CHuiFxEngine::RemoveEffect(CHuiFxEffect* aEffect)
@@ -343,6 +376,10 @@
     if (i >= 0)
         {
         iActiveEffects.Remove(i);
+        if (iEffectObserver)
+            {
+            iEffectObserver->EffectComplete(aEffect);
+            }
         }
     }
 
@@ -489,7 +526,7 @@
     ASSERT((aBuffer) && (iBuffersInUse > 0));
 
 #ifdef HUIFX_RBCACHE_ENABLED
-    if(iLowGraphicsMemoryMode || IsCacheFull())
+    if(iLowGraphicsMemoryMode < EHuiMemoryLevelReduced || IsCacheFull())
         {
 #ifdef HUIFX_TRACE            
         RDebug::Print(_L("CHuiFxEngine::ReleaseRenderbuffer() --- Renderbuffer cache full! Suspectible for memory fragmentation! Cache size is %d entries."), CACHE_SIZE);
@@ -572,7 +609,7 @@
 EXPORT_C void  CHuiFxEngine::SetMemoryLevel(THuiMemoryLevel aLevel)
     {
     iLowGraphicsMemoryMode = aLevel;
-    if(iLowGraphicsMemoryMode) // != Normal
+    if(iLowGraphicsMemoryMode < EHuiMemoryLevelReduced)
         {
         ClearCache();
         }
@@ -585,19 +622,37 @@
 
 TInt CHuiFxEngine::LowMemoryState()
     {
-    return iLowGraphicsMemoryMode;
+    return iLowGraphicsMemoryMode < EHuiMemoryLevelReduced;
     }
 
 TBool CHuiFxEngine::HasActiveEffects() const
     {
 	// Don't report active effects if in SW-rendering mode
-    if(iLowGraphicsMemoryMode) // != Normal
+    if(iLowGraphicsMemoryMode < EHuiMemoryLevelReduced) 
         {
         return EFalse;
         }
     return iActiveEffects.Count() > 0;
     }
 
+TBool CHuiFxEngine::HasActiveFadeEffect() const
+    {
+    // Don't report active effects if in SW-rendering mode
+    if(iLowGraphicsMemoryMode < EHuiMemoryLevelReduced) 
+        {
+        return EFalse;
+        }
+    TInt effectCount = iActiveEffects.Count();
+    for (TInt count  = 0; count < effectCount; count++)
+        {
+        if (iActiveEffects[count]->EffectFlags() & KHuiFadeEffectFlag)
+            {
+            return ETrue;
+            }
+        }
+    return EFalse;
+    }
+
 void CHuiFxEngine::ClearCache()
     {
     // Release cached render targets from effects
@@ -626,48 +681,142 @@
     
     ASSERT(iBuffersInCache == 0);    
     }
-	
+
+TInt CHuiFxEngine::FindEffectGroup(TInt aGroup)
+    {
+    for (TInt i=0 ; i < iActiveEffectGroups.Count();i++)
+        {
+        if (iActiveEffectGroups[i].iGroup == aGroup)
+            {
+            return i; 
+            }
+        }
+    return KErrNotFound;
+    }
+
 EXPORT_C void CHuiFxEngine::BeginGroupEffect(TInt aGroup)
 	{
-	TInt index = iActiveEffectGroups.Find(aGroup);
+#ifdef HUIFX_TRACE   
+	RDebug::Printf("CHuiFxEngine::BeginGroupEffect(TInt aGroup %d) >>", aGroup);
+#endif
+	// Multiple grouped effects at the same time are not supported. 
+    // Same visual might participate different groups, which will mess up the effect
+    if (iActiveEffectGroups.Count()>0)
+        {
+        // delete previous groups
+        while(iActiveEffectGroups.Count())
+            {
+            TInt groupId = iActiveEffectGroups[0].iGroup;
+            for ( TInt i = iActiveEffects.Count() - 1; i >= 0; i-- )
+                {
+                if (iActiveEffects[i]->GroupId() == groupId)
+                    {
+                    iActiveEffects[i]->ClearEffectFlag(KHuiFxReadyAndWaitingGroupToStartSyncronized);
+                    iActiveEffects[i]->ClearEffectFlag(KHuiFxWaitGroupToStartSyncronized);
+                    iActiveEffects[i]->ClearEffectFlag(KHuiFxWaitGroupSyncronization);
+                    }
+                
+                }
+            iActiveEffectGroups.Remove(0);
+            }
+        }
+	
+	TInt index = FindEffectGroup(aGroup);
+	
 	if (index == KErrNotFound)
 		{
-		iActiveEffectGroups.Append(aGroup);
-		}
-	else
-		{
-		// group already exists
+        const TEffectGroupStruct item(aGroup);
+		iActiveEffectGroups.Append(item);
 		}
 	}
 
+// This will add effect to this group. Do not call this function more than once for single effect 
 EXPORT_C TInt CHuiFxEngine::ActiveGroupEffect()
 	{
-	if (iActiveEffectGroups.Count() > 0)
-		{
-		return iActiveEffectGroups[iActiveEffectGroups.Count()-1];
-		}
-	else
-		{
-		return KErrNotFound;
-		}
+	TInt index = iActiveEffectGroups.Count();
+	if (index == 0)
+	    {
+        return KErrNotFound;
+	    }
+	while(--index >= 0)
+        {
+		// group is alive until all its effects have been drawn once. .iEndCalled is to prevent
+		// another effect entering into this group
+        const TEffectGroupStruct& item = iActiveEffectGroups[index];
+        if (!item.iEndCalled) 
+            { 
+			return iActiveEffectGroups[index].iGroup;
+            }
+        }
+    return KErrNotFound;
 	}
 
+EXPORT_C TBool CHuiFxEngine::AddEffectToGroup(TInt aGroup)
+    {
+    TInt index = FindEffectGroup(aGroup);
+    if (index != KErrNotFound)
+        {
+        // keep count of effects in this group. All must draw atleast once, before
+        // syncronized group effect may start
+        iActiveEffectGroups[index].iWaiting++;
+#ifdef HUIFX_TRACE
+        RDebug::Printf("CHuiFxEngine::AddEffectToGroup - %d, waiting in group: %d", aGroup, iActiveEffectGroups[index].iWaiting);
+#endif
+        return ETrue;
+        }
+    return EFalse;
+    }
+
 EXPORT_C void CHuiFxEngine::StartGroupEffect(TInt aGroup)
 	{
-	TInt index = iActiveEffectGroups.Find(aGroup);
+#ifdef HUIFX_TRACE
+    RDebug::Printf("CHuiFxEngine::StartGroupEffect(TInt aGroup %d) >>", aGroup);
+#endif	    
+	TInt index = FindEffectGroup(aGroup);
 	if (index != KErrNotFound)
 		{
-		iActiveEffectGroups.Remove(index);
-	
+		iActiveEffectGroups[index].iEndCalled = ETrue; // this group will not take any more participants
 		for ( TInt i = iActiveEffects.Count() - 1; i >= 0; i-- )
 			{
 			CHuiFxEffect* effect = iActiveEffects[i];
 			TInt flags = effect->EffectFlags();
 			if ((flags & KHuiFxWaitGroupSyncronization) && (effect->GroupId() == aGroup))
 				{
-				flags &= ~KHuiFxWaitGroupSyncronization;
-				effect->SetEffectFlags(flags);
+                effect->ClearEffectFlag(KHuiFxWaitGroupSyncronization);
+                effect->SetEffectFlag(KHuiFxWaitGroupToStartSyncronized);
 				}
 			}
 		}
 	}
+
+void CHuiFxEngine::NotifyEffectReady(TInt aGroupId)
+    {
+#ifdef HUIFX_TRACE    
+    RDebug::Print(_L("CHuiFxEngine::NotifyEffectReady - %d"), aGroupId);
+#endif
+    TInt index = FindEffectGroup(aGroupId);
+    if (index != KErrNotFound)
+        {
+        iActiveEffectGroups[index].iWaiting--;    
+#ifdef HUIFX_TRACE
+        RDebug::Print(_L("CHuiFxEngine::NotifyEffectReady - waiting %d in group %d"), iActiveEffectGroups[index].iWaiting , aGroupId);
+#endif        
+        if (iActiveEffectGroups[index].iWaiting == 0)
+            {
+            // set in motion all effects in this group
+	        iActiveEffectGroups.Remove(index);
+            for ( TInt i = iActiveEffects.Count() - 1; i >= 0; i-- )
+                {
+                CHuiFxEffect* effect = iActiveEffects[i];
+                TInt flags = effect->EffectFlags();
+#ifdef HUIFX_TRACE
+                RDebug::Print(_L("CHuiFxEngine::NotifyEffectReady - effect 0x%x, group: %d, flags 0x%x"), effect, effect->GroupId(), effect->EffectFlags());
+#endif                
+                if ((flags & KHuiFxReadyAndWaitingGroupToStartSyncronized) && (effect->GroupId() == aGroupId))
+                    {
+                    effect->ClearEffectFlag(KHuiFxReadyAndWaitingGroupToStartSyncronized);
+                    }
+                }
+            }
+        }
+    }
--- a/uiacceltk/hitchcock/coretoolkit/src/HuiFxFilterLayer.cpp	Fri Apr 16 15:56:24 2010 +0300
+++ b/uiacceltk/hitchcock/coretoolkit/src/HuiFxFilterLayer.cpp	Mon May 03 13:22:43 2010 +0300
@@ -59,7 +59,7 @@
     {
     // iFilter does not need these
     }
-EXPORT_C void CHuiFxFilterLayer::SetVisual( MHuiEffectable *aVisual )
+EXPORT_C void CHuiFxFilterLayer::SetVisual( MHuiEffectable * /*aVisual*/ )
     {
     // iFilter does not need these
     }
--- a/uiacceltk/hitchcock/coretoolkit/src/HuiFxGroupLayer.cpp	Fri Apr 16 15:56:24 2010 +0300
+++ b/uiacceltk/hitchcock/coretoolkit/src/HuiFxGroupLayer.cpp	Mon May 03 13:22:43 2010 +0300
@@ -456,6 +456,16 @@
         }
     }
 
+TBool CHuiFxGroupLayer::FxmlUsesOpaqueHint() const
+    {
+    TBool b = EFalse;
+    for( TInt i=0 ; i < iLayers.Count() ; i++ )
+        {
+        b |= iLayers[i]->FxmlUsesOpaqueHint();
+        }
+    return b;
+    }
+
 void CHuiFxGroupLayer::SetAlwaysReadSurfacePixels(TBool aAlwaysReadSurfacePixels)
     {
     CHuiFxLayer::SetAlwaysReadSurfacePixels(aAlwaysReadSurfacePixels);
--- a/uiacceltk/hitchcock/coretoolkit/src/HuiFxVisualLayer.cpp	Fri Apr 16 15:56:24 2010 +0300
+++ b/uiacceltk/hitchcock/coretoolkit/src/HuiFxVisualLayer.cpp	Mon May 03 13:22:43 2010 +0300
@@ -25,7 +25,7 @@
 #include <e32math.h>
 #include "HuiCmdBufferBrush.h"
 
-EXPORT_C CHuiFxVisualLayer* CHuiFxVisualLayer::NewL(MHuiEffectable& aVisual)
+EXPORT_C CHuiFxVisualLayer* CHuiFxVisualLayer::NewL(MHuiEffectable* aVisual)
     {
     CHuiFxVisualLayer* e = new (ELeave) CHuiFxVisualLayer();
     CleanupStack::PushL(e);
@@ -34,14 +34,14 @@
     return e;
     }
 
-EXPORT_C void CHuiFxVisualLayer::ConstructL(MHuiEffectable& aVisual)
+EXPORT_C void CHuiFxVisualLayer::ConstructL(MHuiEffectable* aVisual)
     {
 #ifdef HUIFX_TRACE    
     RDebug::Print(_L("CHuiFxVisualLayer::ConstructL - 0x%x "), this);
 #endif
     CHuiFxLayer::ConstructL( ELayerTypeVisual );
     iParameterManager = CHuiFxParameterManager::NewL();
-    iVisual = &aVisual;
+    iVisual = aVisual;
     iSrcType = EVisualSrcVisual;
     iExtBitmapFile = NULL;
     
@@ -174,6 +174,7 @@
     else
         layer->iExtBitmapFile = NULL;
     layer->iOpacity = iOpacity;
+    layer->iOpaqueHint = iOpaqueHint;
     return layer;
 }
 EXPORT_C void CHuiFxVisualLayer::SetExtRect( TRect * /*aExtRect*/ )
@@ -446,7 +447,17 @@
     {
     aArray.Append(iSrcType);
     }
-    
+
+TBool CHuiFxVisualLayer::FxmlUsesOpaqueHint() const
+    {
+    return iOpaqueHint;
+    }
+
+void  CHuiFxVisualLayer::SetFxmlUsesOpaqueHint(TBool aValue)
+    { 
+    iOpaqueHint = aValue; 
+    }
+
 TBool CHuiFxVisualLayer::IsSemitransparent() const
     {
     if (iOpacity < 1.f)
--- a/uiacceltk/hitchcock/coretoolkit/src/HuiRosterImpl.cpp	Fri Apr 16 15:56:24 2010 +0300
+++ b/uiacceltk/hitchcock/coretoolkit/src/HuiRosterImpl.cpp	Mon May 03 13:22:43 2010 +0300
@@ -106,6 +106,9 @@
     
 void CHuiRosterImpl::ShowL(CHuiControlGroup& aGroup, TInt aWhere)
     {
+    
+    // The group will automatically accept input events once shown.
+       aGroup.SetAcceptInput(ETrue);
     // If the group is already shown on the display, just adjust its position
     // according to the parameters.
     if(Find(&aGroup) != KErrNotFound)
@@ -142,8 +145,7 @@
         InsertL(&aGroup, aWhere);
         }
 
-    // The group will automatically accept input events once shown.
-    aGroup.SetAcceptInput(ETrue);
+   
 
     // Show all the controls of the group.
     for(TInt i = 0; i < aGroup.Count(); ++i)
--- a/uiacceltk/hitchcock/coretoolkit/src/HuiS60Skin.cpp	Fri Apr 16 15:56:24 2010 +0300
+++ b/uiacceltk/hitchcock/coretoolkit/src/HuiS60Skin.cpp	Mon May 03 13:22:43 2010 +0300
@@ -32,7 +32,7 @@
 #include <AknUtils.h>
 
 #include "huiskinbackroundlayout.h"
-
+#include "huiextension.h"
 
 struct TBackgroundTexture
     {
@@ -296,7 +296,14 @@
 
 EXPORT_C void CHuiS60Skin::SkinExtension(const TUid& aExtensionUid, TAny** aExtensionParameters)
     {
-    CHuiSkin::SkinExtension(aExtensionUid,aExtensionParameters);
+    if (aExtensionUid == KHuiSkinReleaseCachedTextures)
+        {
+        FreeAllBackgroundTextureResources();
+        }
+    else
+        {        
+        CHuiSkin::SkinExtension(aExtensionUid, aExtensionParameters);
+        }
     }
     
 EXPORT_C THuiSkinOrientation CHuiS60Skin::Orientation() const
@@ -513,7 +520,7 @@
         bgTexture = ((TPrivData*)(iSpare))->iBackgrounds[index];
         if (bgTexture.iID == aID)
             {
-            if(!bgTexture.iBackgroundTexture && !bgTexture.iBackgroundTexture->HasContent())
+            if(!bgTexture.iBackgroundTexture || !bgTexture.iBackgroundTexture->HasContent())
                 {
                 delete bgTexture.iBackgroundTexture;
                 bgTexture.iBackgroundTexture = NULL;
--- a/uiacceltk/hitchcock/coretoolkit/src/HuiSkin.cpp	Fri Apr 16 15:56:24 2010 +0300
+++ b/uiacceltk/hitchcock/coretoolkit/src/HuiSkin.cpp	Mon May 03 13:22:43 2010 +0300
@@ -27,6 +27,7 @@
 #include "uiacceltk/HuiUtil.h"
 #include "uiacceltk/HuiPanic.h"
 #include "uiacceltk/HuiDisplay.h" 
+#include "huiextension.h"
 
 CHuiSkin::CHuiSkin(CHuiEnv& aEnv)
         : iEnv(aEnv)
@@ -192,6 +193,10 @@
     return err;
     }
 
+void CHuiSkin::ReleaseCachedTextures()
+    {
+    SkinExtension(KHuiSkinReleaseCachedTextures, NULL);
+    }
 
 void CHuiSkin::PrepareShadowTextureL(CHuiTexture& aTexture)
     {
--- a/uiacceltk/hitchcock/coretoolkit/src/HuiStatic.cpp	Fri Apr 16 15:56:24 2010 +0300
+++ b/uiacceltk/hitchcock/coretoolkit/src/HuiStatic.cpp	Mon May 03 13:22:43 2010 +0300
@@ -390,6 +390,14 @@
     iChangeNotifier->Start();
 #ifndef __WINSCW__
     globalWriteableData = *iData;
+    #ifdef USE_MODULE_TEST_HOOKS_FOR_ALF
+        // For testing purposes, test data needs to be included into TLS
+        // because test cases require information stored in TLS.
+        if ( !Dll::Tls() )
+            {
+            Dll::SetTls( iData );    
+            }
+    #endif    
 #else
     Dll::SetTls(iData);
 #endif
@@ -417,7 +425,7 @@
         }
     iChangeNotifier->Cancel();
     delete iChangeNotifier;
-#ifdef __WINSCW__
+#if defined( __WINSCW__ ) || defined( USE_MODULE_TEST_HOOKS_FOR_ALF )
     Dll::FreeTls();
 #endif
     delete iData;
--- a/uiacceltk/hitchcock/coretoolkit/src/huicanvasgc.cpp	Fri Apr 16 15:56:24 2010 +0300
+++ b/uiacceltk/hitchcock/coretoolkit/src/huicanvasgc.cpp	Mon May 03 13:22:43 2010 +0300
@@ -34,6 +34,15 @@
 
 #include <e32math.h>
 
+#include "alfmoduletestconf.h"
+#ifdef USE_MODULE_TEST_HOOKS_FOR_ALF
+    // Provides TLS object data for test cases.
+    // This is used only if module test hooks are set on.
+    #include "huistatictlsdata.h"
+#endif // USE_MODULE_TEST_HOOKS_FOR_ALF
+// Provides module test hook defines.
+#include "alfmoduletestdefines.h"
+
 
 EXPORT_C CHuiCanvasGc::CHuiCanvasGc():
     iPenColor(KRgbBlack),
@@ -44,7 +53,7 @@
     iHorizontalTextAlign(EHuiAlignHLeft),
     iTextStyleId(EHuiTextStyleNormal),
     iEffectiveOpacityEnabled(ETrue)
-    {	    
+    {
     }
 
 EXPORT_C CHuiCanvasGc::~CHuiCanvasGc()
@@ -640,6 +649,10 @@
     DisableDelayedClippingIfNeeded();                
 
     Cleanup();
+    
+    AMT_MAP_SET_VALUE_IF( iVisual && aRects.Count() > 0, iRectMap, 
+                          AMT_MAP_CPTR_TO_KEY_CAST( iVisual ), aRects[ aRects.Count() - 1 ].Round(),
+                          EAlfModuleTestTypeCoreToolkitDrawWindow );
 	}
 
 EXPORT_C void CHuiCanvasGc::DoDrawRects(RArray<THuiRealRect>& aRects)
@@ -1346,7 +1359,12 @@
 
     DisableDelayedClippingIfNeeded(); 
 
-    Cleanup();       
+    Cleanup();
+    
+    AMT_MAP_SET_VALUE_IF( iVisual, iRectMap,
+                          AMT_MAP_CPTR_TO_KEY_CAST( iVisual ),
+                          destinationRect.Round(), 
+                          EAlfModuleTestTypeCoreToolkitDrawFromRenderBuffer );
     }
 
 EXPORT_C void CHuiCanvasGc::ClearRenderBuffer( CHuiCanvasRenderBuffer& aImage, const TRect & aRect )
--- a/uiacceltk/hitchcock/coretoolkit/src/huigifanimationtexture.cpp	Fri Apr 16 15:56:24 2010 +0300
+++ b/uiacceltk/hitchcock/coretoolkit/src/huigifanimationtexture.cpp	Mon May 03 13:22:43 2010 +0300
@@ -56,6 +56,7 @@
         {
         iTexture->SetTextureChanged(ETrue);        
         }
+    CHuiStatic::ContinueRefresh();
     }
 
 EXPORT_C void CHuiGifAnimationTexture::Stop()
@@ -78,6 +79,7 @@
     	{
     	iAnimationState = ClearFlag(TInt(iAnimationState), TInt(EEnabled));
     	}
+    CHuiStatic::ContinueRefresh();
     }
 
 EXPORT_C TInt CHuiGifAnimationTexture::Id() 
@@ -139,7 +141,16 @@
             }
         iElapsedTime = 0.0f;
         
-        } 
+        }
+    // not enough time was elapsed,
+    // if the animation is not stopped
+    // request continuerefresh in order
+    // not to go to sleep
+    else 
+        {
+        iTexture->SetTextureChanged(ETrue);            
+        CHuiStatic::ContinueRefresh();
+        }
     }
     
 
--- a/uiacceltk/hitchcock/goommonitor/data/goomconfig.xml	Fri Apr 16 15:56:24 2010 +0300
+++ b/uiacceltk/hitchcock/goommonitor/data/goomconfig.xml	Mon May 03 13:22:43 2010 +0300
@@ -18,7 +18,13 @@
 	actions are needed. This value is meaningful only when "check" or "estimate" sync mode is
 	used with plugins.
 -->
-	<global_settings low_ram_threshold="3637" good_ram_threshold="10000" max_app_close_batch="3" default_wait_after_plugin="200">
+	<global_settings 
+		low_ram_threshold="3637" 
+		good_ram_threshold="10000" 
+		max_app_close_batch="3" 
+		default_wait_after_plugin="200"
+		default_icon_cache="6000"
+		>
 	</global_settings>
 
 <!--	Application specific low RAM and good RAM thresholds are defined here. The higher values of
@@ -27,7 +33,7 @@
 -->
 	<app_specific_thresholds>
 
-  <app uid="101F857A" low_ram_threshold="5000" good_ram_threshold="26000" skip_plugin="2002B3AE"></app> <!-- Camera --> 
+  <app uid="101F857A" low_ram_threshold="1000" good_ram_threshold="30000" skip_plugin="2002B3AE" icon_cache="0" use_sw_rend="Yes"></app> <!-- Camera --> 
   <app uid="200159B2" low_ram_threshold="5000" good_ram_threshold="10000" skip_plugin="2002B3AE"></app> <!-- MPlayer -->
   <app uid="102824CD" low_ram_threshold="5000" good_ram_threshold="10000" skip_plugin="2002B3AE"></app> <!-- Embedded mplayer -->
   <app uid="200009EE" low_ram_threshold="3637" good_ram_threshold="10000" target_free_on_startup="15000"></app> <!-- Photos -->
@@ -70,8 +76,9 @@
 <!--		The uid DEFAULT_PLUGIN refers to all plugins, which priority is not specificly
 		defined in the conf file.
 -->
-		<system_plugin uid="DEFAULT_PLUGIN" priority="10" sync_mode="check"></system_plugin>
-		<system_plugin uid="E4B6C988" priority="3" sync_mode="check"></system_plugin> <!-- ALFOOGMPLUGIN -->
+		<system_plugin uid="DEFAULT_PLUGIN" priority="10" sync_mode="check" sw_rend="not_supported"></system_plugin>
+		<system_plugin uid="E4B6C988" priority="3" sync_mode="check" sw_rend="supported"></system_plugin> <!-- ALFOOGMPLUGIN -->
+		<system_plugin uid="2002DC75" priority="4" sync_mode="check" sw_rend="supported"></system_plugin> <!-- HbThemeserverOOGMPLUGIN? -->
 		<system_plugin uid="2002C30A" priority="5" sync_mode="continue"></system_plugin> <!-- FLASHOOGMPLUGIN -->
 	</system_plugin_settings>
 	
--- a/uiacceltk/hitchcock/goommonitor/inc/goomaction.h	Fri Apr 16 15:56:24 2010 +0300
+++ b/uiacceltk/hitchcock/goommonitor/inc/goomaction.h	Mon May 03 13:22:43 2010 +0300
@@ -46,7 +46,7 @@
      * @since S60 5.0
      * @param aBytesRequested ?description
      */ 
-    virtual void FreeMemory(TInt aBytesRequested) = 0;
+    virtual void FreeMemory(TInt aBytesRequested, TBool aUseSwRendering) = 0;
     
     /**
      * @since S60 5.0
--- a/uiacceltk/hitchcock/goommonitor/inc/goomactionlist.h	Fri Apr 16 15:56:24 2010 +0300
+++ b/uiacceltk/hitchcock/goommonitor/inc/goomactionlist.h	Mon May 03 13:22:43 2010 +0300
@@ -184,6 +184,19 @@
      */    
     void AppNotExiting(TInt aWgId);
     
+    /**
+     * Sets the flag to free memory using sw rendering. For Alf and other plugins that use sw rendering to reduces gpu mem usage.
+     * @since S60 5.0
+     * @param aUseSwRendering ETrue if sw rendering to be used.
+     */   
+    void SetUseSwRendering(TBool aUseSwRendering);
+    
+    /**
+     * Returns the flag to free memory using sw rendering. For Alf and other plugins that use sw rendering to reduces gpu mem usage.
+     * @since S60 5.0
+     */ 
+    TBool UseSwRendering();
+    
 // from MGOomActionObserver
 
     /**
@@ -251,6 +264,7 @@
     
     TUint iCurrentPluginRun;
     RArray<TInt> iLowOnMemWgs;
+    TBool iUseSwRendering;
     };
 
 #include "goomactionlist.inl"
--- a/uiacceltk/hitchcock/goommonitor/inc/goomapplicationconfig.h	Fri Apr 16 15:56:24 2010 +0300
+++ b/uiacceltk/hitchcock/goommonitor/inc/goomapplicationconfig.h	Mon May 03 13:22:43 2010 +0300
@@ -73,6 +73,7 @@
     TUint iLowRamThreshold; 
     TUint iTargetFree;
     TUint iSkipPluginId;
+    TBool iUseSwRendering;
     
 private:
     
--- a/uiacceltk/hitchcock/goommonitor/inc/goomcloseapp.h	Fri Apr 16 15:56:24 2010 +0300
+++ b/uiacceltk/hitchcock/goommonitor/inc/goomcloseapp.h	Mon May 03 13:22:43 2010 +0300
@@ -52,7 +52,7 @@
      * Call the CGOomAction::MemoryFreed when it is done
      * @param aBytesRequested not used for clsoe app actions
      */
-    virtual void FreeMemory(TInt aBytesRequested);
+    virtual void FreeMemory(TInt aBytesRequested, TBool aUseSwRendering);
     
     ~CGOomCloseApp();
     
--- a/uiacceltk/hitchcock/goommonitor/inc/goomrunplugin.h	Fri Apr 16 15:56:24 2010 +0300
+++ b/uiacceltk/hitchcock/goommonitor/inc/goomrunplugin.h	Mon May 03 13:22:43 2010 +0300
@@ -44,7 +44,7 @@
     
     // Run the GOOM plugin in order to free memory
     // Call the CGOomAction::MemoryFreed when it is done
-    virtual void FreeMemory(TInt aBytesRequested);
+    virtual void FreeMemory(TInt aBytesRequested, TBool aUseSwRendering);
     
     // Call the memory good function on the plugin but...
     // only if there is an outstanding FreeMemory request
@@ -76,6 +76,8 @@
     CGOomPluginWaiter* iPluginWaiter;
     
     TBool iFreeMemoryCalled; // True if FreeMemory has been called since the last call to MemoryGood
+    
+    TBool iFreeMemoryWithSwRenderingCalled;
     };
 
 #include "goomrunplugin.inl"
--- a/uiacceltk/hitchcock/goommonitor/inc/goomrunplugin.inl	Fri Apr 16 15:56:24 2010 +0300
+++ b/uiacceltk/hitchcock/goommonitor/inc/goomrunplugin.inl	Mon May 03 13:22:43 2010 +0300
@@ -31,7 +31,12 @@
 
 inline TBool CGOomRunPlugin::IsRunning()
     {
-    return iPluginWaiter->IsActive();
+    if(iPluginWaiter)
+        {
+        return iPluginWaiter->IsActive();
+        }
+    
+    return EFalse;
     }
 
 inline void CGOomRunPlugin::WaitCompleted()
--- a/uiacceltk/hitchcock/goommonitor/inc/goomrunpluginconfig.h	Fri Apr 16 15:56:24 2010 +0300
+++ b/uiacceltk/hitchcock/goommonitor/inc/goomrunpluginconfig.h	Mon May 03 13:22:43 2010 +0300
@@ -56,6 +56,10 @@
     
     inline TGOomPluginType PluginType();
     
+    inline void SetSwRend(TBool aSwRend);
+    
+    inline TBool IsSwRendSupported();
+    
 private:
     CGOomRunPluginConfig(TUint aPluginId, TGOomPluginType aPluginType);
     
@@ -68,6 +72,8 @@
     TInt iWaitAfterPlugin; // The period to wait after a plugin has been called
     
     TGOomPluginType iPluginType;
+    
+    TBool iSwRenderingSupported;
     };
 
 #include "goomrunpluginconfig.inl"
--- a/uiacceltk/hitchcock/goommonitor/inc/goomrunpluginconfig.inl	Fri Apr 16 15:56:24 2010 +0300
+++ b/uiacceltk/hitchcock/goommonitor/inc/goomrunpluginconfig.inl	Mon May 03 13:22:43 2010 +0300
@@ -60,4 +60,13 @@
     return iTargetAppId;
     }
 
+inline void CGOomRunPluginConfig::SetSwRend(TBool aSwRend)
+    {
+    iSwRenderingSupported = aSwRend;
+    }
+
+inline TBool CGOomRunPluginConfig::IsSwRendSupported()
+    {
+    return iSwRenderingSupported;
+    }
 #endif /*GOOMRUNPLUGINCONFIGINL_H_*/
--- a/uiacceltk/hitchcock/goommonitor/inc/traceconfiguration.hrh	Fri Apr 16 15:56:24 2010 +0300
+++ b/uiacceltk/hitchcock/goommonitor/inc/traceconfiguration.hrh	Mon May 03 13:22:43 2010 +0300
@@ -25,11 +25,11 @@
 //
 
 // just to make it easier to enable traces on rel builds also
-#ifdef _DEBUG
+//#ifdef _DEBUG
     #define _GOOM_DEBUG
     #define __GOOM_INFO_TRACE__
     #define __GOOM_FUNC_TRACE__
-#endif
+//#endif
 
 /**
 * Error trace enabled
--- a/uiacceltk/hitchcock/goommonitor/src/goomactionlist.cpp	Fri Apr 16 15:56:24 2010 +0300
+++ b/uiacceltk/hitchcock/goommonitor/src/goomactionlist.cpp	Mon May 03 13:22:43 2010 +0300
@@ -380,7 +380,7 @@
 
         iFreeingMemory = ETrue;
         TRACES2("CGOomActionList::FreeMemory: Running action %d which has priority %d", iCurrentActionIndex,ref.Priority());
-        action->FreeMemory(iCurrentTarget - memoryEstimate);
+        action->FreeMemory(iCurrentTarget - memoryEstimate, iUseSwRendering);
         iCurrentPluginRun = 0;
         memoryFreeingActionRun = ETrue;
 
@@ -414,6 +414,12 @@
             }
         // ... otherwise continue running actions, don't wait for any existing ones to complete
         iCurrentActionIndex++;
+        
+        if (iCurrentActionIndex >= iActionRefs.Count())
+            {
+            StateChanged();
+            return;
+            }
         }
 
 
@@ -742,3 +748,13 @@
     {
     return iRunningKillAppActions;
     }
+
+void CGOomActionList::SetUseSwRendering(TBool aUseSwRendering)
+    {
+    iUseSwRendering = aUseSwRendering;
+    }
+
+TBool CGOomActionList::UseSwRendering()
+    {
+    return iUseSwRendering;
+    }
--- a/uiacceltk/hitchcock/goommonitor/src/goomcloseapp.cpp	Fri Apr 16 15:56:24 2010 +0300
+++ b/uiacceltk/hitchcock/goommonitor/src/goomcloseapp.cpp	Mon May 03 13:22:43 2010 +0300
@@ -38,7 +38,7 @@
 
 // Close the application in order to free memory
 // Call the CGOomAction::MemoryFreed when it is done
-void CGOomCloseApp::FreeMemory(TInt)
+void CGOomCloseApp::FreeMemory(TInt, TBool)
     {
     FUNC_LOG;
 
--- a/uiacceltk/hitchcock/goommonitor/src/goomconfigparser.cpp	Fri Apr 16 15:56:24 2010 +0300
+++ b/uiacceltk/hitchcock/goommonitor/src/goomconfigparser.cpp	Mon May 03 13:22:43 2010 +0300
@@ -57,6 +57,7 @@
 KGOomErrBadGoodThresholdValueForAppConfig,
 KGOomErrBadTargetFreeValueForAppConfig,
 KGOomErrBadSkipPluginValueForAppConfig,
+KGOomErrBadUseSwRenderingValueForAppConfig,
 KGOomErrSystemPluginSettingsMustComeAfterAppCloseSettings,
 KGOomErrAppPluginSettingsMustComeAfterSystemPluginSettings,
 KGOomErrAppPluginIdleTimeRulesMustComeAfterAppPluginSettings,
@@ -80,7 +81,8 @@
 KGOomErrAppCloseIdleRuleOutsideAppCloseElement,
 KGOomErrForegroundAppRuleOutsideAppCloseElement,
 KGOomErrPluginIdleRuleOutsideAppPluginElement,
-KGOomErrPluginForegroundRuleOutsidePluginElement
+KGOomErrPluginForegroundRuleOutsidePluginElement,
+KGOomErrInvalidSwRendConfig
 };
 
 
@@ -127,6 +129,9 @@
 //App specific
 _LIT8(KGOomAttributeTargetFreeOnStartup, "target_free_on_startup");
 _LIT8(KGOomAttributeSkipPlugin, "skip_plugin");
+_LIT8(KGOomAttributeUseSwRendering, "use_sw_rend");
+_LIT8(KGOomConfigUseSwRend, "Yes");
+_LIT8(KGOomConfigNotUseSwRend, "No");
 
 // System plugins 
 
@@ -173,6 +178,10 @@
 _LIT8(KGOomConfigBusyAppUid, "BUSY_APP");
 _LIT8(KGOomConfigHighPriorityAppUid, "HIGH_PRIORITY_APP");
 
+_LIT8(KGOomAttibuteSwRend, "sw_rend");
+_LIT8(KGOomConfigSwRendSupported, "supported");
+_LIT8(KGOomConfigSwRendNotSupported, "not_supported");
+
 CGOomConfigParser::CGOomConfigParser(CGOomConfig& aConfig, RFs& aFs) : iConfig(aConfig), iFs(aFs), iState(EGOomParsingStateNone)
     {
     }
@@ -501,7 +510,33 @@
                 ConfigError(KGOomErrBadSkipPluginValueForAppConfig);
             }
                 
-    
+        // Get the software rendering config
+        if (err == KErrNone)
+            {
+            TPtrC8 swrendString;
+            TInt err = GetValueFromAttributeList(aAttributes, KGOomAttributeUseSwRendering, swrendString);
+            if (err == KErrNone)
+                {
+                if (swrendString == KGOomConfigUseSwRend)
+                    {
+                    TRACES1("Sw Rend configured for App %x", uid); 
+                    appConfig->iUseSwRendering = ETrue;
+                    }
+                else
+                    {
+                    appConfig->iUseSwRendering = EFalse;
+                    }
+                }
+            else if (err == KErrNotFound)
+                {
+                err = KErrNone;
+                appConfig->iUseSwRendering = EFalse;
+                }
+            
+            if (err != KErrNone)
+                ConfigError(KGOomErrBadUseSwRenderingValueForAppConfig);
+            }
+        
     // Add the applciation config to the main config
     if ((err == KErrNone) && (appConfig))
         {
@@ -772,8 +807,21 @@
          {
          // Get the config for the sync mode for this plugin (if one is specified) and set it
          SetPluginSyncMode(aAttributes, *pluginConfig);
+        
+         TPtrC8 swrendString;
+         TInt err = GetValueFromAttributeList(aAttributes, KGOomAttibuteSwRend, swrendString);
+         if (err == KErrNone)
+             {
+             if (swrendString == KGOomConfigSwRendSupported)
+                 pluginConfig->SetSwRend(ETrue);
+             else if (swrendString == KGOomConfigSwRendNotSupported)
+                 pluginConfig->SetSwRend(EFalse);
+             else
+                 ConfigError(KGOomErrInvalidSwRendConfig);
+             }
+         
          }
-
+          
      iConfig.AddPluginConfigL(pluginConfig);
      
      CleanupStack::Pop(pluginConfig);
--- a/uiacceltk/hitchcock/goommonitor/src/goommemorymonitor.cpp	Fri Apr 16 15:56:24 2010 +0300
+++ b/uiacceltk/hitchcock/goommonitor/src/goommemorymonitor.cpp	Mon May 03 13:22:43 2010 +0300
@@ -231,7 +231,7 @@
         TRACES1("FreeMemThresholdCrossedL : crossed low threshold %d", iLowThreshold);
         iMemAllocationsGrowing->Stop();
         iMemAllocationsGoingDown->Continue();
-        if(iTrigger == EGOomTriggerNone)
+        if((iTrigger == EGOomTriggerNone) && !NeedToPostponeMemGood() && !iSynchTimer->IsActive() )
             StartFreeSomeRamL(iGoodThreshold, EGOomTriggerThresholdCrossed);
         }
 #endif
@@ -251,9 +251,11 @@
 
     // Refresh the low and good memory thresholds as they may have changed due to the new foreground application
     RefreshThresholds(aForegroundAppUid);
-    // Not very elegant, now we poll on each window group change
-    // Should have better trigger e.g. from window server 
-	StartFreeSomeRamL(iCurrentTarget, EGOomTriggerFocusChanged);
+    
+    if(iCurrentTarget)
+        {
+        StartFreeSomeRamL(iCurrentTarget, EGOomTriggerFocusChanged);
+        }
      }
 
 void CMemoryMonitor::StartFreeSomeRamL(TInt aTargetFree, TInt aMaxPriority, TGOomTrigger aTrigger) // The maximum priority of action to run
@@ -275,14 +277,17 @@
 
     if (freeMemoryAboveCurrentTarget)
         {
-        ResetTargets();
         /*if(freeMemory >= iGoodThreshold && !NeedToPostponeMemGood())
             {
                 iGOomActionList->MemoryGood();
             }
         */
-        iServer->CloseAppsFinished(freeMemory, ETrue);
-        return;
+        if(!iGOomActionList->UseSwRendering())
+            {
+            iServer->CloseAppsFinished(freeMemory, ETrue);
+            WaitAndSynchroniseMemoryState();
+            return;
+            }
         }
 
     // update wg list only when actually about to use it 
@@ -379,11 +384,12 @@
     // Calculate the desired good threshold, this could be the globally configured value...
     iGoodThreshold = CMemoryMonitor::GlobalConfig().iGoodRamThreshold;
     iLowThreshold = CMemoryMonitor::GlobalConfig().iLowRamThreshold;
-    if(iCurrentTarget < iLowThreshold)
-        iCurrentTarget = iLowThreshold;
+    //if(iCurrentTarget < iLowThreshold)
+    //    iCurrentTarget = iLowThreshold;
         
     TRACES2("CMemoryMonitor::RefreshThresholds: Global Good Threshold = %d, Global Low Threshold = %d", iGoodThreshold, iLowThreshold);
 
+    TBool useSwRendering = EFalse;
     // The global value can be overridden by an app specific value
     // Find the application config entry for the foreground application
     if (aForegroundAppUid == KErrNotFound)
@@ -412,7 +418,15 @@
         TRACES2("CMemoryMonitor::RefreshThresholds: For foreground app %x, Target Free on Startup = %d", aForegroundAppUid, iCurrentTarget);
         }
     
+
+    if (iConfig->GetApplicationConfig(aForegroundAppUid).iUseSwRendering != KGOomThresholdUnset)
+        {
+        useSwRendering = iConfig->GetApplicationConfig(aForegroundAppUid).iUseSwRendering;
+        TRACES2("CMemoryMonitor::RefreshThresholds: For foreground app %x, UseSwRendering = %d", aForegroundAppUid, useSwRendering);
+        }
+    
     iGOomActionList->SetCurrentTarget(iCurrentTarget);
+    iGOomActionList->SetUseSwRendering(useSwRendering);
     
 #ifdef USE_ASYNCYH_NOTIFICATIONS 
 
@@ -467,7 +481,10 @@
     iCurrentTarget = aTarget;
     iGOomActionList->SetCurrentTarget(iCurrentTarget);
     if(!aTarget)
+        {
         iTrigger = EGOomTriggerNone;    //reset the trigger condition
+        }
+    iGOomActionList->SetUseSwRendering(EFalse);
     }
 
 void CMemoryMonitor::SetPriorityBusy(TInt aWgId)
@@ -592,7 +609,17 @@
                 break;
                 }
             case EGL_PROF_PROCESS_USED_PRIVATE_MEMORY_NOK:
+                    {
+                    TUint mem = prof_data[i];
+                    TRACES1("Private memory Usage by app is %d", mem);
+                    break;
+                    }
             case EGL_PROF_PROCESS_USED_SHARED_MEMORY_NOK:
+                    {
+                    TUint mem = prof_data[i];
+                    TRACES1("Shared memory Usage by app is %d", mem);
+                    break;
+                    }
 			default:
 				{
                 i++;
--- a/uiacceltk/hitchcock/goommonitor/src/goommonitorplugin.cpp	Fri Apr 16 15:56:24 2010 +0300
+++ b/uiacceltk/hitchcock/goommonitor/src/goommonitorplugin.cpp	Mon May 03 13:22:43 2010 +0300
@@ -101,12 +101,12 @@
     {
     }
 
-void CAppGOomMonitorPlugin::FreeRam(TInt)
+void CAppGOomMonitorPlugin::FreeRam(TInt, TBool)
     {
     SendMessageToApp(KAppGOomMonitor_FreeRam);
     }
 
-void CAppGOomMonitorPlugin::MemoryGood()
+void CAppGOomMonitorPlugin::MemoryGood(TBool)
     {
     SendMessageToApp(KAppGOomMonitor_MemoryGood);
     }
--- a/uiacceltk/hitchcock/goommonitor/src/goomrunplugin.cpp	Fri Apr 16 15:56:24 2010 +0300
+++ b/uiacceltk/hitchcock/goommonitor/src/goomrunplugin.cpp	Mon May 03 13:22:43 2010 +0300
@@ -36,7 +36,7 @@
 
 // Run the GOOM plugin in order to free memory
 // Call the CGOomAction::MemoryFreed when it is done
-void CGOomRunPlugin::FreeMemory(TInt aBytesRequested)
+void CGOomRunPlugin::FreeMemory(TInt aBytesRequested, TBool aUseSwRendering)
     {
     FUNC_LOG;
     TRACES1("CGOomRunPlugin::FreeMemory: iPluginId = 0x%x", iPluginId);
@@ -47,12 +47,25 @@
     TInt clientId = iStateChangeObserver.ClientId();
     TAny* anyp = (TAny*) &clientId;
     iPlugin.ExtensionInterface(TUid::Uid(KGoomClientSecureId), anyp);
-    iPlugin.FreeRam(aBytesRequested);
+    
+    if(aUseSwRendering && iConfig.IsSwRendSupported())
+        {
+		TInt flags = KGOomUseSwRendering;
+        iPlugin.FreeRam(aBytesRequested, flags);
+        iFreeMemoryWithSwRenderingCalled = ETrue;
+        }
+    else
+        {
+        iPlugin.FreeRam(aBytesRequested, 0);
+        }
 
     iFreeMemoryCalled = ETrue;
 
     // Wait for the required time before we signal completion.
-    iPluginWaiter->Start();
+    if(iPluginWaiter)
+        {
+        iPluginWaiter->Start();
+        }
     }
 
 // Call the memory good function on the plugin but...
@@ -63,8 +76,12 @@
 
     if (iFreeMemoryCalled)
         {
-        iPlugin.MemoryGood();
+		TInt flags = 0;
+		if(iFreeMemoryWithSwRenderingCalled)
+			flags = KGOomUseSwRendering;
+        iPlugin.MemoryGood(flags);
         iFreeMemoryCalled = EFalse;
+        iFreeMemoryWithSwRenderingCalled = EFalse;
         }
     }
 
@@ -86,13 +103,15 @@
 
     TInt waitDuration = CMemoryMonitor::GlobalConfig().iDefaultWaitAfterPlugin;
 
-    if (aPluginConfig.WaitAfterPluginDefined())
+    if(aPluginConfig.iSyncMode == ECheckRam)
         {
-        // If the wait duration for this plugin is overridden then use the overridden value
-        waitDuration = aPluginConfig.WaitAfterPlugin();
+        if (aPluginConfig.WaitAfterPluginDefined())
+            {
+            // If the wait duration for this plugin is overridden then use the overridden value
+            waitDuration = aPluginConfig.WaitAfterPlugin();
+            }
+         iPluginWaiter = CGOomPluginWaiter::NewL(waitDuration, *this);
         }
-
-    iPluginWaiter = CGOomPluginWaiter::NewL(waitDuration, *this);
     }
 
 TUint CGOomRunPlugin::Id()
--- a/uiacceltk/hitchcock/goommonitor/src/goomwindowgrouplist.cpp	Fri Apr 16 15:56:24 2010 +0300
+++ b/uiacceltk/hitchcock/goommonitor/src/goomwindowgrouplist.cpp	Mon May 03 13:22:43 2010 +0300
@@ -73,10 +73,14 @@
         User::LeaveIfError(iAlfClient.Connect());
         }
     iLowOnMemWgs.Reset();
-    User::LeaveIfError(iAlfClient.GetListOfInactiveWindowGroupsWSurfaces(&iLowOnMemWgs));
+    RArray<TInt> inactiveSurfaces;
 
-    RArray<TInt>& inactiveSurfaces = iLowOnMemWgs;
+    User::LeaveIfError(iAlfClient.GetListOfInactiveWindowGroupsWSurfaces(&inactiveSurfaces));    
+    User::LeaveIfError(iAlfClient.GetListOfWindowGroupsWSurfaces(&iLowOnMemWgs));
+        
     TRACES1("Inactive surfaces count %d", inactiveSurfaces.Count());     
+    TRACES1("Windowgroups w/ surfaces count %d", iLowOnMemWgs.Count());     
+
     RArray<TUint64> processIds;
     RArray<TUint> privMemUsed;
     RArray<TUint64> sparedProcessIds;
@@ -213,9 +217,9 @@
     TWsEvent event;
     event.SetType(KGoomMemoryLowEvent); // naive
 
-    for (TInt i = inactiveSurfaces.Count()-1; i>=0; i--)
+    for (TInt i = iLowOnMemWgs.Count()-1; i>=0; i--)
         {
-        iWs.SendEventToWindowGroup(inactiveSurfaces[i], event);
+        iWs.SendEventToWindowGroup(iLowOnMemWgs[i], event);
         }
         
 #endif    
--- a/uiacceltk/hitchcock/group/core_exports.inc	Fri Apr 16 15:56:24 2010 +0300
+++ b/uiacceltk/hitchcock/group/core_exports.inc	Mon May 03 13:22:43 2010 +0300
@@ -3,7 +3,7 @@
 *  Name        : core_exports.inc
 *  Part of     : Alfred UI Toolkit
 *  Description : Exported header files.
-*  Version     : %version: tr1sido#8.1.33 %
+*  Version     : %version: tr1sido#8.1.36 %
 *
 *  Copyright © 2006-2007 Nokia.  All rights reserved.
 *  This material, including documentation and any related computer
@@ -33,18 +33,23 @@
 
 // for EMULATOR UREL
 ../coretoolkit/data/activeidle_viewswitch_add_page.fxml /epoc32/release/winscw/urel/z/resource/effects/activeidle_viewswitch_add_page.fxml
-../coretoolkit/data/activeidle_viewswitch_bg_appear.fxml /epoc32/release/winscw/urel/z/resource/effects/activeidle_viewswitch_bg_appear.fxml
+../coretoolkit/data/activeidle_viewswitch_bg_anim_to_image.fxml /epoc32/release/winscw/urel/z/resource/effects/activeidle_viewswitch_bg_anim_to_image.fxml
+../coretoolkit/data/activeidle_viewswitch_bg_image_to_image.fxml /epoc32/release/winscw/urel/z/resource/effects/activeidle_viewswitch_bg_image_to_image.fxml
 ../coretoolkit/data/activeidle_viewswitch_close_editmode.fxml /epoc32/release/winscw/urel/z/resource/effects/activeidle_viewswitch_close_editmode.fxml
 ../coretoolkit/data/activeidle_viewswitch_close_widgetmanager.fxml /epoc32/release/winscw/urel/z/resource/effects/activeidle_viewswitch_close_widgetmanager.fxml
 ../coretoolkit/data/activeidle_viewswitch_left.fxml /epoc32/release/winscw/urel/z/resource/effects/activeidle_viewswitch_left.fxml
-../coretoolkit/data/activeidle_viewswitch_left_appear.fxml /epoc32/release/winscw/urel/z/resource/effects/activeidle_viewswitch_left_appear.fxml
-../coretoolkit/data/activeidle_viewswitch_left_disappear.fxml /epoc32/release/winscw/urel/z/resource/effects/activeidle_viewswitch_left_disappear.fxml
+../coretoolkit/data/activeidle_viewswitch_left_appear_lsc.fxml /epoc32/release/winscw/urel/z/resource/effects/activeidle_viewswitch_left_appear_lsc.fxml
+../coretoolkit/data/activeidle_viewswitch_left_appear_prt.fxml /epoc32/release/winscw/urel/z/resource/effects/activeidle_viewswitch_left_appear_prt.fxml
+../coretoolkit/data/activeidle_viewswitch_left_disappear_lsc.fxml /epoc32/release/winscw/urel/z/resource/effects/activeidle_viewswitch_left_disappear_lsc.fxml
+../coretoolkit/data/activeidle_viewswitch_left_disappear_prt.fxml /epoc32/release/winscw/urel/z/resource/effects/activeidle_viewswitch_left_disappear_prt.fxml
 ../coretoolkit/data/activeidle_viewswitch_open_editmode.fxml /epoc32/release/winscw/urel/z/resource/effects/activeidle_viewswitch_open_editmode.fxml
 ../coretoolkit/data/activeidle_viewswitch_open_widgetmanager.fxml /epoc32/release/winscw/urel/z/resource/effects/activeidle_viewswitch_open_widgetmanager.fxml
 ../coretoolkit/data/activeidle_viewswitch_remove_page.fxml /epoc32/release/winscw/urel/z/resource/effects/activeidle_viewswitch_remove_page.fxml
 ../coretoolkit/data/activeidle_viewswitch_right.fxml /epoc32/release/winscw/urel/z/resource/effects/activeidle_viewswitch_right.fxml
-../coretoolkit/data/activeidle_viewswitch_right_appear.fxml /epoc32/release/winscw/urel/z/resource/effects/activeidle_viewswitch_right_appear.fxml
-../coretoolkit/data/activeidle_viewswitch_right_disappear.fxml /epoc32/release/winscw/urel/z/resource/effects/activeidle_viewswitch_right_disappear.fxml
+../coretoolkit/data/activeidle_viewswitch_right_appear_lsc.fxml /epoc32/release/winscw/urel/z/resource/effects/activeidle_viewswitch_right_appear_lsc.fxml
+../coretoolkit/data/activeidle_viewswitch_right_appear_prt.fxml /epoc32/release/winscw/urel/z/resource/effects/activeidle_viewswitch_right_appear_prt.fxml
+../coretoolkit/data/activeidle_viewswitch_right_disappear_lsc.fxml /epoc32/release/winscw/urel/z/resource/effects/activeidle_viewswitch_right_disappear_lsc.fxml
+../coretoolkit/data/activeidle_viewswitch_right_disappear_prt.fxml /epoc32/release/winscw/urel/z/resource/effects/activeidle_viewswitch_right_disappear_prt.fxml
 ../coretoolkit/data/app_activate.fxml /epoc32/release/winscw/urel/z/resource/effects/app_activate.fxml
 ../coretoolkit/data/app_exit.fxml /epoc32/release/winscw/urel/z/resource/effects/app_exit.fxml
 ../coretoolkit/data/app_start.fxml /epoc32/release/winscw/urel/z/resource/effects/app_start.fxml
@@ -87,8 +92,8 @@
 ../coretoolkit/data/optionsmenu_disappear.fxml /epoc32/release/winscw/urel/z/resource/effects/optionsmenu_disappear.fxml
 ../coretoolkit/data/photos_fullscreen_close.fxml /epoc32/release/winscw/urel/z/resource/effects/photos_fullscreen_close.fxml
 ../coretoolkit/data/photos_fullscreen_open.fxml /epoc32/release/winscw/urel/z/resource/effects/photos_fullscreen_open.fxml
+../coretoolkit/data/photos_gridview_appear.fxml /epoc32/release/winscw/urel/z/resource/effects/photos_gridview_appear.fxml
 ../coretoolkit/data/photos_gridview_disappear.fxml /epoc32/release/winscw/urel/z/resource/effects/photos_gridview_disappear.fxml
-../coretoolkit/data/photos_gridview_appear.fxml /epoc32/release/winscw/urel/z/resource/effects/photos_gridview_appear.fxml
 ../coretoolkit/data/popup_appear.fxml /epoc32/release/winscw/urel/z/resource/effects/popup_appear.fxml
 ../coretoolkit/data/popup_disappear.fxml /epoc32/release/winscw/urel/z/resource/effects/popup_disappear.fxml
 ../coretoolkit/data/popup_disappear_screenshot.fxml /epoc32/release/winscw/urel/z/resource/effects/popup_disappear_screenshot.fxml
@@ -100,7 +105,6 @@
 ../coretoolkit/data/systemnotify_appear.fxml /epoc32/release/winscw/urel/z/resource/effects/systemnotify_appear.fxml
 ../coretoolkit/data/systemnotify_disappear.fxml /epoc32/release/winscw/urel/z/resource/effects/systemnotify_disappear.fxml
 ../coretoolkit/data/tab_effect.fxml /epoc32/release/winscw/urel/z/resource/effects/tab_effect.fxml
-../coretoolkit/data/taskswapper_app_start_disappear.fxml /epoc32/release/winscw/urel/z/resource/effects/taskswapper_app_start_disappear.fxml
 ../coretoolkit/data/taskswapper_app_start_rect.fxml /epoc32/release/winscw/urel/z/resource/effects/taskswapper_app_start_rect.fxml
 ../coretoolkit/data/taskswapper_appear.fxml /epoc32/release/winscw/urel/z/resource/effects/taskswapper_appear.fxml
 ../coretoolkit/data/taskswapper_disappear.fxml /epoc32/release/winscw/urel/z/resource/effects/taskswapper_disappear.fxml
@@ -121,18 +125,23 @@
 
 // for EMULATOR UDEB
 ../coretoolkit/data/activeidle_viewswitch_add_page.fxml /epoc32/release/winscw/udeb/z/resource/effects/activeidle_viewswitch_add_page.fxml
-../coretoolkit/data/activeidle_viewswitch_bg_appear.fxml /epoc32/release/winscw/udeb/z/resource/effects/activeidle_viewswitch_bg_appear.fxml
+../coretoolkit/data/activeidle_viewswitch_bg_anim_to_image.fxml /epoc32/release/winscw/udeb/z/resource/effects/activeidle_viewswitch_bg_anim_to_image.fxml
+../coretoolkit/data/activeidle_viewswitch_bg_image_to_image.fxml /epoc32/release/winscw/udeb/z/resource/effects/activeidle_viewswitch_bg_image_to_image.fxml
 ../coretoolkit/data/activeidle_viewswitch_close_editmode.fxml /epoc32/release/winscw/udeb/z/resource/effects/activeidle_viewswitch_close_editmode.fxml
 ../coretoolkit/data/activeidle_viewswitch_close_widgetmanager.fxml /epoc32/release/winscw/udeb/z/resource/effects/activeidle_viewswitch_close_widgetmanager.fxml
 ../coretoolkit/data/activeidle_viewswitch_left.fxml /epoc32/release/winscw/udeb/z/resource/effects/activeidle_viewswitch_left.fxml
-../coretoolkit/data/activeidle_viewswitch_left_appear.fxml /epoc32/release/winscw/udeb/z/resource/effects/activeidle_viewswitch_left_appear.fxml
-../coretoolkit/data/activeidle_viewswitch_left_disappear.fxml /epoc32/release/winscw/udeb/z/resource/effects/activeidle_viewswitch_left_disappear.fxml
+../coretoolkit/data/activeidle_viewswitch_left_appear_lsc.fxml /epoc32/release/winscw/udeb/z/resource/effects/activeidle_viewswitch_left_appear_lsc.fxml
+../coretoolkit/data/activeidle_viewswitch_left_appear_prt.fxml /epoc32/release/winscw/udeb/z/resource/effects/activeidle_viewswitch_left_appear_prt.fxml
+../coretoolkit/data/activeidle_viewswitch_left_disappear_lsc.fxml /epoc32/release/winscw/udeb/z/resource/effects/activeidle_viewswitch_left_disappear_lsc.fxml
+../coretoolkit/data/activeidle_viewswitch_left_disappear_prt.fxml /epoc32/release/winscw/udeb/z/resource/effects/activeidle_viewswitch_left_disappear_prt.fxml
 ../coretoolkit/data/activeidle_viewswitch_open_editmode.fxml /epoc32/release/winscw/udeb/z/resource/effects/activeidle_viewswitch_open_editmode.fxml
 ../coretoolkit/data/activeidle_viewswitch_open_widgetmanager.fxml /epoc32/release/winscw/udeb/z/resource/effects/activeidle_viewswitch_open_widgetmanager.fxml
 ../coretoolkit/data/activeidle_viewswitch_remove_page.fxml /epoc32/release/winscw/udeb/z/resource/effects/activeidle_viewswitch_remove_page.fxml
 ../coretoolkit/data/activeidle_viewswitch_right.fxml /epoc32/release/winscw/udeb/z/resource/effects/activeidle_viewswitch_right.fxml
-../coretoolkit/data/activeidle_viewswitch_right_appear.fxml /epoc32/release/winscw/udeb/z/resource/effects/activeidle_viewswitch_right_appear.fxml
-../coretoolkit/data/activeidle_viewswitch_right_disappear.fxml /epoc32/release/winscw/udeb/z/resource/effects/activeidle_viewswitch_right_disappear.fxml
+../coretoolkit/data/activeidle_viewswitch_right_appear_lsc.fxml /epoc32/release/winscw/udeb/z/resource/effects/activeidle_viewswitch_right_appear_lsc.fxml
+../coretoolkit/data/activeidle_viewswitch_right_appear_prt.fxml /epoc32/release/winscw/udeb/z/resource/effects/activeidle_viewswitch_right_appear_prt.fxml
+../coretoolkit/data/activeidle_viewswitch_right_disappear_lsc.fxml /epoc32/release/winscw/udeb/z/resource/effects/activeidle_viewswitch_right_disappear_lsc.fxml
+../coretoolkit/data/activeidle_viewswitch_right_disappear_prt.fxml /epoc32/release/winscw/udeb/z/resource/effects/activeidle_viewswitch_right_disappear_prt.fxml
 ../coretoolkit/data/app_activate.fxml /epoc32/release/winscw/udeb/z/resource/effects/app_activate.fxml
 ../coretoolkit/data/app_exit.fxml /epoc32/release/winscw/udeb/z/resource/effects/app_exit.fxml
 ../coretoolkit/data/app_start.fxml /epoc32/release/winscw/udeb/z/resource/effects/app_start.fxml
@@ -173,10 +182,10 @@
 ../coretoolkit/data/optionsmenu_cascade_appear.fxml /epoc32/release/winscw/udeb/z/resource/effects/optionsmenu_cascade_appear.fxml
 ../coretoolkit/data/optionsmenu_cascade_disappear.fxml /epoc32/release/winscw/udeb/z/resource/effects/optionsmenu_cascade_disappear.fxml
 ../coretoolkit/data/optionsmenu_disappear.fxml /epoc32/release/winscw/udeb/z/resource/effects/optionsmenu_disappear.fxml
+../coretoolkit/data/photos_fullscreen_close.fxml /epoc32/release/winscw/udeb/z/resource/effects/photos_fullscreen_close.fxml
+../coretoolkit/data/photos_fullscreen_open.fxml /epoc32/release/winscw/udeb/z/resource/effects/photos_fullscreen_open.fxml
 ../coretoolkit/data/photos_gridview_appear.fxml /epoc32/release/winscw/udeb/z/resource/effects/photos_gridview_appear.fxml
 ../coretoolkit/data/photos_gridview_disappear.fxml /epoc32/release/winscw/udeb/z/resource/effects/photos_gridview_disappear.fxml
-../coretoolkit/data/photos_fullscreen_close.fxml /epoc32/release/winscw/udeb/z/resource/effects/photos_fullscreen_close.fxml
-../coretoolkit/data/photos_fullscreen_open.fxml /epoc32/release/winscw/udeb/z/resource/effects/photos_fullscreen_open.fxml
 ../coretoolkit/data/popup_appear.fxml /epoc32/release/winscw/udeb/z/resource/effects/popup_appear.fxml
 ../coretoolkit/data/popup_disappear.fxml /epoc32/release/winscw/udeb/z/resource/effects/popup_disappear.fxml
 ../coretoolkit/data/popup_disappear_screenshot.fxml /epoc32/release/winscw/udeb/z/resource/effects/popup_disappear_screenshot.fxml
@@ -188,7 +197,6 @@
 ../coretoolkit/data/systemnotify_appear.fxml /epoc32/release/winscw/udeb/z/resource/effects/systemnotify_appear.fxml
 ../coretoolkit/data/systemnotify_disappear.fxml /epoc32/release/winscw/udeb/z/resource/effects/systemnotify_disappear.fxml
 ../coretoolkit/data/tab_effect.fxml /epoc32/release/winscw/udeb/z/resource/effects/tab_effect.fxml
-../coretoolkit/data/taskswapper_app_start_disappear.fxml /epoc32/release/winscw/udeb/z/resource/effects/taskswapper_app_start_disappear.fxml
 ../coretoolkit/data/taskswapper_app_start_rect.fxml /epoc32/release/winscw/udeb/z/resource/effects/taskswapper_app_start_rect.fxml
 ../coretoolkit/data/taskswapper_appear.fxml /epoc32/release/winscw/udeb/z/resource/effects/taskswapper_appear.fxml
 ../coretoolkit/data/taskswapper_disappear.fxml /epoc32/release/winscw/udeb/z/resource/effects/taskswapper_disappear.fxml
@@ -209,18 +217,23 @@
 
 // For ROM
 ../coretoolkit/data/activeidle_viewswitch_add_page.fxml /epoc32/data/z/resource/effects/activeidle_viewswitch_add_page.fxml
-../coretoolkit/data/activeidle_viewswitch_bg_appear.fxml /epoc32/data/z/resource/effects/activeidle_viewswitch_bg_appear.fxml
+../coretoolkit/data/activeidle_viewswitch_bg_anim_to_image.fxml /epoc32/data/z/resource/effects/activeidle_viewswitch_bg_anim_to_image.fxml
+../coretoolkit/data/activeidle_viewswitch_bg_image_to_image.fxml /epoc32/data/z/resource/effects/activeidle_viewswitch_bg_image_to_image.fxml
 ../coretoolkit/data/activeidle_viewswitch_close_editmode.fxml /epoc32/data/z/resource/effects/activeidle_viewswitch_close_editmode.fxml
 ../coretoolkit/data/activeidle_viewswitch_close_widgetmanager.fxml /epoc32/data/z/resource/effects/activeidle_viewswitch_close_widgetmanager.fxml
 ../coretoolkit/data/activeidle_viewswitch_left.fxml /epoc32/data/z/resource/effects/activeidle_viewswitch_left.fxml
-../coretoolkit/data/activeidle_viewswitch_left_appear.fxml /epoc32/data/z/resource/effects/activeidle_viewswitch_left_appear.fxml
-../coretoolkit/data/activeidle_viewswitch_left_disappear.fxml /epoc32/data/z/resource/effects/activeidle_viewswitch_left_disappear.fxml
+../coretoolkit/data/activeidle_viewswitch_left_appear_lsc.fxml /epoc32/data/z/resource/effects/activeidle_viewswitch_left_appear_lsc.fxml
+../coretoolkit/data/activeidle_viewswitch_left_appear_prt.fxml /epoc32/data/z/resource/effects/activeidle_viewswitch_left_appear_prt.fxml
+../coretoolkit/data/activeidle_viewswitch_left_disappear_lsc.fxml /epoc32/data/z/resource/effects/activeidle_viewswitch_left_disappear_lsc.fxml
+../coretoolkit/data/activeidle_viewswitch_left_disappear_prt.fxml /epoc32/data/z/resource/effects/activeidle_viewswitch_left_disappear_prt.fxml
 ../coretoolkit/data/activeidle_viewswitch_open_editmode.fxml /epoc32/data/z/resource/effects/activeidle_viewswitch_open_editmode.fxml
 ../coretoolkit/data/activeidle_viewswitch_open_widgetmanager.fxml /epoc32/data/z/resource/effects/activeidle_viewswitch_open_widgetmanager.fxml
 ../coretoolkit/data/activeidle_viewswitch_remove_page.fxml /epoc32/data/z/resource/effects/activeidle_viewswitch_remove_page.fxml
 ../coretoolkit/data/activeidle_viewswitch_right.fxml /epoc32/data/z/resource/effects/activeidle_viewswitch_right.fxml
-../coretoolkit/data/activeidle_viewswitch_right_appear.fxml /epoc32/data/z/resource/effects/activeidle_viewswitch_right_appear.fxml
-../coretoolkit/data/activeidle_viewswitch_right_disappear.fxml /epoc32/data/z/resource/effects/activeidle_viewswitch_right_disappear.fxml
+../coretoolkit/data/activeidle_viewswitch_right_appear_lsc.fxml /epoc32/data/z/resource/effects/activeidle_viewswitch_right_appear_lsc.fxml
+../coretoolkit/data/activeidle_viewswitch_right_appear_prt.fxml /epoc32/data/z/resource/effects/activeidle_viewswitch_right_appear_prt.fxml
+../coretoolkit/data/activeidle_viewswitch_right_disappear_lsc.fxml /epoc32/data/z/resource/effects/activeidle_viewswitch_right_disappear_lsc.fxml
+../coretoolkit/data/activeidle_viewswitch_right_disappear_prt.fxml /epoc32/data/z/resource/effects/activeidle_viewswitch_right_disappear_prt.fxml
 ../coretoolkit/data/app_activate.fxml /epoc32/data/z/resource/effects/app_activate.fxml
 ../coretoolkit/data/app_exit.fxml /epoc32/data/z/resource/effects/app_exit.fxml
 ../coretoolkit/data/app_start.fxml /epoc32/data/z/resource/effects/app_start.fxml
@@ -261,10 +274,10 @@
 ../coretoolkit/data/optionsmenu_cascade_appear.fxml /epoc32/data/z/resource/effects/optionsmenu_cascade_appear.fxml
 ../coretoolkit/data/optionsmenu_cascade_disappear.fxml /epoc32/data/z/resource/effects/optionsmenu_cascade_disappear.fxml
 ../coretoolkit/data/optionsmenu_disappear.fxml /epoc32/data/z/resource/effects/optionsmenu_disappear.fxml
+../coretoolkit/data/photos_fullscreen_close.fxml /epoc32/data/z/resource/effects/photos_fullscreen_close.fxml
+../coretoolkit/data/photos_fullscreen_open.fxml /epoc32/data/z/resource/effects/photos_fullscreen_open.fxml
 ../coretoolkit/data/photos_gridview_appear.fxml /epoc32/data/z/resource/effects/photos_gridview_appear.fxml
 ../coretoolkit/data/photos_gridview_disappear.fxml /epoc32/data/z/resource/effects/photos_gridview_disappear.fxml
-../coretoolkit/data/photos_fullscreen_close.fxml /epoc32/data/z/resource/effects/photos_fullscreen_close.fxml
-../coretoolkit/data/photos_fullscreen_open.fxml /epoc32/data/z/resource/effects/photos_fullscreen_open.fxml
 ../coretoolkit/data/popup_appear.fxml /epoc32/data/z/resource/effects/popup_appear.fxml
 ../coretoolkit/data/popup_disappear.fxml /epoc32/data/z/resource/effects/popup_disappear.fxml
 ../coretoolkit/data/popup_disappear_screenshot.fxml /epoc32/data/z/resource/effects/popup_disappear_screenshot.fxml
@@ -276,7 +289,6 @@
 ../coretoolkit/data/systemnotify_appear.fxml /epoc32/data/z/resource/effects/systemnotify_appear.fxml
 ../coretoolkit/data/systemnotify_disappear.fxml /epoc32/data/z/resource/effects/systemnotify_disappear.fxml
 ../coretoolkit/data/tab_effect.fxml /epoc32/data/z/resource/effects/tab_effect.fxml
-../coretoolkit/data/taskswapper_app_start_disappear.fxml /epoc32/data/z/resource/effects/taskswapper_app_start_disappear.fxml
 ../coretoolkit/data/taskswapper_app_start_rect.fxml /epoc32/data/z/resource/effects/taskswapper_app_start_rect.fxml
 ../coretoolkit/data/taskswapper_appear.fxml /epoc32/data/z/resource/effects/taskswapper_appear.fxml
 ../coretoolkit/data/taskswapper_disappear.fxml /epoc32/data/z/resource/effects/taskswapper_disappear.fxml
--- a/uiacceltk/hitchcock/plugins/alfoogmplugin/src/alfoogmplugin.cpp	Fri Apr 16 15:56:24 2010 +0300
+++ b/uiacceltk/hitchcock/plugins/alfoogmplugin/src/alfoogmplugin.cpp	Mon May 03 13:22:43 2010 +0300
@@ -30,8 +30,8 @@
     void ConstructL();
 
 public:
-    void FreeRam(TInt aBytesToFree);
-    void MemoryGood();
+    void FreeRam(TInt aBytesToFree, TInt  aFlags);
+    void MemoryGood(TInt  aFlags);
 
 private:
     RAlfDirectClient iAlfDirectClient;
@@ -68,18 +68,20 @@
 // Tries to free RAM.
 // -----------------------------------------------------------------------------
 //
-void CAlfOogmMonitorPlugin::FreeRam(TInt aBytesToFree)
+void CAlfOogmMonitorPlugin::FreeRam(TInt aBytesToFree, TInt  aFlags)
     {
- 	iAlfDirectClient.EnableLowMemoryState(aBytesToFree);
+	TBool useSwRend = aFlags & KGOomUseSwRendering;
+ 	iAlfDirectClient.EnableLowMemoryState(aBytesToFree, useSwRend);
     }
 
 // -----------------------------------------------------------------------------
 // CAlfOogmMonitorPlugin::MemoryGood
 // -----------------------------------------------------------------------------
 //
-void CAlfOogmMonitorPlugin::MemoryGood()
+void CAlfOogmMonitorPlugin::MemoryGood(TInt  aFlags)
     {
-    iAlfDirectClient.EnableLowMemoryState(EFalse);	
+	TBool useSwRend = aFlags & KGOomUseSwRendering;
+    iAlfDirectClient.EnableLowMemoryState(EFalse, useSwRend);	
     }
 
 // -----------------------------------------------------------------------------
--- a/uiacceltk/hitchcock/plugins/alftranseffect/alfgfxtransadapter/src/gfxtransenginetfx.cpp	Fri Apr 16 15:56:24 2010 +0300
+++ b/uiacceltk/hitchcock/plugins/alftranseffect/alfgfxtransadapter/src/gfxtransenginetfx.cpp	Mon May 03 13:22:43 2010 +0300
@@ -145,6 +145,17 @@
 
 	void IssueReq();
 	inline TType Type();
+	TPtr8** InBuf() { return &iInPtr; }
+	TPtr8** OutBuf() { return &iOutPtr; }
+	
+	void ResetBufs()
+		{
+		delete iInPtr;
+    	iInPtr = 0;
+		delete iOutPtr;
+    	iOutPtr = 0;	
+		}
+		
 private:
 	void RunL();
 	void DoCancel();
@@ -153,7 +164,8 @@
 	MTfxServerObserver* iOwner;
 	CGfxTransAdapterTfx* iParent;
 	TType iType;
-	
+	TPtr8* iInPtr;
+	TPtr8* iOutPtr;
 };
 
 // ---------------------------------------------------------------------------
@@ -175,6 +187,7 @@
 	{
   	__ALFFXLOGSTRING("CAlfTransitionRequest - cancelling and deleting policy request" );
 	Cancel();
+	ResetBufs();
 	}
 	
 // ---------------------------------------------------------------------------
@@ -182,6 +195,8 @@
 //
 void CAlfTransitionRequest::RunL()
 	{
+	ResetBufs();
+
 	if ( iStatus.Int() == KErrCancel )
 	    {
 	    // If the request was cancelled, we are done
@@ -456,12 +471,11 @@
 		case EPreBeginCapture:
 		    break;
 		case EPostBeginCapture:
-		    // If we get KGfxControlAppearAction, it is followed by StartTransition,
-		    // but disappear action is not. Therefore we must handle it byself
-		    // We use begin capture as trigger, as we assume that the control is still present
-		    // at that time. After EPostBeginCapture it will probably be already gone.
-		    // If we don't have plugin yet, there will be no transitions.
-		    if ( action == KGfxControlDisappearAction && iHasPlugin && aKey && aKey->DrawableWindow())
+			// Send control effect request to ALf. This is done immediately after call of 
+			// GfxTransEffect::Begin(). This makes it possible (NOT QUARANTEENED)
+			// that effect request arrives to Alf before possible visiblity changes are made to 
+			// the control.
+		    if ( iHasPlugin && aKey && aKey->DrawableWindow())
 		        {
 		        // We must generate our own transition as we won't be sending 
 		        // iClient->TransitionFinished back.
@@ -743,15 +757,7 @@
 
 	if( err == KErrNone ) 
 		{
-    	if ( transdata->iAction != KGfxControlDisappearAction )
-    	    {
-    	    // Disappear action was started by EPostBeginCapture event
-    		TRAP( err, DoStartTransitionL( aHandle, transdata ) );
-    	    }
-    	else
-    	    {
-            __ALFFXLOGSTRING( "CGfxTransAdapterTfx::StartTransition called for disappear action" );
-    	    }
+       __ALFFXLOGSTRING( "CGfxTransAdapterTfx::StartTransition called for disappear action. Do nothing." );
 		}
 		
     // always finish the caller		
@@ -885,6 +891,7 @@
         if ( iCachedUidMapping.iWindowGroupId > 0 )
             {
             result = iCachedUidMapping.iWindowGroupId;
+            iCachedUidMapping.iSecureId = 0;
             found = true;
             }
         }
@@ -1264,7 +1271,7 @@
 
 void CGfxTransAdapterTfx::GenerateTransitionL( const CCoeControl* aKey, const CTransitionData* aTransData)
     {
-    __ALFFXLOGSTRING("CGfxTransAdapterTfx::GenerateTransitionL >>");
+
     // We generate a transition call from begin capture for control exit transitions
 	TPtr8 inPtr = iTransferBuffer->Des();
 	inPtr.Zero();
@@ -1275,6 +1282,13 @@
     TInt windowGroup = aKey->DrawableWindow()->WindowGroupId();
     TInt windowHandle = aKey->DrawableWindow()->ClientHandle(); 
     
+    __ALFFXLOGSTRING4("CGfxTransAdapterTfx::GenerateTransitionL - Operation: MAlfGfxEffectPlugin::EBeginComponentTransition Action: %d,  Uid: 0x%x, WindowGroup: %d, WindowHandle: %d  >>",
+        aTransData->iAction,
+        aTransData->iUid.iUid,
+        windowGroup,
+        windowHandle
+        );
+    
     inBuf.WriteInt32L( op );
     inBuf.WriteUint32L( aTransData->iAction );
     inBuf.WriteInt32L( aTransData->iUid.iUid );
@@ -1373,10 +1387,15 @@
 		
     // send a request to plugin to start sending us policy updates
     // This is an asynchronous request
+	iPolicyReq->ResetBufs();	
 
-    TPtr8 inPtr = iAsyncTransferBuffer->Des();
+    *(iPolicyReq->InBuf())= new (ELeave) TPtr8(iAsyncTransferBuffer->Des());
+    TPtr8& inPtr = **iPolicyReq->InBuf();
     inPtr.Zero();
-    TPtr8 outPtr = iAsyncReturnBuffer->Des();
+
+    *(iPolicyReq->OutBuf())= new (ELeave) TPtr8(iAsyncReturnBuffer->Des());
+    TPtr8& outPtr = **iPolicyReq->OutBuf();
+
     outPtr.Zero();
 	RDesWriteStream inBuf( inPtr );
     TInt op = MAlfGfxEffectPlugin::ETfxServerOpControlPolicyRequest;
@@ -1393,9 +1412,6 @@
     __ALFFXLOGSTRING( "CGfxTransAdapterTfx::RequestPolicyUpdates" );
     iTfxServer.SendAsynchronousData( iPluginImplementation, inPtr, outPtr, iPolicyReq->iStatus );
     iPolicyReq->IssueReq();
-    // clear out used data    
-    inPtr.Zero();
-    outPtr.Zero();
     __ALFFXLOGSTRING("CGfxTransAdapterTfx::RequestPolicyUpdates <<");
     return KErrNone;
     
--- a/uiacceltk/hitchcock/plugins/alftranseffect/alftranseffectplugin/inc/alfserverdrawer.h	Fri Apr 16 15:56:24 2010 +0300
+++ b/uiacceltk/hitchcock/plugins/alftranseffect/alftranseffectplugin/inc/alfserverdrawer.h	Mon May 03 13:22:43 2010 +0300
@@ -110,6 +110,7 @@
     void DoSendBeginFullscreenL();
 	TInt SendBeginControlTransition();
 	TInt SendFinishControlTransition();
+	TInt DoSendFinishControlTransition(TInt aHandle);
 	
     TBool EffectFinishedFullScreen() const;
     
@@ -203,6 +204,8 @@
     RFs iFs;
     TBool iFullScreenFxSent;
     TBool iFullScreenEndSent;
+
+    RArray<TInt> iActiveControlFx;
     };
 
 
--- a/uiacceltk/hitchcock/plugins/alftranseffect/alftranseffectplugin/src/alfgfxeffects.cpp	Fri Apr 16 15:56:24 2010 +0300
+++ b/uiacceltk/hitchcock/plugins/alftranseffect/alftranseffectplugin/src/alfgfxeffects.cpp	Mon May 03 13:22:43 2010 +0300
@@ -250,6 +250,13 @@
 #endif    
                 
                 uid1 = TUid::Uid( inStream.ReadInt32L() );
+                // hack to keep disapear viewswitch transitions popping on top of everything
+				// TODO: Remove when HS complies
+                if ((uid1.iUid == 0x102750F1 || uid1.iUid == 0x102750F2 ) && action == 4)
+                    {
+                    action = 5;
+                    }
+                
                 TInt windowGroup = inStream.ReadInt32L();
                 TInt windowHandle = inStream.ReadInt32L();
                 TBool nLayered = inStream.ReadInt32L();
--- a/uiacceltk/hitchcock/plugins/alftranseffect/alftranseffectplugin/src/alfserverdrawer.cpp	Fri Apr 16 15:56:24 2010 +0300
+++ b/uiacceltk/hitchcock/plugins/alftranseffect/alftranseffectplugin/src/alfserverdrawer.cpp	Mon May 03 13:22:43 2010 +0300
@@ -41,6 +41,7 @@
 // this will stop the effect.
 const TInt KAlfShortEffectTimeout = 4000000;
 const TInt KAlfLongEffectTimeout  = 5000000;
+const TInt KAlfActiveControlFxGranularity = 4;
 
 //const TInt KAlfLongEffectTimeout  = 500000;
 // Timer to send finish full screen effect
@@ -237,7 +238,6 @@
     iProperty.Attach( KPSAlfDomain, KAlfTransitionStatus );
     iProperty.Set( KPSAlfDomain, KAlfTransitionStatus, 0 );
     iFs.Connect();
-    
     }
 
 // ---------------------------------------------------------------------------
@@ -246,7 +246,8 @@
 CAlfServerDrawer::CAlfServerDrawer( CAlfWindowManager* aWindowManager,
     CPolicyHandler& aPolicyHandler  ):
     iWindowManager( aWindowManager ),
-    iPolicyHandler( aPolicyHandler )
+    iPolicyHandler( aPolicyHandler ),
+    iActiveControlFx( KAlfActiveControlFxGranularity )
     {
     iScrModeChangedState = EScreenModeChangedIdle;
     }
@@ -264,7 +265,7 @@
     delete iFullScreenController;
     delete iFinishFullScreen;
     delete iFullScreenTimeout;
-        
+    iActiveControlFx.Close();
     }
 
 // ---------------------------------------------------------------------------
@@ -663,7 +664,7 @@
         RMemWriteStream stream( bridgeBuffer, bufferSize );
         // The writes should not leave if we have calculated our buffer length correctly.
         stream.WriteInt32L( MAlfGfxEffectPlugin::EBeginFullscreen );
-        stream.WriteInt32L( iCurrentFullScreenHandle );
+        stream.WriteInt32L(  iToSid.iId ); //iCurrentFullScreenHandle );
         stream.WriteInt32L( iType );
       	if ( iType == AknTransEffect::EParameterType && isExit )
       	    {
@@ -1053,7 +1054,7 @@
         TRAP_IGNORE(
             {
             stream.WriteInt32L( MAlfGfxEffectPlugin::EBeginComponentTransition );
-            stream.WriteInt32L( iCurrentControlHandle );
+            stream.WriteInt32L( iControlHandle ); //iCurrentControlHandle );
             stream.WriteInt32L( iControlHandle ); // window handle
             stream.WriteInt32L( iControlWindowGroup ); // window group id
             stream.WriteInt32L( 0 ); // "screen number"; not used; save place for future
@@ -1065,10 +1066,15 @@
             stream.CommitL();
             });
         bridgerData.Set( EAlfControlEffectFx, iControlAction, bufferSize, (TAny*) index );
-        __ALFFXLOGSTRING1("CAlfServerDrawer::SendBeginControlTransition - sending bridgedata, Current handle: %d", iCurrentControlHandle);
+        __ALFFXLOGSTRING1("CAlfServerDrawer::SendBeginControlTransition - sending bridgedata, Current handle: %d", iControlHandle)
         iWindowManager->PostIt( bridgerData );
         stream.Close();
-        iControlTransitionEndObserver->StartObserving( TCallBack( ControlTransitionFinished, this ), iCurrentControlHandle );
+        iControlTransitionEndObserver->StartObserving( TCallBack( ControlTransitionFinished, this ), iControlHandle );
+        
+        if ( iActiveControlFx.Find( iControlHandle ) == KErrNotFound )
+            {
+            iActiveControlFx.Append( iControlHandle );
+            }
         }
 	
     iFullScreenFinished = EFalse;
@@ -1086,7 +1092,24 @@
     // We should now delete the effects from any controls that remain active.
     __ALFFXLOGSTRING("CAlfServerDrawer::SendFinishControlTransition >>");
     iControlTransitionEndObserver->Cancel();
-	
+    
+    while ( iActiveControlFx.Count() )
+        {
+        TInt handle = iActiveControlFx[ iActiveControlFx.Count() - 1 ];
+        iActiveControlFx.Remove( iActiveControlFx.Count() - 1 );
+        DoSendFinishControlTransition( handle );
+        }
+
+    return KErrNone;
+    }
+
+// ---------------------------------------------------------------------------
+// ---------------------------------------------------------------------------
+//
+TInt CAlfServerDrawer::DoSendFinishControlTransition(TInt aHandle)
+    {
+    __ALFFXLOGSTRING1("CAlfServerDrawer::DoSendFinishControlTransition %d >>", aHandle)
+    	
     // Send the data to CAlfAppUI via bridge
     TAlfBridgerData bridgerData;
     
@@ -1106,7 +1129,7 @@
         TRAP_IGNORE(
             {
             stream.WriteInt32L( MAlfGfxEffectPlugin::EAbortComponentTransition );
-            stream.WriteInt32L( iCurrentControlHandle );
+            stream.WriteInt32L( aHandle );
             stream.WriteInt32L( 0 );
             stream.WriteInt32L( 0 );
             stream.WriteInt32L( 0 );
@@ -1114,12 +1137,12 @@
             stream.CommitL();    
             });
 			// TODO, check, if iCurrentHandle is approriate
-        bridgerData.Set( EAlfStopControlEffectFx, iCurrentControlHandle, bufferSize, (TAny*) index );
-        __ALFFXLOGSTRING1("CAlfServerDrawer::sending bridgedata, Stop control handle: %d", iCurrentControlHandle);
+        bridgerData.Set( EAlfStopControlEffectFx, aHandle, bufferSize, (TAny*) index );
+        __ALFFXLOGSTRING1("CAlfServerDrawer::sending bridgedata, Stop control handle: %d", aHandle);
         iWindowManager->PostIt( bridgerData );
         stream.Close();
         }
-    __ALFFXLOGSTRING("CAlfServerDrawer::SendFinishControlTransition <<");
+    __ALFFXLOGSTRING("CAlfServerDrawer::DoSendFinishControlTransition <<")
     return KErrNone;
     }
 	
--- a/uiacceltk/hitchcock/plugins/openwfcrs/inc/screencaptureutil.h	Fri Apr 16 15:56:24 2010 +0300
+++ b/uiacceltk/hitchcock/plugins/openwfcrs/inc/screencaptureutil.h	Mon May 03 13:22:43 2010 +0300
@@ -17,8 +17,6 @@
 #define __SCREENCAPTURERENDERSTAGE_H__
 
 #include <graphics/wsrenderstage.h>
-#include <graphics/wstestscreencapture.h>
-#include <graphics/testscreencapture.h>
 #include <graphics/surface.h>
 #include <graphics/surfacemanager.h>
 #include <graphics/surfaceupdateclient.h>