widgets/widgetapp/src/WidgetUiWindowManager.cpp
branchRCL_3
changeset 94 919f36ff910f
parent 93 79859ed3eea9
child 99 ca6d8a014f4b
--- a/widgets/widgetapp/src/WidgetUiWindowManager.cpp	Tue Aug 31 16:17:46 2010 +0300
+++ b/widgets/widgetapp/src/WidgetUiWindowManager.cpp	Wed Sep 01 12:28:30 2010 +0100
@@ -25,26 +25,35 @@
 #include "WidgetInstallerInternalCRKeys.h"
 #include "SWInstWidgetUid.h"
 #include "widgetappdefs.rh"
-#include "Browser_platform_variant.hrh"
+#include "browser_platform_variant.hrh"
+#include "WidgetUiPSNotifier.h"
 #ifdef BRDO_WRT_HS_FF
 #include "cpspublisher.h"
 #endif
 
 #include <WidgetUi.rsg>
 #include <brctlinterface.h>
-#include <WidgetRegistryConstants.h>
+#include <widgetregistryconstants.h>
 #include <centralrepository.h>
 #include <StringLoader.h>
-#include <aknnotedialog.h>
-#include <BrowserDialogsProvider.h>
-#include <s32file.h>
+#include <AknNoteDialog.h>
+#include <S32FILE.H>
 #include <aknnotewrappers.h>
 #include "cpglobals.h" // CPS string definitions.
 
-#include <InternetConnectionManager.h>
+#include <internetconnectionmanager.h>
 #include <ActiveApDb.h>
 #include <oommonitorsession.h>
-#include <AknGlobalNote.h>
+#include <aknglobalnote.h>
+
+#ifdef BRDO_MULTITOUCH_ENABLED_FF  
+#include<akntranseffect.h>
+#include<gfxtranseffect/GfxTransEffect.h>
+#endif
+
+#ifdef BRDO_OCC_ENABLED_FF
+#include <extendedconnpref.h>
+#endif
 
 // LOCAL FUNCTION PROTOTYPES
 TInt doDestructOOMNotifyTimer( TAny* ptr );
@@ -60,6 +69,10 @@
 const TInt KOOMHarvesterNotificationTimeOut = 5000000;
 const TInt KOOMWidgetCloseTimeOut = 15;//Do not close the widget that was started after OOM within 15 sec
 
+#ifdef BRDO_OCC_ENABLED_FF
+const TInt KRetryConnectivityTimeout( 2*1000*1000 ); // 2 seconds
+#endif
+
 class CRequestRAM : public CActive
     {
 public: 
@@ -165,16 +178,34 @@
         delete cenRep;
         }
         
-    iDialogsProvider = CBrowserDialogsProvider::NewL( NULL );
     iHandler = CDocumentHandler::NewL(CEikonEnv::Static()->Process());
 
     iDb = CActiveApDb::NewL( EDatabaseTypeIAP );
+    #ifdef BRDO_OCC_ENABLED_FF
+    iConnection = CInternetConnectionManager::NewL( iDb->Database(), ETrue );
+    #else
     iConnection = CInternetConnectionManager::NewL( iDb->Database(), EFalse );
+    #endif
+    
 #ifdef BRDO_WRT_HS_FF    
     iCpsPublisher = CCpsPublisher::NewL();
+    iCenrepNotifyHandler = CCenrepNotifyHandler::NewL( *this );
+    iNetworkListener = CWidgetUiNetworkListener::NewL( *this );
 #endif
     
-    iNetworkListener = CWidgetUiNetworkListener::NewL( *this );
+#ifdef BRDO_OCC_ENABLED_FF
+    iConnStageNotifier = CConnectionStageNotifierWCB::NewL();
+    iConnStageNotifier->SetPriority(CActive::EPriorityHigh);
+    iRetryConnectivity = CPeriodic::NewL(CActive::EPriorityStandard);
+#endif
+    
+        //Creating observer WidgetWindowsObeserver
+    iWidgetNotifier = CWidgetUiPSNotifier::NewL(*this, EWidgetRegAltered);
+    	
+#ifdef BRDO_SAPINTFN_ENABLED_FF
+    iWidgetSapiNotifier = CWidgetUiPSNotifier::NewL(*this, ESapiPrompt);
+    iWidgetSapiClearNotifier = CWidgetUiPSNotifier::NewL(*this, ESapiPromptCleared);
+#endif
     }
 
 // -----------------------------------------------------------------------------
