securitydialogs/Autolock/src/AutoLockModel.cpp
changeset 0 164170e6151a
child 10 ece4bbb094df
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/securitydialogs/Autolock/src/AutoLockModel.cpp	Tue Jan 26 15:20:08 2010 +0200
@@ -0,0 +1,445 @@
+/*
+* Copyright (c) 2002 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:
+*
+*/
+
+#include <aknappui.h>
+#include <activitymanager.h>
+#include <bldvariant.hrh>
+#include <featmgr.h>
+#include <AknNotifierController.h>
+#include <featmgr.h>
+#include    <e32property.h>
+#include	<PSVariables.h>
+#include    <startupdomainpskeys.h>
+#include    <coreapplicationuisdomainpskeys.h>
+#include <ctsydomainpskeys.h>
+
+#include <SCPClient.h>
+
+#include    "AutoLockModelPS.h"  
+#include	"AutolockAppUiPS.h"
+#include    "AutoLockLockObserverPS.h"
+#include "AutoLockCenRepI.h"
+
+
+const TInt AutoLockOff(60000);
+
+
+
+// ================= MEMBER FUNCTIONS =======================
+//
+// ----------------------------------------------------------
+// CAutoLockModel::NewL()
+// ----------------------------------------------------------
+//
+
+CAutoLockModel* CAutoLockModel::NewL(CAutolockAppUi* aAppUi, TBool aLocked)
+	{
+	CAutoLockModel* self = new (ELeave) CAutoLockModel(aAppUi);
+	CleanupStack::PushL(self);
+	self->ConstructL( aLocked );
+	CleanupStack::Pop(); //self
+	return self;
+	}
+//
+// ----------------------------------------------------------
+// CAutoLockModel::CAutoLockModel()
+// C++ default constructor
+// ----------------------------------------------------------
+// 
+CAutoLockModel::CAutoLockModel(CAutolockAppUi* aAppUi) : 
+ iAppUi( aAppUi ), iMonitoring(EFalse)	
+	{
+	}
+
+//
+// ----------------------------------------------------------
+// CAutoLockModel::ConstructL()
+// Symbian OS default constructor
+// ----------------------------------------------------------
+//
+void CAutoLockModel::ConstructL( TBool aLocked )
+	{
+		FeatureManager::InitializeLibL();
+	#if defined(_DEBUG)
+    RDebug::Print(_L("(AUTOLOCK)CAutoLockModel::ConstructL() BEGIN"));
+  #endif	
+    iCenRepI = CAutolockCenRepI::NewL(iAppUi);
+	// lock status observer
+	iLockObserver = CLockObserver::NewL(iAppUi);
+	// Activitymanager
+	iActivityManager = CUserActivityManager::NewL(CActive::EPriorityStandard);
+	StartActivityMonitoringL();
+    // In GSM the device is always unlocked.
+    // In CDMA, SecClientUi will lock the device on boot-up if needed.
+ 
+ 	if ( aLocked == EAutolockStatusUninitialized )
+	{
+			RProperty::Set(KPSUidCoreApplicationUIs, KCoreAppUIsAutolockStatus,	EAutolockStatusUninitialized);
+	}
+	else
+	{
+	    RProperty::Set(KPSUidCoreApplicationUIs, KCoreAppUIsAutolockStatus,	EAutolockOff);
+  }
+       
+    #if defined(_DEBUG)
+    RDebug::Print(_L("(AUTOLOCK)CAutoLockModel::ConstructL() END"));
+    #endif
+	}
+	//
+// ----------------------------------------------------------
+// CAutoLockModel::StartActivityMonitoringL()
+// Start monitoring user activity
+// ----------------------------------------------------------
+//
+void CAutoLockModel::StartActivityMonitoringL()
+	{	
+	SetActivityManagerL();
+	}
+
+//
+// ----------------------------------------------------------
+// CAutoLockModel::StopActivityMonitoring()
+// Stop monitoring user activity
+// ----------------------------------------------------------
+//
+void CAutoLockModel::StopActivityMonitoring()
+	{
+	CancelActivityManager();
+	}
+
+//
+// ----------------------------------------------------------
+// CAutoLockModel::SetActivityManagerL()
+// Initializes activymanager   
+// ----------------------------------------------------------
+//
+void CAutoLockModel::SetActivityManagerL()
+	{
+	if (AutoLockTimeout() )
+		{
+		iActivityManager->Start(AutoLockTimeout(), TCallBack(HandleInactiveEventL,this), 
+								TCallBack(HandleActiveEventL,this));
+		}
+	else
+		{
+		iActivityManager->Start(AutoLockOff, TCallBack(HandleInactiveEventL,this), 
+								TCallBack(HandleActiveEventL,this));
+		}
+
+	}
+//
+// ----------------------------------------------------------
+// CAutoLockModel::CancelActivityManager()
+// UnInitializes activymanager   
+// ----------------------------------------------------------
+//
+void CAutoLockModel::CancelActivityManager()
+	{
+    if ( iActivityManager )
+        {
+	    iActivityManager->Cancel();
+        }
+	delete iActivityManager;
+	iActivityManager = NULL;
+	}
+//
+// ----------------------------------------------------------
+// CAutoLockModel::~CAutoLockModel()
+// Destructor   
+// ----------------------------------------------------------
+//
+CAutoLockModel::~CAutoLockModel()
+	{
+    delete iCenRepI;
+	delete iLockObserver;
+	StopActivityMonitoring();
+	FeatureManager::UnInitializeLib();
+    // close custom phone
+	}
+//
+// ----------------------------------------------------------
+// CAutoLockModel::AutoLockTimeout()
+// Returns current autolock period
+// ----------------------------------------------------------
+//
+TInt CAutoLockModel::AutoLockTimeout()
+	{
+    return iCenRepI->Timeout();
+	}
+//
+// ----------------------------------------------------------
+// CAutoLockModel::ResetInactivityTimeoutL()
+// Gets autolock period and starts monitoring user activity 
+// ----------------------------------------------------------
+//
+void CAutoLockModel::ResetInactivityTimeout()
+	{	
+	if (AutoLockTimeout() )
+		{
+		iActivityManager->SetInactivityTimeout(AutoLockTimeout());
+		}
+	else
+		{
+		iActivityManager->SetInactivityTimeout(AutoLockOff);
+		}
+	}
+//
+// ----------------------------------------------------------
+// CAutoLockModel::HandleActiveEventL()
+// Handles Active event. Called by ActivityManager
+// ----------------------------------------------------------
+//
+TInt CAutoLockModel::HandleActiveEventL(TAny* /*aPtr*/)
+	{
+	return KErrNone;
+	}
+
+//
+// ----------------------------------------------------------
+// CAutoLockModel::HandleInactiveEventL()
+// Handles InActive event. Called by ActivityManager
+// ----------------------------------------------------------
+//
+TInt CAutoLockModel::HandleInactiveEventL(TAny* aPtr)
+	{
+	if ( STATIC_CAST(CAutoLockModel*, aPtr)->AutoLockTimeout() )
+		{
+			TInt value(EStartupUiPhaseUninitialized);
+			RProperty::Get(KPSUidStartup, KPSStartupUiPhase, value);
+			//Don't lock unless boot is over.
+	    if(value == EStartupUiPhaseAllDone)
+		    {
+		    #if defined(_DEBUG)
+    		RDebug::Print(_L("(AUTOLOCK)CAutoLockModel::HandleInactiveEventL() Boot over"));
+    		#endif
+				#ifdef RD_REMOTELOCK
+				STATIC_CAST(CAutoLockModel*, aPtr)->LockSystemL(ETimerLocked);
+				#else
+				STATIC_CAST(CAutoLockModel*, aPtr)->LockSystemL(EAutolockOn);
+				#endif //RD_REMOTELOCK
+			  }
+			else
+			{
+				#if defined(_DEBUG)
+    		RDebug::Print(_L("(AUTOLOCK)CAutoLockModel::HandleInactiveEventL() In boot; don't lock"));
+    		#endif
+			}
+		}
+	return KErrNone;
+	}
+
+//
+// ----------------------------------------------------------
+// CAutoLockModel::LockSystemL()
+// Locks system
+// ----------------------------------------------------------
+//
+void CAutoLockModel::LockSystemL(TInt aAutolockState)
+	{
+	#if defined(_DEBUG)
+    RDebug::Print(_L("(AUTOLOCK)CAutoLockModel::LockSystemL() BEGIN"));
+    #endif
+    // If already locked, do nothing. Otherwise we'll end up
+    // on top of Screensaver
+    // Check if iSideKey2 is zero or not (locked if nonzero)
+    // Also, phone should not be locked if PUK1 code query is up.
+#ifdef FF_STARTUP_OMA_DM_SUPPORT	// New booting order	Start	ID:	 MVKS-7PZDZ5
+		TInt autolock_value	=	0;
+		RProperty::Get(KPSUidCoreApplicationUIs, KCoreAppUIsAutolockStatus,	autolock_value);	
+		if (autolock_value ==	EAutolockStatusUninitialized)
+		{
+				return;					
+		}		
+#endif	//End	ID:	 MVKS-7PZDZ5
+    if (iAppUi->Locked() || iAppUi->IsPinBlocked())
+        {
+        return;
+        }
+	
+	TInt lightStatus=EForcedLightsUninitialized; 
+	RProperty::Get(KPSUidCoreApplicationUIs,KLightsVTForcedLightsOn,lightStatus ); 
+	//If display is forced on. don't lock 
+	if(lightStatus == EForcedLightsOn ) 
+		{
+		#if defined(_DEBUG) 
+		RDebug::Print(_L("(AUTOLOCK)CAutoLockModel::LockSystemL() Display is forced on. Device not locked")); 
+		#endif 
+		return;
+		}
+
+    //Check which state we are in to see if it's OK to lock the phone
+    //In CDMA when there is no SIM (RUIM) support we should be able to lock
+    //the phone after reboot. In this case ESWStateNormal is too late to lock the phone
+    //and other states below are needed.
+    TBool okToLock = EFalse;
+    TInt sysState = 0;
+    iProperty.Get(KPSUidStartup, KPSGlobalSystemState, sysState);    
+    //If NOT in CDMA the Autolock should come up only after the phone has booted up.
+    if ( FeatureManager::FeatureSupported( KFeatureIdProtocolCdma ) || iAppUi->HiddenReset())
+        {
+        if( (sysState == ESwStateNormalRfOn       ||
+            sysState == ESwStateNormalRfOff       ||
+             sysState == ESwStateCriticalPhaseOK) &&
+            (aAutolockState > EAutolockOff) )	// EMKK-7N3G7R
+            {
+            #if defined(_DEBUG)
+            RDebug::Print(_L("(AUTOLOCK)CAutoLockModel::LockSystemL() LOCKED AFTER HIDDEN RESET"));
+            #endif
+            okToLock = ETrue;
+            }
+        }
+    else //Feature Manager
+        {
+        if( (sysState == ESwStateNormalRfOn       ||
+             sysState == ESwStateNormalRfOff)      &&
+            (aAutolockState > EAutolockOff) ) // EMKK-7N3G7R
+            {
+            okToLock = ETrue;
+            }
+        }
+   TInt tarmFlag;
+if(FeatureManager::FeatureSupported(KFeatureIdSapTerminalControlFw ))    
+{
+    // Get the TARM admin flag value
+	TInt tRet = RProperty::Get( KSCPSIDAutolock, SCP_TARM_ADMIN_FLAG_UID, tarmFlag );
+    
+    if ( tRet != KErrNone )
+        {
+        #if defined(_DEBUG)
+        RDebug::Print(_L("(AUTOLOCK)CAutolockAppUi::BringAppToForegroundL():\
+            Warning: failed to get TARM Admin Flag state"));
+        #endif
+        }
+    else
+        {
+        #if defined(_DEBUG)
+        RDebug::Print(_L("(AUTOLOCK)CAutolockAppUi::BringAppToForegroundL(): TARM flag: %d"),
+            tarmFlag );
+        #endif
+        }
+}
+    
+    TInt callState;
+    iProperty.Get(KPSUidCtsyCallInformation, KCTsyCallState, callState);
+TBool isConditionSatisfied = EFalse;
+if(FeatureManager::FeatureSupported(KFeatureIdSapTerminalControlFw ))
+{        
+    if ( ( callState != EPSCTsyCallStateNone ) && (!( tarmFlag & KSCPFlagAdminLock )) )    
+    			isConditionSatisfied = ETrue;
+}
+else
+{
+    if ( callState != EPSCTsyCallStateNone )
+    		isConditionSatisfied = ETrue;
+}
+		if (isConditionSatisfied)
+        {
+        TBool remoteLocked(EFalse);
+        #ifdef RD_REMOTELOCK
+        remoteLocked = (aAutolockState == ERemoteLocked);
+        #endif //RD_REMOTELOCK
+         if(remoteLocked) 
+         {
+            #if defined(_DEBUG)
+            RDebug::Print(_L("(AUTOLOCK)CAutoLockModel::LockSystemL() REMOTE LOCKED"));
+            #endif
+            okToLock = ETrue;
+            
+         }
+         else
+            okToLock = EFalse;        
+        }
+       
+    if (!iAppUi->IsForeground() && okToLock)
+        {
+        #if defined(_DEBUG)
+        RDebug::Print(_L("(AUTOLOCK)CAutoLockModel::LockSystemL() LOCK PHONE"));
+        #endif   
+		// close fast-swap window
+		CEikonEnv::Static()->DismissTaskList();
+		// inform Avokon & Other app that system is locked
+		// unless the value has already been set in secuisystemlock
+		#ifdef RD_REMOTELOCK
+		if(aAutolockState != EManualLocked)
+    		{
+    		    #if defined(_DEBUG)
+                RDebug::Print(_L("(AUTOLOCK)CAutoLockModel::LockSystemL() Timer/Remote locked: %d"), aAutolockState);
+                #endif
+    		    SetLockedL(aAutolockState);		    
+    		}
+		else if((aAutolockState == EManualLocked)  && !iAppUi->Locked() && iAppUi->HiddenReset())
+		     {   //set the PubSub key if we are to be locked after a hidden reset has occurred.
+		         #if defined(_DEBUG)
+                 RDebug::Print(_L("(AUTOLOCK)CAutoLockModel::LockSystemL() HIDDEN RESET LOCK"));
+                 #endif
+		         SetLockedL(aAutolockState);	   
+		     }
+		else
+		    {   //Normal manual lock from power key. Just set the CenRep key.
+		        iCenRepI->SetLockedL(okToLock);
+		    }
+		#else //! RD_REMOTELOCK
+		SetLockedL(aAutolockState);
+		#endif//RD_REMOTELOCK
+		// lock keys
+		iAppUi->LockKeysL();
+		// app to foreground
+		iAppUi->BringAppToForegroundL();
+         // Reset inactivity time so that Screensaver gets to
+        // run again after its timeout. We'll ignore the new
+        // inactivity timeout, if already locked
+        User::ResetInactivityTime();
+		}
+    #if defined(_DEBUG)
+    RDebug::Print(_L("(AUTOLOCK)CAutoLockModel::LockSystemL() END"));
+    #endif
+} 
+	
+//
+// ----------------------------------------------------------
+// CAutoLockModel::SetLocked
+// Sets lockvalue in Publish & Subscribe and Central Repository
+// ----------------------------------------------------------
+//
+void CAutoLockModel::SetLockedL(TInt aAutolockState)
+	{
+	#if defined(_DEBUG)
+    RDebug::Print(_L("(AUTOLOCK)CAutoLockModel::SetLockedL() begin"));
+    #endif
+	TBool locked = (aAutolockState > EAutolockOff);
+	if (locked)
+		{
+        iProperty.Set(KPSUidCoreApplicationUIs, KCoreAppUIsAutolockStatus, aAutolockState);
+        #if defined(_DEBUG)
+        RDebug::Print(_L("(AUTOLOCK)CAutoLockModel::SetLockedL() LOCK"));
+        #endif
+		}		
+  else
+		{				
+        iProperty.Set(KPSUidCoreApplicationUIs, KCoreAppUIsAutolockStatus, EAutolockOff);
+        #if defined(_DEBUG)
+        RDebug::Print(_L("(AUTOLOCK)CAutoLockModel::SetLockedL() UNLOCK"));         
+        #endif
+    }
+
+    iCenRepI->SetLockedL(locked);
+    #if defined(_DEBUG)
+    RDebug::Print(_L("(AUTOLOCK)CAutoLockModel::SetLockedL() end"));
+    #endif
+	}
+
+// END OF FILE