idlehomescreen/xmluicontroller/src/onlineofflinehelper.cpp
branchRCL_3
changeset 83 5456b4e8b3a8
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/idlehomescreen/xmluicontroller/src/onlineofflinehelper.cpp	Wed Sep 01 12:32:46 2010 +0100
@@ -0,0 +1,474 @@
+/*
+* Copyright (c) 2005-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  Helper for online/offline state handling
+*
+*/
+
+// System includes
+#include <NetworkHandlingProxy.h>
+#include <CNWSession.h>
+#include <MProfileEngine.h>
+#include <CProfileChangeNotifyHandler.h>
+#include <ai3xmlui.rsg>
+#include <AknQueryDialog.h>
+#include <AknGlobalNote.h>
+#include <StringLoader.h>
+#include <cmmanagerkeys.h>
+#include <AknGlobalConfirmationQuery.h>
+#include <StringLoader.h> // StringLoader
+#include <AknQueryDialog.h>
+#include <ai3xmlui.rsg>
+// User includes
+#include <aifwstatehandler.h>
+#include <aifwdefs.h>
+#include <activeidle2domaincrkeys.h>
+#include <hspublisherinfo.h>
+#include "onlineofflinehelper.h"
+#include "xmluicontroller.h"
+#include "appui.h"
+#include "ai3.hrh"
+#include "globalqueryhandler.h"
+
+// Constants
+const TInt KOfflineProfileId( 5 );
+
+using namespace AiXmlUiController;
+
+#ifdef HS_NETWORK_MONITOR
+#include <flogger.h>
+_LIT( KLogFolder,"xnnetwork" );
+_LIT( KLogDom, "networksettings.log" );
+
+#define _LOG1( a ) RFileLogger::Write( \
+    KLogFolder, KLogDom, EFileLoggingModeAppend, ( a ) );
+#define _LOG2( a, b ) RFileLogger::WriteFormat( \
+    KLogFolder, KLogDom, EFileLoggingModeAppend, ( a ), ( b ) )
+#else
+#define _LOG1
+#define _LOG2
+#endif
+
+_LIT( KDisConnected, "disconnected");
+_LIT( KConnected, "connected");
+
+// ============================ LOCAL FUNCTIONS ==============================
+
+// ============================ MEMBER FUNCTIONS =============================
+// ---------------------------------------------------------------------------
+// COnlineOfflineHelper::NewL
+// ---------------------------------------------------------------------------
+//
+COnlineOfflineHelper* COnlineOfflineHelper::NewL( CXmlUiController& aUiCtl )    
+    {
+    COnlineOfflineHelper* self = new ( ELeave )COnlineOfflineHelper( aUiCtl );                 
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+    return self;
+    }
+ 
+// ----------------------------------------------------------------------------
+// COnlineOfflineHelper::COnlineOfflineHelper
+// ----------------------------------------------------------------------------
+//
+COnlineOfflineHelper::COnlineOfflineHelper( CXmlUiController& aUiCtl )
+    : iUiCtl( aUiCtl )
+    {    
+    }
+        
+// ----------------------------------------------------------------------------
+// COnlineOfflineHelper::ConstructL
+// ----------------------------------------------------------------------------
+//
+void COnlineOfflineHelper::ConstructL()
+    { 
+    //Create network handling engine session.
+    iSession = CreateL( *this, iInfo );
+
+    iHandler = CProfileChangeNotifyHandler::NewL( this );
+    
+    MProfileEngine* engine( CreateProfileEngineL() );
+    
+    if( engine->ActiveProfileId() == KOfflineProfileId )
+        {
+        iFlags.Set( EOfflineProfile );
+        }
+    
+    engine->Release();
+    
+    TInt value( 0 );
+    
+    if ( iUiCtl.SettingsRepository().Get(  KAIWebStatus, value ) == KErrNone )
+        {
+        if( value && iFlags.IsClear( EOfflineProfile ) )
+            {
+            iFlags.Set( EOnline );
+            }                    
+        }
+    
+    // Update state manager
+    SetOnline( iFlags.IsSet( EOnline ) );
+         
+    iCurrentNwStatus = ENWRegistrationUnknown;    
+    iHomeNetwork = KErrNotFound;
+    iRoamingNetwork = KErrNotFound;
+    
+    iNwSettingObserver = CCenRepObserver::NewL( this );
+    
+    iGlobalQueryHandler = CGlobalQueryHandler::NewL(iUiCtl);
+    iGlobalConfirmationQuery = CAknGlobalConfirmationQuery::NewL();
+
+    }
+      
+// ----------------------------------------------------------------------------
+// COnlineOfflineHelper::~COnlineOfflineHelper
+// ----------------------------------------------------------------------------
+//
+COnlineOfflineHelper::~COnlineOfflineHelper() 
+    {
+    delete iHandler;
+    delete iSession;
+    delete iNwSettingObserver;
+    delete iGlobalQueryHandler;
+    delete iGlobalConfirmationQuery; 
+    }
+
+// ----------------------------------------------------------------------------
+// COnlineOfflineHelper::CurrentCellularDataUsageChangedL
+// ----------------------------------------------------------------------------
+//
+void COnlineOfflineHelper::CurrentCellularDataUsageChangedL(const TInt aValue)
+    {
+    if ( iCurrentNwStatus == ENWRegisteredOnHomeNetwork )
+        {
+        iHomeNetwork = aValue;
+        }
+    else if ( iCurrentNwStatus == ENWRegisteredRoaming )
+        {
+        iRoamingNetwork = aValue;
+        }
+    }
+
+// ----------------------------------------------------------------------------
+// COnlineOfflineHelper::ShowOnlineItem
+// ----------------------------------------------------------------------------
+//
+TBool COnlineOfflineHelper::ShowOnlineItem() const
+    {    
+    TInt value ( KErrNotFound );
+    if ( iUiCtl.SettingsRepository().Get(  KAIWebStatus, value ) == KErrNone )
+        {
+        return ( !value );
+        }
+    return EFalse;
+    }
+
+// ----------------------------------------------------------------------------
+// COnlineOfflineHelper::ShowOfflineItem
+// ----------------------------------------------------------------------------
+//
+TBool COnlineOfflineHelper::ShowOfflineItem() const
+    {
+    TInt value ( KErrNotFound );
+    if ( iUiCtl.SettingsRepository().Get(  KAIWebStatus, value ) == KErrNone )
+        {
+        return ( value );
+        }
+     return EFalse;
+    }
+
+// ----------------------------------------------------------------------------
+// COnlineOfflineHelper::ProcessOnlineStateL
+// ----------------------------------------------------------------------------
+//
+void COnlineOfflineHelper::ProcessOnlineStateL( TBool aOnline )
+    {
+    // User has selected online/offline item from menu
+    // Don't show R_YES_NO_HS_ONLINE query as user selected online
+    if ( aOnline )
+        {
+        iFlags.Set( EOnline );
+        if ( iCurrentNwStatus == ENWRegisteredRoaming )
+            {
+            // When user allready is in foreing network and sets
+            // HS online we want to disable automatic offline setting and not
+            // show note QTN_HS_AUTOMATIC_OFFLINE
+            iFlags.Set( ERoamingShown );
+            }
+        }
+    else
+        {
+        iFlags.Clear( EOnline );
+        }
+     
+    SetOnline( aOnline );
+    }
+
+// ----------------------------------------------------------------------------
+// COnlineOfflineHelper::SetOnline
+// ----------------------------------------------------------------------------
+//
+void COnlineOfflineHelper::SetOnline( TBool aOnline )    
+    {    
+    // Save state
+    iUiCtl.SettingsRepository().Set( KAIWebStatus, aOnline );
+
+    // Run state change.
+    iUiCtl.FwStateHandler()->ChangePluginState( 
+            aOnline ? EAiFwOnline : EAiFwOffline );                    
+    }
+
+// ----------------------------------------------------------------------------
+// COnlineOfflineHelper::HandleNetworkMessage
+// ----------------------------------------------------------------------------
+//
+void COnlineOfflineHelper::HandleNetworkMessage( const TNWMessages aMessage )
+    {        
+    if ( HasNetworkInfoChanged( aMessage ) )
+        {
+        // Interpret new nw state
+        TRAP_IGNORE( InterpretNWMessageL( aMessage, iInfo ) );  
+        }                       
+    }
+
+// ----------------------------------------------------------------------------
+// COnlineOfflineHelper::InterpretNWMessage
+// ----------------------------------------------------------------------------
+//
+void COnlineOfflineHelper::InterpretNWMessageL( const TNWMessages aMessage, 
+    const TNWInfo aNWInfo )
+    {       
+    switch ( aMessage )
+        {
+        case MNWMessageObserver::ENWMessageNetworkRegistrationStatusChange:
+        case MNWMessageObserver::ENWMessageCurrentHomeZoneMessage:
+            {
+            switch ( aNWInfo.iRegistrationStatus )
+                {
+                case ENWRegisteredRoaming:
+                    _LOG1( _L(" Roaming Network Activated "));
+                    iCurrentNwStatus = aNWInfo.iRegistrationStatus;
+                    CurrentNetworkSetting();
+                    if( ( iRoamingNetwork == ECmCellularDataUsageConfirm
+                          || iRoamingNetwork == ECmCellularDataUsageDisabled )
+                          && iFlags.IsSet( EOnline )
+                          && iFlags.IsClear( ERoamingShown ) )
+                        {
+                        // Process to offline state. 
+                        // Don't change the user selection.
+                        SetOnline( EFalse );
+                        // Show roaming notification
+						CAknGlobalNote* note = CAknGlobalNote::NewLC();
+						HBufC* msg( StringLoader::LoadLC( 
+						        R_QTN_HS_AUTOMATIC_OFFLINE ) );
+						note->SetSoftkeys(R_AVKON_SOFTKEYS_OK_EMPTY); 
+						note->ShowNoteL( EAknGlobalInformationNote, *msg );
+						CleanupStack::PopAndDestroy( 2, note ); // msg
+						
+						// set roming shown flag. We want to show 
+						// romign note only once while user stays in foreign
+						// network. If user sets the HS to online this note is 
+						// not showed again and HS will stay online in foreign
+						// network.
+						iFlags.Set( ERoamingShown );
+                        }
+                    break;
+
+                case ENWRegisteredOnHomeNetwork:
+                    _LOG1( _L(" Home Network Activated "));
+                    if ( iFlags.IsSet( ERoamingShown  ) )
+                        {
+                        // Clear ERoamingShown when user returns to home 
+                        // network.
+                        iFlags.Clear( ERoamingShown );
+                        }
+                    
+                    iCurrentNwStatus = aNWInfo.iRegistrationStatus;
+                    CurrentNetworkSetting();
+                    if( iHomeNetwork == ECmCellularDataUsageAutomatic )
+                        {
+                        // Reset to user selection
+                        SetOnline( iFlags.IsSet( EOnline ) );
+                        }
+                    break;                     
+
+                default:                        
+                    // unknown state                    
+                    iCurrentNwStatus = ENWRegistrationUnknown;
+                    break;
+                }
+            }
+        }       
+    }
+
+// ----------------------------------------------------------------------------
+// COnlineOfflineHelper::HandleNetworkError
+// ----------------------------------------------------------------------------
+//
+void COnlineOfflineHelper::HandleNetworkError( const TNWOperation aOperation, 
+    TInt /*aErrorCode*/ )
+    {
+     switch ( aOperation )
+        {
+        case MNWMessageObserver::ENWGetNetworkProviderName:
+            iReceivedMessageFlags |= ENetworkProviderNameReceived;
+            iReceivedMessageFlags &= ~ENetworkProviderNameOk;
+            iInfo.iNPName.Zero();
+            break;
+        case MNWMessageObserver::ENWGetProgrammableOperatorName:
+            iReceivedMessageFlags |= EProgrammableOperatorInfoReceived;
+            iReceivedMessageFlags &= ~EProgrammableOperatorInfoReceivedOk;
+            iInfo.iOperatorNameInfo.iName.Zero();
+            break;
+        case MNWMessageObserver::ENWGetServiceProviderName:
+            iReceivedMessageFlags |= EServiceProviderNameReceived;
+            iReceivedMessageFlags &= ~EServiceProviderNameOk;
+            iInfo.iServiceProviderNameDisplayReq = RMobilePhone::KDisplaySPNNotRequired;
+            iInfo.iSPName.Zero();
+            iInfo.iPLMNField.Zero();
+            break;
+        default:
+            break;
+        }
+    
+    HandleNetworkMessage( TNWMessages( KErrGeneral ) );
+    }
+
+// ----------------------------------------------------------------------------
+// COnlineOfflineHelper::HasNetworkInfoChanged
+// ----------------------------------------------------------------------------
+//
+TBool COnlineOfflineHelper::HasNetworkInfoChanged( const TNWMessages aMsg )
+    {
+    TBool result( ETrue );
+    
+    // pass through
+    if ( aMsg == MNWMessageObserver::ENWMessageCurrentHomeZoneMessage   ||
+         aMsg == MNWMessageObserver::ENWMessageNetworkConnectionFailure ||
+         aMsg == MNWMessageObserver::ENWMessageCurrentCellInfoMessage   ||
+         aMsg == MNWMessageObserver::ENWMessageNetworkRegistrationStatusChange )
+        {
+        return result;
+        }
+    
+    result = ( iReceivedMessageFlags != iOldReceivedMessageFlags );
+    
+    if ( !result )
+        {
+         result = iInfo.iRegistrationStatus != iOldInfo.iRegistrationStatus;             
+        }
+
+    iOldReceivedMessageFlags = iReceivedMessageFlags;
+    iOldInfo = iInfo;
+
+    return result;
+    }
+
+// ---------------------------------------------------------------------------
+// COnlineOfflineHelper::HandleActiveProfileEventL
+// ---------------------------------------------------------------------------
+//
+void COnlineOfflineHelper::HandleActiveProfileEventL(
+    TProfileEvent aProfileEvent, TInt aProfileId )                                                        
+    {
+    //Profile activated or modified.
+    if ( aProfileEvent == EProfileNewActiveProfile )         
+        {
+        if( aProfileId == KOfflineProfileId )
+            {
+            iFlags.Set( EOfflineProfile );
+            // Don't change the user selection.
+            SetOnline( EFalse );
+            }
+        else
+            {
+            iFlags.Clear( EOfflineProfile );
+            // Reset to user selection
+            SetOnline( iFlags.IsSet( EOnline ) );
+            }
+        }
+    
+    delete iHandler;
+    iHandler = NULL;
+    
+    iHandler = CProfileChangeNotifyHandler::NewL( this );        
+    }
+
+// ---------------------------------------------------------------------------
+// COnlineOfflineHelper::CurrentNetworkSetting
+// ---------------------------------------------------------------------------
+//
+void COnlineOfflineHelper::CurrentNetworkSetting() 
+    {    
+    CRepository* repository( NULL );
+    
+    TRAP_IGNORE( repository = CRepository::NewL( KCRUidCmManager ) )
+    
+    if ( repository )
+        {        
+        TInt value( 0 );
+        TInt err( repository->Get( KCurrentCellularDataUsage, value ) );
+
+        if ( err == KErrNone )
+            {
+            if ( iCurrentNwStatus == ENWRegisteredRoaming )
+                {
+                iRoamingNetwork = value;
+                _LOG2( _L("Roaming Network Setting <%d>"), value ); 
+                }
+            else if  ( iCurrentNwStatus == ENWRegisteredOnHomeNetwork )
+                {
+                iHomeNetwork = value;
+                _LOG2( _L("Home Network Setting <%d>"), value );
+                }            
+            }    
+        }
+    delete repository;
+    }
+
+// ---------------------------------------------------------------------------
+// COnlineOfflineHelper::HandleConnectionQueryL
+// ---------------------------------------------------------------------------
+//
+void COnlineOfflineHelper::HandleConnectionQueryL( const TDesC& aConnection)
+    {
+    if ( aConnection == KDisConnected() && ShowOfflineItem() ) 
+        {
+        ShowGlobalQueryL(R_QTN_HS_DISABLE_NETWORK, EFalse );
+        }
+    else if ( aConnection == KConnected() && ShowOnlineItem() )
+        {
+        ShowGlobalQueryL(R_QTN_HS_SWITCH_ONLINE, ETrue );
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// COnlineOfflineHelper::ShowGlobalQueryL
+// ---------------------------------------------------------------------------
+//
+void COnlineOfflineHelper::ShowGlobalQueryL( TInt aResourceId, TBool aSetOnline )
+    {
+    if ( !iGlobalQueryHandler->IsActive() )
+        {
+        HBufC* confirmationText = StringLoader::LoadLC(aResourceId);
+        iGlobalConfirmationQuery->ShowConfirmationQueryL(
+                iGlobalQueryHandler->iStatus,
+            *confirmationText, 
+            R_AVKON_SOFTKEYS_YES_NO);
+        iGlobalQueryHandler->SetOnlineParamAndActivate(aSetOnline);
+        CleanupStack::PopAndDestroy(); //confirmationText
+        }
+    }
+
+ // End of file