@@ -202,9 +233,27 @@
 //
 CWidgetUiWindowManager::~CWidgetUiWindowManager()
     {
-    iWindowList.ResetAndDestroy();
+#ifdef BRDO_WRT_HS_FF 
+    iCenrepNotifyHandler->DoCancel();
+    delete iCenrepNotifyHandler;
+#endif
+   
+    iActiveFsWindow = NULL;
     
+#ifdef BRDO_OCC_ENABLED_FF 
+    if ( iRetryConnectivity)
+        {
+        iRetryConnectivity->Cancel();
+        delete iRetryConnectivity;
+        iRetryConnectivity = NULL;
+        }
+#endif
+	 
+	  iWindowList.ResetAndDestroy();
+  
+#ifdef BRDO_WRT_HS_FF   
     delete iNetworkListener;
+#endif
 
     // TODO Why there is a "Disconnect" method in the first place...
     // RHandleBase::Close() should be enough?
@@ -216,8 +265,6 @@
     iClientSession.Close();
     
     delete iHandler;
-    delete iDialogsProvider;
-
     if ( iConnection )
         {
         TRAP_IGNORE( iConnection->StopConnectionL() );
@@ -228,6 +275,12 @@
     delete iCpsPublisher;
 #endif
     delete iDb;
+    delete iWidgetNotifier;
+    
+#ifdef BRDO_SAPINTFN_ENABLED_FF
+    delete iWidgetSapiNotifier;
+    delete iWidgetSapiClearNotifier;
+#endif
     }
 
 // -----------------------------------------------------------------------------
@@ -245,12 +298,20 @@
     wdgt_window->SetWindowStateMiniViewL( EMiniViewEnabled );
 
     // TODO also other states are possible when we should react?
-
+    
     // Removing . Miniview, shall remove full view as well. For blanket permissions
     // will be revoked for miniview
 
-    iClientSession.SetBlanketPermissionL( aUid, EBlanketUnknown );
+ 
     iClientSession.SetMiniViewL( aUid, EFalse );
+#ifdef BRDO_OCC_ENABLED_FF
+    wdgt_window->CancelAllDialogs();
+        
+     if ( wdgt_window->IsDialogsLaunched() )
+        {
+        return EFalse;
+        }
+#endif    
     return CloseWindow( wdgt_window );
     }
 
@@ -328,6 +389,9 @@
             {            	
             // If we don't have window we know that WidgetUI has died
             // We must enable miniview state
+#ifdef BRDO_MULTITOUCH_ENABLED_FF
+            GfxTransEffect::BeginFullScreen(AknTransEffect::EApplicationStart,TRect(0,0,0,0),AknTransEffect::EParameterType,AknTransEffect::GfxTransParam(TUid::Uid(KWidgetAppUid)));
+#endif
             if( !GetWindow(aUid))
                 {        
                 needToNotify = EFalse;
@@ -337,48 +401,106 @@
             //WidgetLauncher modified to bring app to foreground
             GetWindow( aUid)->IncrementClickCount();
             OpenOrCreateWindowL( aUid, LaunchFullscreen );            
+#ifdef BRDO_MULTITOUCH_ENABLED_FF            
+            GfxTransEffect::EndFullScreen();
+#endif            
             }
             break;
         case WidgetOnline:
             {
             iNetworkMode = EOnlineMode;
             CWidgetUiWindow* wdgt_window( GetWindow( aUid ) );
-#ifdef BRDO_WRT_HS_FF
-            if ( wdgt_window->NetworkModeWait()->IsStarted() )
+            if (wdgt_window)
                 {
-                wdgt_window->NetworkModeWait()->AsyncStop();
+#ifdef BRDO_WRT_HS_FF
+                if ( wdgt_window->NetworkModeWait()->IsStarted() )
+                    {
+                    wdgt_window->NetworkModeWait()->AsyncStop();
+                    }
+#endif
+                if(wdgt_window->IsWidgetLoaded())
+                    wdgt_window->DetermineNetworkState();
+                else
+                    wdgt_window->NeedToNotifyNetworkState(ETrue);
                 }
-#endif
-            wdgt_window->DetermineNetworkState();
             }
             break;
        case WidgetOffline:
             {
             iNetworkMode = EOfflineMode;
             CWidgetUiWindow* wdgt_window( GetWindow( aUid ) );
-#ifdef BRDO_WRT_HS_FF
-            if ( wdgt_window->NetworkModeWait()->IsStarted() )
+            if (wdgt_window)
                 {
-                wdgt_window->NetworkModeWait()->AsyncStop();
-                }
+#ifdef BRDO_WRT_HS_FF
+                 if ( wdgt_window->NetworkModeWait()->IsStarted() )
+                     {
+                     wdgt_window->NetworkModeWait()->AsyncStop();
+                     }
 #endif
-            // if no full view widgets open, then close the network connection
-            if ( ( !FullViewWidgetsOpen() ) && ( iConnection->Connected() ) )
-                {
-                wdgt_window->Engine()->HandleCommandL( 
+                 if ( iConnection->Connected())
+                     {
+                     for ( TInt i = 0; i < iWindowList.Count(); i++ )
+                         {
+                         CWidgetUiWindow* window = iWindowList[i];
+                         if ( window && 
+                     	       (window->WidgetMiniViewState() == EPublishStart ||
+                     	       window->WidgetMiniViewState() == EPublishSuspend) 
+                     	      )
+                             //Send cancelFetch to all windows
+                             TRAP_IGNORE( window->Engine()->HandleCommandL( 
+                                (TInt)TBrCtlDefs::ECommandIdBase +
+                                (TInt)TBrCtlDefs::ECommandCancelFetch ) );
+                         }
+                     TRAP_IGNORE( wdgt_window->Engine()->HandleCommandL( 
                         (TInt)TBrCtlDefs::ECommandIdBase +
-                        (TInt)TBrCtlDefs::ECommandDisconnect );
-                iConnection->StopConnectionL();
+                        (TInt)TBrCtlDefs::ECommandDisconnect ) );                     
+                      }
+                // if no full view widgets open, then close the network connection
+                if ( !FullViewWidgetsOpen() && iConnection->Connected() )
+                    {
+
+                     iConnection->StopConnectionL();
+#ifdef BRDO_OCC_ENABLED_FF                    
+                     StopConnectionObserving();
+#endif
+                   }
+                if(wdgt_window->IsWidgetLoaded())
+                    wdgt_window->DetermineNetworkState();
+                else
+                    wdgt_window->NeedToNotifyNetworkState(ETrue);
                 }
-            wdgt_window->DetermineNetworkState();
             }
-            break;
-       case WidgetRestart:
-           {
-           OpenOrCreateWindowL( aUid, LaunchMiniview );
-           ResumeWidgetL( aUid );
-           }
-           break;
+            break; 
+        case WidgetFullViewClose:
+        	{
+        	needToNotify = EFalse ;
+#ifdef BRDO_OCC_ENABLED_FF 
+        	CWidgetUiWindow* window( GetWindow( aUid ) );
+            if( !window )
+                return;
+            else if ( window->IsDialogsLaunched() )
+                {
+          	    iActiveFsWindow = window;
+          	    // Bring app to foreground
+          	    iAppUi.SendAppToForeground(); 
+          	    if ( iActiveFsWindow->Engine()->Rect() != View()->ClientRect())
+                    {
+                    iActiveFsWindow->Engine()->SetRect( View()->ClientRect() );
+                    }
+                iActiveFsWindow->SetCurrentWindow( ETrue ); 
+          	   
+                }
+            else if (window->getSapiPromptCleared())
+                {
+                Exit( EEikCmdExit, aUid );
+                }
+                       
+         	    
+#else
+                Exit( EEikCmdExit, aUid );
+#endif
+        	}
+        	break;
         }
     if(needToNotify)
     // Widget is up and running, notify that next one can be launched    
@@ -606,13 +728,13 @@
 TBool CWidgetUiWindowManager::RemoveFromWindowList( CWidgetUiWindow* aWidgetWindow )
     {
     __ASSERT_DEBUG( aWidgetWindow, User::Invariant() );
-    if ( iDialogsProvider->IsDialogLaunched() )
-        {
-        return EFalse;
-        }
-
+    TBool count(EFalse);
+  
     if ( iClientSession.IsWidgetInFullView ( aWidgetWindow->Uid()))
         {
+#ifdef BRDO_WRT_HS_FF
+          iCpsPublisher->ClearScreenshotL(*(aWidgetWindow->WidgetBundleId()), aWidgetWindow->Uid().iUid);
+#endif
         HideWindow( aWidgetWindow );
         if (aWidgetWindow == iActiveFsWindow)
             iActiveFsWindow = NULL;
@@ -633,16 +755,43 @@
             (TInt)TBrCtlDefs::ECommandCancelFetch ) );   
     if ( lastOne )
         {
-        TRAP_IGNORE( aWidgetWindow->Engine()->HandleCommandL( 
-                (TInt)TBrCtlDefs::ECommandIdBase +
-                (TInt)TBrCtlDefs::ECommandDisconnect ) );
-
-        delete aWidgetWindow;
-        return ETrue;
+        if(aWidgetWindow->CanBeDeleted())
+            {
+#ifdef BRDO_OCC_ENABLED_FF            
+            StopConnectionObserving();
+#endif
+            iConnection->StopConnectionL();
+            delete aWidgetWindow;
+            return ETrue;
+            }
         }
     else
         {
-        delete aWidgetWindow;
+        if(aWidgetWindow->CanBeDeleted())
+            {
+            for ( TInt i = 0; i < iWindowList.Count(); ++i )
+                {
+                CWidgetUiWindow* window( iWindowList[i] );
+                if(window->WidgetMiniViewState() == EMiniViewEnabled || window->WidgetMiniViewState() == EMiniViewNotEnabled)
+                    {
+                    count = ETrue;
+                    break;
+                    }
+                }         
+            if(!count && iNetworkMode == EOfflineMode){
+#ifdef BRDO_OCC_ENABLED_FF                                    
+                StopConnectionObserving();
+#endif
+                iConnection->StopConnectionL();
+                }             
+            if(!aWidgetWindow->Engine()->IsSynchRequestPending())
+            	delete aWidgetWindow;
+			else
+				{
+				//Let sync request complete and then delete					
+				aWidgetWindow->DeleteItself();
+				}
+            }
         }
     return EFalse;
     }
@@ -735,13 +884,20 @@
     CWidgetUiWindow* window( GetWindow( aUid ) );
     if( !window )
         return;
-
+        
+#ifdef BRDO_WRT_HS_FF
+          iCpsPublisher->ClearScreenshotL(*(GetWindow(aUid )->WidgetBundleId()), aUid.iUid);
+#endif
+#ifdef BRDO_MULTITOUCH_ENABLED_FF      
+    GfxTransEffect::BeginFullScreen(AknTransEffect::EApplicationExit,TRect(0,0,0,0),AknTransEffect::EParameterType,AknTransEffect::GfxTransParam(TUid::Uid(KWidgetAppUid)));
+#endif    
     // make widgets act like separate applications by pushing to background
     // this way user is sent back to app shell or idle to run another widget
     iAppUi.SendAppToBackground();
     if ( window == iActiveFsWindow )
         {
         //make the active window NULL and also CurrentWindow as False
+        iActiveFsWindow->SetCurrentWindow(EFalse);
         iActiveFsWindow->SetIsCurrentWindow(EFalse);
         iActiveFsWindow = NULL;        
         }        
@@ -856,6 +1012,22 @@
         }
     else
         {
+#ifdef BRDO_OCC_ENABLED_FF
+        if(iActiveFsWindow)
+            iActiveFsWindow->CancelAllDialogs();
+#endif    
+        
+#ifdef BRDO_WRT_HS_FF  
+        CFbsBitmap* bitmap( new CFbsBitmap() );
+        if ( bitmap && iCpsPublisher)
+            {
+            if(iActiveFsWindow)
+                {
+                TRAP_IGNORE(iActiveFsWindow->Engine()->TakeSnapshotL( *bitmap ));
+                TRAP_IGNORE(iCpsPublisher->PublishScreenshotL(*iActiveFsWindow->WidgetBundleId(),iActiveFsWindow->Uid().iUid, bitmap));
+                }
+             }
+#endif
         HideWindow( iActiveFsWindow );
         }
     }
@@ -983,6 +1155,12 @@
         (wdgt_window->WidgetMiniViewState() == EPublishSuspend) )
         {
         //Widgets on HS cannnot be active
+        if (iActiveFsWindow )
+            {
+            iActiveFsWindow->Engine()->MakeVisible( EFalse );
+            iActiveFsWindow->SetIsCurrentWindow( EFalse );
+            iActiveFsWindow->Engine()->HandleCommandL( (TInt)TBrCtlDefs::ECommandAppBackground + (TInt)TBrCtlDefs::ECommandIdBase);
+            }
         iActiveFsWindow = NULL;
         // Publish should start only after widget is resumed.
         wdgt_window->SetWindowStateMiniViewL(EPublishStart);
@@ -996,7 +1174,11 @@
             (TInt)TBrCtlDefs::ECommandIdBase);
 #ifdef BRDO_WRT_HS_FF 
         wdgt_window->Engine()->MakeVisible( EFalse );
+        wdgt_window->SetIsCurrentWindow( EFalse );
         wdgt_window->Engine()->SetRect( iCpsPublisher->BitmapSize());
+        //When HS comes to foreground show the latest updatd content on HS.
+        //Relayout can sometimes happen only when widget in FullView.
+        wdgt_window->PublishSnapShot();
 #endif
         }
     }
@@ -1258,7 +1440,6 @@
 // ------------------------------------------------------------------------
 TBool  CWidgetUiWindowManager::CloseAllWidgetsUnderOOM()
     {
-    TInt temp(0);
     TInt err(KErrNone);
     CWidgetUiWindow* windowToBeClosed(NULL);
     TTime currentTime;
@@ -1268,6 +1449,13 @@
     TBool bAllWindowsClosed = ETrue;
       
     TInt nWidgetsCount = iWindowList.Count();
+    if(nWidgetsCount > 0)
+        { 
+        CWidgetUiWindow* window = iWindowList[0];
+        TRAP_IGNORE( window->Engine()->HandleCommandL( 
+                    (TInt)TBrCtlDefs::ECommandIdBase +
+                    (TInt)TBrCtlDefs::ECommandOOMExit ) );
+        } 
     for ( TInt i = (nWidgetsCount-1); i >= 0; i-- )
         {
         CWidgetUiWindow* window = iWindowList[i];        
@@ -1299,7 +1487,17 @@
    TInt nWidgetsCount = iWindowList.Count();  
        for ( TInt i = (nWidgetsCount-1); i >= 0; i-- )  
            {  
-           CWidgetUiWindow* window = iWindowList[i];    
+           CWidgetUiWindow* window = iWindowList[i];   
+           TRAP_IGNORE( window->Engine()->HandleCommandL( 
+                   (TInt)TBrCtlDefs::ECommandIdBase +
+                   (TInt)TBrCtlDefs::ECommandCancelFetch ) ); 
+           if(i == 0)
+           	    {
+#ifdef BRDO_OCC_ENABLED_FF                       
+                StopConnectionObserving();
+#endif                       
+                iConnection->StopConnectionL();
+                }
            delete window;  
            }  
    iWindowList.Reset();
@@ -1332,11 +1530,135 @@
     return EFalse;
     }
 
+
+void CWidgetUiWindowManager::ExitNow()
+    {
+    iAppUi.Exit();
+    }
+#ifdef BRDO_OCC_ENABLED_FF
+// -----------------------------------------------------------------------------
+// CWidgetUiWindowManager::ConnectionStageAchievedL()
+// -----------------------------------------------------------------------------
+//
+void CWidgetUiWindowManager::ConnectionStageAchievedL()
+    {
+    iConnection->Disconnect();
+    
+    TNifProgressBuf buf = iConnStageNotifier->GetProgressBuffer();
+    CWidgetUiWindow* window( iWindowList[0] );
+    if( buf().iError == KErrDisconnected )
+        {
+        TRAP_IGNORE( window->Engine()->HandleCommandL( (TInt)TBrCtlDefs::ECommandSetRetryConnectivityFlag + (TInt)TBrCtlDefs::ECommandIdBase ) );
+        SetRetryFlag(ETrue);    
+    
+        TRAP_IGNORE( window->Engine()->HandleCommandL( (TInt)TBrCtlDefs::ECommandCancelQueuedTransactions + (TInt)TBrCtlDefs::ECommandIdBase ) );
+    
+        if( iRetryConnectivity && iRetryConnectivity->IsActive())
+            {
+            iRetryConnectivity->Cancel();
+            }
+        iRetryConnectivity->Start(KRetryConnectivityTimeout, 0,TCallBack(RetryConnectivity,this));
+        }
+    else
+        {
+        TRAP_IGNORE( window->Engine()->HandleCommandL( (TInt)TBrCtlDefs::ECommandCancelFetch + (TInt)TBrCtlDefs::ECommandIdBase ) );
+        }
+    }  
+
+void CWidgetUiWindowManager::ConnNeededStatusL( TInt aErr )
+    {
+    StopConnectionObserving(); //Need to stop the connection observer first
+
+
+    if ( !iConnStageNotifier->IsActive() )
+        {
+        TName* connectionName = iConnection->ConnectionNameL();
+        CleanupStack::PushL( connectionName );
+
+        iConnStageNotifier->StartNotificationL(connectionName, KLinkLayerClosed, this);
+
+        CleanupStack::PopAndDestroy();  //connectionName
+        }
+    } 
+void CWidgetUiWindowManager::StopConnectionObserving()
+    {
+    
+    if ( iConnStageNotifier )
+        {
+        iConnStageNotifier->Cancel();
+        }
+    } 
+
+// -----------------------------------------------------------------------------
+// CWidgetUiWindow::SetRetryFlag
+// -----------------------------------------------------------------------------
+//
+void CWidgetUiWindowManager::SetRetryFlag(TBool flag)
+     {
+     reConnectivityFlag = flag;
+     }
+// -----------------------------------------------------------------------------
+// CWidgetUiWindow::RetryConnectivity
+// -----------------------------------------------------------------------------
+//
+TInt CWidgetUiWindowManager::RetryConnectivity(TAny* aWindowManager)
+    {
+
+    TInt err = ((CWidgetUiWindowManager*)aWindowManager)->RetryInternetConnection();
+    return err;
+    }
+TInt CWidgetUiWindowManager::RetryInternetConnection()
+    {
+    //First cancel the timer
+    if ( iRetryConnectivity && iRetryConnectivity->IsActive() )
+    {
+        iRetryConnectivity->Cancel();
+    }
+    TInt err = KErrNone;
+    if ( !iConnection->Connected() )
+       {
+       TRAP_IGNORE( err = iConnection->StartConnectionL( ETrue ) );
+       }
+    
+    //Root cause needs to be identified..
+    //Fix for Array out of bound crash..
+    if(!iWindowList.Count())   
+    	return err;
+    	
+    CWidgetUiWindow* window( iWindowList[0] );
+    if( err == KErrNone )
+       { 
+   
+       TRAP_IGNORE( window->Engine()->HandleCommandL( (TInt)TBrCtlDefs::ECommandUnSetRetryConnectivityFlag + (TInt)TBrCtlDefs::ECommandIdBase ) );
+       SetRetryFlag(EFalse);
+       
+       TRAP_IGNORE(ConnNeededStatusL(err)); //Start the observer again
+       TRAP_IGNORE( window->Engine()->HandleCommandL( (TInt)TBrCtlDefs::ECommandRetryTransactions + (TInt)TBrCtlDefs::ECommandIdBase ) );
+       }
+    else
+        {
+        TRAP_IGNORE( window->Engine()->HandleCommandL( (TInt)TBrCtlDefs::ECommandUnSetRetryConnectivityFlag + (TInt)TBrCtlDefs::ECommandIdBase ) );
+        SetRetryFlag(EFalse);
+        TRAP_IGNORE(window->Engine()->HandleCommandL( (TInt)TBrCtlDefs::ECommandClearQuedTransactions + (TInt)TBrCtlDefs::ECommandIdBase ) );
+        }
+    
+    return err;
+    }
+// -----------------------------------------------------------------------------
+// CWidgetUiWindowManager::GetRetryFlag
+// -----------------------------------------------------------------------------
+//
+ TBool CWidgetUiWindowManager::GetRetryFlag()
+      {
+      return reConnectivityFlag;
+      } 
+#endif // BRDO_OCC_ENABLED_FF
+
 CRequestRAM::CRequestRAM(CWidgetUiWindowManager* aWidgetUiWindowManager, const TUid& aUid, TUint32 aOperation):
     CActive( EPriorityStandard ),
-    iOperation(aOperation),
+    iWidgetUiWindowManager(aWidgetUiWindowManager),
     iUid(aUid),
-    iWidgetUiWindowManager(aWidgetUiWindowManager)
+    iOperation(aOperation)
     {
 	}
 	
@@ -1353,7 +1675,7 @@
     {
     User::LeaveIfError(iOomSession.Connect());
     CActiveScheduler::Add( this );
-#ifdef FF_OOM_MONITOR2_COMPONENT
+#ifdef BRDO_OOM_MONITOR2_COMPONENT_FF
     iOomSession.RequestOptionalRam(KMemoryToCreateWidgetWindow, KMemoryToCreateWidgetWindow, KUidWidgetOOMPlugin, iStatus);
     SetActive();
 #else
@@ -1371,6 +1693,7 @@
     if(iStatus >= 0)
         {        
         iWidgetUiWindowManager->OpenOrCreateWindowL( iUid, LaunchMiniview );
+        iWidgetUiWindowManager->GetWindow(iUid)->NeedToNotifyNetworkState(ETrue);
         iWidgetUiWindowManager->ResumeWidgetL( iUid );
         iWidgetUiWindowManager->GetWindow(iUid)->SetTime();
 #ifdef OOM_WIDGET_CLOSEALL        
@@ -1397,6 +1720,11 @@
     else
         {
         NotifyCommandHandled();
+        TBool lastOne( iWidgetUiWindowManager->WindowListCount() == 0 );
+        if( lastOne )
+            {
+            iWidgetUiWindowManager->AppUi().Exit();
+            }
         iWidgetUiWindowManager->SendAppToBackground();  
         iWidgetUiWindowManager->WidgetUIClientSession().SetActive( iUid, EFalse );
         }        
@@ -1413,5 +1741,131 @@
     {
     iOomSession.CancelRequestFreeMemory();
     }    
+void CWidgetUiWindowManager::CenrepChanged(TInt aHSModeOnline)
+    {
+    if(iWindowList.Count())
+        {
+        CWidgetUiWindow* window = iWindowList[0];
+        if( window &&
+        	(window->WidgetMiniViewState() == EPublishStart ||
+          window->WidgetMiniViewState() == EPublishSuspend) )
+            {
+            if ( window->NetworkModeWait()->IsStarted() &&  window->WidgetMiniViewState() == EPublishSuspend)
+                {
+                window->NetworkModeWait()->AsyncStop();
+                }
+		        if(aHSModeOnline)
+		            {
+		  	        iNetworkMode = EOnlineMode;
+		            }
+		        else
+		  	        {
+		  	        iNetworkMode = EOfflineMode;
+		  	        
+		  	        if ( iConnection->Connected() )
+		  	            {
+                        for ( TInt i = 0; i < iWindowList.Count(); i++ )
+                            {
+                            CWidgetUiWindow* wdg_window = iWindowList[i];
+                            //send CancelFetch to all windows
+                            TRAP_IGNORE( window->Engine()->HandleCommandL( 
+                                    (TInt)TBrCtlDefs::ECommandIdBase +
+                                    (TInt)TBrCtlDefs::ECommandCancelFetch ) );
+                            }                        
+                        TRAP_IGNORE( window->Engine()->HandleCommandL( 
+                                 (TInt)TBrCtlDefs::ECommandIdBase +
+                                 (TInt)TBrCtlDefs::ECommandDisconnect ) );                        
+                        }
+                    }
+            if(window->IsWidgetLoaded())
+                window->DetermineNetworkState();
+            else
+                window->NeedToNotifyNetworkState(ETrue);
+        
+            }
+        }
+      if ( ( !FullViewWidgetsOpen() ) && iConnection->Connected() && iNetworkMode == EOfflineMode)
+          {          
+#ifdef BRDO_OCC_ENABLED_FF                    
+          StopConnectionObserving();
+#endif
+          iConnection->StopConnectionL();
+          }
+  }        
 
+
+//cenrep notification handling
+
+CCenrepNotifyHandler * CCenrepNotifyHandler::NewL(
+    MCenrepWatcher& aObserver)
+    {
+    CCenrepNotifyHandler* o =  CCenrepNotifyHandler::NewLC(aObserver);
+    CleanupStack:: Pop(o);
+    return o;
+    }
+CCenrepNotifyHandler*  CCenrepNotifyHandler::NewLC(
+    MCenrepWatcher& aObserver) 
+    {
+    CCenrepNotifyHandler* self( new( ELeave ) CCenrepNotifyHandler( aObserver) );
+    CleanupStack:: PushL(self);
+    self->ConstructL();
+    return self;
+    }    
+void CCenrepNotifyHandler::ConstructL()
+    {
+    iUid = TUid::Uid( KCRUidActiveIdleLV ); 
+    iKey = KAIWebStatus;
+    iRepository = CRepository::NewL( iUid );
+    CActiveScheduler::Add(this);
+    StartObservingL();
+    }
+         
+CCenrepNotifyHandler::CCenrepNotifyHandler(MCenrepWatcher& aObserver) : CActive (EPriorityLow),iObserver(aObserver) 
+   {
+         
+   }
+     
+CCenrepNotifyHandler::~CCenrepNotifyHandler()
+    {
+    Cancel(); //first cancel because iRepository is used there
+    delete iRepository;
+    iRepository=NULL;
+    }
+    
+void CCenrepNotifyHandler::StartObservingL()
+    {
+    if( IsActive() )
+        {
+        return; //do nothing if allready observing
+        }
+    User::LeaveIfError(
+                   iRepository->NotifyRequest( iKey, iStatus ) );
+    SetActive();
+    }
+    
+void CCenrepNotifyHandler::StopObserving()
+    {
+    Cancel();
+    }
+    
+void CCenrepNotifyHandler::DoCancel()
+    {
+    iRepository->NotifyCancel(iKey);
+    }
+
+void CCenrepNotifyHandler::RunL()
+    {
+    TInt value = 0;
+    TInt error = iRepository->Get( iKey, value);
+    if( error == KErrNone )
+        {
+        iObserver.CenrepChanged(value);
+        }
+    // Re-subscribe
+   error = iRepository->NotifyRequest( iKey, iStatus );
+   if( error == KErrNone )
+       {
+       SetActive();
+       }
+    }
 // End of file