lafagnosticuifoundation/cone/src/coevwman.cpp
changeset 0 2f259fa3e83a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lafagnosticuifoundation/cone/src/coevwman.cpp	Tue Feb 02 01:00:49 2010 +0200
@@ -0,0 +1,818 @@
+// Copyright (c) 2000-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:
+//
+
+#include "COEVWMAN.H"
+#include "coepriv.h"	// CCoeView
+#include <coeaui.h>
+#include "coepanic.h"
+#include <coecntss.h>
+
+#ifdef SYMBIAN_ENABLE_SPLIT_HEADERS
+#include <viewclipartner.h>
+#endif
+
+const TInt KViewArrayGranularity=5;
+
+//
+// Class CCoeViewObserver
+//
+
+class CCoeViewObserver : public CBase, public MCoeViewObserver
+	{
+public:
+	CCoeViewObserver(CCoeViewManager& aViewManager);
+	~CCoeViewObserver();
+public: // from MCoeViewObserver
+	void HandleViewEventL(const TVwsViewEvent& aEvent);
+private:
+	CCoeViewManager& iViewManager;
+	};
+
+CCoeViewObserver::~CCoeViewObserver()
+	{}
+
+CCoeViewObserver::CCoeViewObserver(CCoeViewManager& aViewManager)
+	: iViewManager(aViewManager)
+	{}
+
+void CCoeViewObserver::HandleViewEventL(const TVwsViewEvent& aEvent)
+	{
+	switch (aEvent.iEventType)
+		{
+		case TVwsViewEvent::EVwsDeactivateView:
+			{
+			TVwsViewId viewId;
+			if (iViewManager.GetActiveViewId(viewId) != KErrNotFound)
+				iViewManager.DoDeactivation(viewId, aEvent.iViewTwoId, TVwsViewEvent::EVwsDeactivateView);
+			}
+			break;
+		default:
+			break;
+		}
+	}
+
+//
+// Class CCoeViewManager
+//
+
+CCoeViewManager::CCoeViewManager(CCoeEnv& aCoeEnv,CCoeAppUi& aAppUi,CCoeAppUi* aPreviousAppUi)
+	: iAppUi(aAppUi), iCoeEnv(aCoeEnv), iPreviousAppUi(aPreviousAppUi), iRegisteredApplicationView(EFalse),
+	  iViewArray(KViewArrayGranularity), iViewDeactivationObserverArray(KViewArrayGranularity),
+	  iViewActivationObserverArray(KViewArrayGranularity), iViewObserverArray(KViewArrayGranularity),
+	  iActiveViewIndex(KErrNotFound), iDefaultViewId(KNullViewId),
+	  iLastActiveViewId(KNullViewId), iActiveViewId(KNullViewId), iApplicationViewId(KNullViewId)
+	{
+	}
+
+void CCoeViewManager::ConstructL()
+	{
+	iVwsSession=iCoeEnv.InitViewServerSessionL(*this);
+	if (iPreviousAppUi)
+		{
+		iViewObserver=new(ELeave) CCoeViewObserver(*this);
+		AddViewObserverL(iViewObserver);
+		}
+	}
+
+CCoeViewManager* CCoeViewManager::NewL(CCoeEnv& aCoeEnv,CCoeAppUi& aAppUi,CCoeAppUi* aPreviousAppUi)
+	{
+	CCoeViewManager* self=new(ELeave) CCoeViewManager(aCoeEnv,aAppUi,aPreviousAppUi);
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	CleanupStack::Pop();	// self
+	return self;
+	}
+
+CCoeViewManager::~CCoeViewManager()
+	{
+	if (iRegisteredApplicationView)
+		{
+		DeregisterApplicationView();
+		}
+
+	if (iPreviousAppUi)
+		{
+		RemoveViewObserver(iViewObserver);
+		delete iViewObserver;
+		}
+
+	iViewArray.ResetAndDestroy();
+	iViewDeactivationObserverArray.Reset();
+	iViewActivationObserverArray.Reset();
+	iViewObserverArray.Reset();
+	}
+
+void CCoeViewManager::HandleViewEventL(const TVwsViewEvent& aEvent)
+	{
+	switch (aEvent.iEventType)
+		{
+		case TVwsViewEvent::EVwsActivateView:
+			DoActivationL(aEvent.iViewOneId,aEvent.iViewTwoId,aEvent.iCustomMessageId,aEvent.iCustomMessageLength);
+			break;
+		case TVwsViewEvent::EVwsDeactivateView:
+		case TVwsViewEvent::EVwsDeactivateViewDifferentInstance:
+			DoDeactivation(aEvent.iViewOneId, aEvent.iViewTwoId, aEvent.iEventType);
+			break;
+		case TVwsViewEvent::EVwsScreenDeviceChanged:
+			{
+			TVwsViewIdAndMessage event;
+			TRAP_IGNORE(event=HandleScreenDeviceChangedL(aEvent.iViewOneId));
+			iVwsSession->ActivateViewViaViewEvent(event);
+			}
+			break;
+		case TVwsViewEvent::EVwsDeactivationNotification:
+			HandleViewDeactivationNotification(aEvent.iViewOneId,aEvent.iViewTwoId);
+			break;
+		case TVwsViewEvent::EVwsActivationNotification:
+			HandleViewActivationNotification(aEvent.iViewOneId,aEvent.iViewTwoId);
+			break;
+		default:
+			Panic(ECoePanicViewEventNotHandled);
+			break;
+		}
+
+	const TInt numObservers=iViewObserverArray.Count();
+	for (TInt ii=0;ii<numObservers;ii++)
+		{
+		iViewObserverArray[ii]->HandleViewEventL(aEvent);
+		}
+	}
+
+void CCoeViewManager::ActivateViewL(const TVwsViewId& aViewId, TBool aActivatingTopView)
+ 	{
+	ActivateViewL(aViewId,TUid::Null(),KNullDesC8,aActivatingTopView);
+ 	}
+
+void ClearActivatingTopViewFlag(TAny* aFlagPtr)
+ 	{
+	*(TBool*)aFlagPtr = EFalse;
+ 	}
+
+void CCoeViewManager::ActivateViewL(const TVwsViewId& aViewId,const TUid& aCustomMessageId,const TDesC8& aCustomMessage,TBool aActivatingTopView)
+ 	{
+ 	// Ignore duplicate ActivatingTopView request when there is already one outstanding.
+ 	if (iActivatingTopView && aActivatingTopView)
+ 	    {
+ 	    return;
+ 	    }
+	iActivatingTopView = aActivatingTopView;
+	CleanupStack::PushL(TCleanupItem(ClearActivatingTopViewFlag, &iActivatingTopView));
+	if (iPreviousAppUi)
+		{
+		if (ViewIndex(aViewId)!=KErrNotFound || aViewId==iApplicationViewId)
+			{
+			iCustomMessage.Set(aCustomMessage);
+			TVwsViewId viewIdToDeactivate = (aViewId==iLastActiveViewId) ? KNullViewId : iLastActiveViewId;
+			DoActivationL(aViewId,viewIdToDeactivate,aCustomMessageId,iCustomMessage.Length());
+			if (viewIdToDeactivate!=KNullViewId && viewIdToDeactivate!=aViewId)
+				{
+				DoDeactivation(viewIdToDeactivate, aViewId, TVwsViewEvent::EVwsDeactivateView);
+				}
+			}
+		else
+			{
+			iPreviousAppUi->ActivateViewL(aViewId,aCustomMessageId,aCustomMessage);
+			}
+		}
+	else
+		{
+		if (aViewId == iDefaultViewId && aViewId.iAppUid == aViewId.iViewUid)
+			{
+			// If were activating the default view of a non-view based app, don't wait for viewsrv to respond.
+			CreateActivateViewEventL(aViewId, aCustomMessageId, aCustomMessage);
+			// record this view as activated to prevent it getting activated twice.
+			iActiveViewId = aViewId;
+			}
+		else
+			{
+			iCustomMessage.Set(KNullDesC8);
+			TInt err=iVwsSession->ActivateView(aViewId,aCustomMessageId,aCustomMessage, iCustomControl);
+			if (err == KErrOverflow)
+				{
+				// avkon hides overflow messages on view activation
+				err = KLeaveWithoutAlert;
+				}
+			User::LeaveIfError(err);
+			}
+		}
+	CleanupStack::Pop(); // flag cleanup item
+	}
+
+void CCoeViewManager::DeactivateActiveViewL()
+	{
+	if (iPreviousAppUi)
+		{
+		iPreviousAppUi->DeactivateActiveViewL();
+		}
+	else
+		{
+		User::LeaveIfError(iVwsSession->DeactivateActiveView());
+		}
+	}
+void CCoeViewManager::DeactivateActiveViewIfOwnerMatchL()
+	{
+ 	if (iPreviousAppUi)
+ 		{
+ 		iPreviousAppUi->DeactivateActiveViewIfOwnerMatchL();
+ 		}
+ 	else
+ 		{
+ 		User::LeaveIfError(iVwsSession->DeactivateActiveViewIfOwnerMatch());
+ 		}
+ 	}
+ 
+
+void CCoeViewManager::ActivateTopViewL()
+	{
+	if (iPreviousAppUi)
+		{
+		iPreviousAppUi->ActivateTopViewL();
+		}
+	
+	if (iActiveViewId!=KNullViewId)
+		{
+		TVwsViewId activeViewId;
+		TInt err = iVwsSession->GetCurrentActiveViewInSystem(activeViewId);
+		if ((err == KErrNone) && (iActiveViewId == activeViewId))
+			{
+			return;
+			}
+		}
+
+	if (iLastActiveViewId!=KNullViewId)
+		{
+		ActivateViewL(iLastActiveViewId, ETrue);
+		}
+	else if (iDefaultViewId!=KNullViewId)
+		{
+		ActivateViewL(iDefaultViewId, ETrue);
+		}
+	else if (iViewArray.Count())
+		{
+		ActivateViewL(iViewArray[0]->iView.ViewId(), ETrue);
+		}
+	else if (iApplicationViewId!=KNullViewId)
+		{
+		ActivateViewL(iApplicationViewId, ETrue);
+		}
+	}
+
+TInt CCoeViewManager::GetActiveViewId(TVwsViewId& aViewId) const
+	{
+	if (iActiveViewId!=KNullViewId)
+		{
+		aViewId=iActiveViewId;
+		return KErrNone;
+		}
+
+	return KErrNotFound;
+	}
+
+void CCoeViewManager::RegisterViewL(MCoeView& aView)
+	{
+	CCoeView* newView=CCoeView::NewLC(aView);
+	iViewArray.AppendL(newView);
+	CleanupStack::Pop(); // newView
+	if (!iPreviousAppUi)
+		{
+		TInt err=iVwsSession->AddView(aView.ViewId());
+		if (err)
+			{
+			iViewArray.Delete(ViewIndex(aView));
+			User::Leave(err);
+			}
+		}
+	}
+
+void CCoeViewManager::RegisterApplicationViewL(const TUid& aAppUid)
+	{
+	TVwsViewId viewId(aAppUid,aAppUid);
+	if (!iPreviousAppUi)
+		{
+		TInt err=iVwsSession->AddView(viewId);
+		if (err!=KErrCouldNotConnect && err!=KErrNone)
+			{
+			User::Leave(err);
+			}
+		}
+	iApplicationViewId=viewId;
+	iDefaultViewId=viewId;
+	}
+
+void CCoeViewManager::DeregisterApplicationView()
+	{
+	if (!iPreviousAppUi && iApplicationViewId!=KNullViewId)
+		{
+		iVwsSession->RemoveView(iApplicationViewId);	// ignore error
+		}
+	iApplicationViewId=KNullViewId;
+	}
+
+void CCoeViewManager::SetDefaultViewL(const MCoeView& aView)
+	{
+	iDefaultViewId=aView.ViewId();
+	}
+
+void CCoeViewManager::SetApplicationViewAsDefaultL()
+	{
+	__ASSERT_DEBUG(iApplicationViewId!=KNullViewId,Panic(ECoePanicViewNotFound));
+	iDefaultViewId=iApplicationViewId;
+	}
+
+void CCoeViewManager::CheckInitializeViewsL(const TUid& aAppUid)
+	{
+	const TInt count=iViewArray.Count();
+	
+	// Register application view if there are no views
+	if (count==0 && iApplicationViewId==KNullViewId)
+		{
+		RegisterApplicationViewL(aAppUid);
+		iRegisteredApplicationView=ETrue;
+		}
+	
+	// Set default view if none set
+	if (iDefaultViewId==KNullViewId)
+		{
+		if (count==0)
+			{
+			SetApplicationViewAsDefaultL();
+			}
+		else
+			{
+			iDefaultViewId=iViewArray[0]->iView.ViewId();
+			}
+		}
+	}
+
+TInt CCoeViewManager::GetDefaultViewId(TVwsViewId& aViewId) const
+	{
+	if (iDefaultViewId!=KNullViewId)
+		{
+		aViewId=iDefaultViewId;
+		return KErrNone;
+		}
+
+	return KErrNotFound;
+	}
+
+void CCoeViewManager::DeregisterView(const MCoeView& aView)
+	{
+	const TInt viewIndex=ViewIndex(aView);
+	if (viewIndex == KErrNotFound)
+		return;
+
+	if (!iPreviousAppUi)
+		{
+		__ASSERT_ALWAYS(iVwsSession,Panic(ECoePanicNoViewServerConnection));
+		iVwsSession->RemoveView(aView.ViewId());	// Ignore error.
+		if(aView.ViewId()==iLastActiveViewId)
+			{
+			iLastActiveViewId=KNullViewId;
+			}
+		}
+	
+	if (iActiveViewIndex>viewIndex)
+		{
+		iActiveViewIndex--;
+		if (iPreviousAppUi)
+			{
+			if (iActiveViewIndex>=0)
+				{
+				iActiveViewId=iViewArray[iActiveViewIndex]->iView.ViewId();
+				}
+			else
+				{
+				iActiveViewId=KNullViewId;
+				}
+			iAppUi.SetCurrentControlStackGroupId(iActiveViewId.iViewUid.iUid);
+			}
+		}
+
+	delete iViewArray[viewIndex];
+	iViewArray.Delete(viewIndex);
+	}
+
+void CCoeViewManager::AddViewDeactivationObserverL(MCoeViewDeactivationObserver* aViewDeactivationObserver)
+	{
+	iViewDeactivationObserverArray.AppendL(aViewDeactivationObserver);
+	}
+
+void CCoeViewManager::RemoveViewDeactivationObserver(MCoeViewDeactivationObserver* aViewDeactivationObserver)
+	{
+	TInt pos;
+	TKeyArrayFix key(0,ECmpTInt);
+	if (iViewDeactivationObserverArray.Find(aViewDeactivationObserver,key,pos)==KErrNone)
+		{
+		iViewDeactivationObserverArray.Delete(pos);
+		}
+	}
+
+void CCoeViewManager::NotifyNextDeactivation(const TVwsViewId& aViewId, MCoeViewDeactivationObserver& aViewDeactivationObserver)
+	{
+	__ASSERT_DEBUG(iNextViewDeactivationObserver==NULL,Panic(ECoePanicViewNotificationObserverAlreadyExists));
+	__ASSERT_ALWAYS(iVwsSession,Panic(ECoePanicNoViewServerConnection));
+
+	iNextViewDeactivationObserver=&aViewDeactivationObserver;
+	iVwsSession->NotifyNextDeactivation(aViewId);
+	}
+
+void CCoeViewManager::NotifyNextDeactivation(MCoeViewDeactivationObserver& aViewDeactivationObserver)
+	{
+	__ASSERT_DEBUG(iNextViewDeactivationObserver==NULL,Panic(ECoePanicViewNotificationObserverAlreadyExists));
+	__ASSERT_ALWAYS(iVwsSession,Panic(ECoePanicNoViewServerConnection));
+
+	iNextViewDeactivationObserver=&aViewDeactivationObserver;
+	iVwsSession->NotifyNextDeactivation();
+	}
+
+void CCoeViewManager::AddViewActivationObserverL(MCoeViewActivationObserver* aViewActivationObserver)
+	{
+	iViewActivationObserverArray.AppendL(aViewActivationObserver);
+	}
+
+void CCoeViewManager::RemoveViewActivationObserver(MCoeViewActivationObserver* aViewActivationObserver)
+	{
+	TInt pos;
+	TKeyArrayFix key(0,ECmpTInt);
+	if (iViewActivationObserverArray.Find(aViewActivationObserver,key,pos)==KErrNone)
+		{
+		iViewActivationObserverArray.Delete(pos);
+		}
+#ifdef _DEBUG
+	else
+		{
+		RDebug::Printf("CCoeViewManager::RemoveViewActivationObserver. Coe view observer not found.");		
+		}
+#endif
+	}
+
+void CCoeViewManager::NotifyNextActivation(const TVwsViewId& aViewId, MCoeViewActivationObserver& aViewActivationObserver)
+	{
+	__ASSERT_DEBUG(iNextViewActivationObserver==NULL,Panic(ECoePanicViewNotificationObserverAlreadyExists));
+	__ASSERT_ALWAYS(iVwsSession,Panic(ECoePanicNoViewServerConnection));
+
+	iNextViewActivationObserver=&aViewActivationObserver;
+	iVwsSession->NotifyNextActivation(aViewId);
+	}
+
+void CCoeViewManager::NotifyNextActivation(MCoeViewActivationObserver& aViewActivationObserver)
+	{
+	__ASSERT_DEBUG(iNextViewActivationObserver==NULL,Panic(ECoePanicViewNotificationObserverAlreadyExists));
+	__ASSERT_ALWAYS(iVwsSession,Panic(ECoePanicNoViewServerConnection));
+
+	iNextViewActivationObserver=&aViewActivationObserver;
+	iVwsSession->NotifyNextActivation();
+	}
+
+void CCoeViewManager::AddViewObserverL(MCoeViewObserver* aViewObserver)
+	{
+	if (iPreviousAppUi)
+		{
+		iPreviousAppUi->AddViewObserverL(aViewObserver);
+		}
+	else
+		{
+		iViewObserverArray.AppendL(aViewObserver);
+		}
+	}
+
+void CCoeViewManager::RemoveViewObserver(MCoeViewObserver* aViewObserver)
+	{
+	if (iPreviousAppUi)
+		{
+		iPreviousAppUi->RemoveViewObserver(aViewObserver);
+		}
+	else
+		{
+		TInt pos;
+		TKeyArrayFix key(0,ECmpTInt);
+		if (iViewObserverArray.Find(aViewObserver,key,pos)==KErrNone)
+			{
+			iViewObserverArray.Delete(pos);
+			}
+		}
+	}
+
+TInt CCoeViewManager::ViewIndex(const MCoeView& aView) const
+	{
+	const TInt numViews=iViewArray.Count();
+	
+	for (TInt ii=0;ii<numViews;ii++)
+		{
+		const MCoeView& view=iViewArray[ii]->iView;
+		if (&view==&aView)
+			{
+			return ii;
+			}
+		}
+
+	return KErrNotFound;
+	}
+
+TInt CCoeViewManager::ViewIndex(const TVwsViewId& aViewId) const
+	{
+	const TInt numViews=iViewArray.Count();
+	
+	for (TInt ii=0;ii<numViews;ii++)
+		{
+		if (iViewArray[ii]->iView.ViewId()==aViewId)
+			{
+			return ii;
+			}
+		}
+
+	return KErrNotFound;
+	}
+
+void CCoeViewManager::DoActivationL(const TVwsViewId& aViewId,const TVwsViewId& aPreviousViewId,const TUid& aCustomMessageId,TInt aCustomMessageLength)
+	{
+	// Retrieve custom message from server if necessary.
+	HBufC8* customMessage=NULL;
+	if (aCustomMessageLength)
+		{
+		if (!iPreviousAppUi)
+			{
+			customMessage=HBufC8::NewLC(aCustomMessageLength);
+			TPtr8 msgPtr=customMessage->Des();
+			User::LeaveIfError(iVwsSession->RequestCustomMessage(msgPtr));
+			}
+		else
+			{
+			customMessage=iCustomMessage.AllocLC();
+			}
+		}
+
+	if (aViewId.iViewUid.iUid==aViewId.iAppUid.iUid)
+		{
+		if (customMessage)
+			{
+			CleanupStack::PopAndDestroy(customMessage); 
+			}
+		CompleteActivation(-1,aViewId,aPreviousViewId);
+		return;
+		}
+
+	// Find the index to activate
+	TInt indexToActivate=ViewIndex(aViewId);
+	__ASSERT_ALWAYS(indexToActivate!=KErrNotFound, Panic(ECoePanicViewNotFound));
+	CCoeView& viewToActivate=*(iViewArray[indexToActivate]);
+
+	// If first activation, construct.
+	if (!(viewToActivate.iConstructed))
+		{
+		viewToActivate.iView.ViewConstructL();
+		viewToActivate.iConstructed=ETrue;
+		}
+		
+	// check if view has a preferred screen mode
+	viewToActivate.iView.PrepareForViewActivation();
+	
+	// check view can cope with screenmode
+	const TInt screenMode=iCoeEnv.ScreenDevice()->CurrentScreenMode();
+	if (!viewToActivate.iView.ViewScreenModeCompatible(screenMode))
+		{
+		User::Leave(KErrViewWrongMode);
+		}
+	iActivatingViewId = aViewId;
+	// Do the activation.
+	if (customMessage)
+		{
+		viewToActivate.iView.ViewActivatedL(aPreviousViewId,aCustomMessageId,*customMessage);
+		CleanupStack::PopAndDestroy(customMessage);  
+		}
+	else
+		{
+		viewToActivate.iView.ViewActivatedL(aPreviousViewId,aCustomMessageId,KNullDesC8);
+		}
+	CompleteActivation(indexToActivate,aViewId,aPreviousViewId);
+	}
+
+TBool CCoeViewManager::CheckSourceOfViewSwitchL(const TSecurityPolicy& aSecurityPolicy,const char* aDiagnostic) const
+	{
+	if (iPreviousAppUi!=NULL)
+		{
+		return iPreviousAppUi->CheckSourceOfViewSwitchL(aSecurityPolicy,aDiagnostic);
+		}
+	TBool result=EFalse;
+	User::LeaveIfError(iVwsSession->CheckSourceOfViewSwitch(result,aSecurityPolicy,aDiagnostic));
+	return result;
+	}
+
+void CCoeViewManager::CompleteActivation(TInt aActiveViewIndex,const TVwsViewId& aViewId,const TVwsViewId& aPreviousViewId)
+	{
+	const TInt numObservers=iViewActivationObserverArray.Count();
+	for (TInt ii=0;ii<numObservers;ii++)
+		{
+		iViewActivationObserverArray[ii]->HandleViewActivation(aViewId,aPreviousViewId);
+		}
+	
+	// 	Should the ordinal only be set as long as the top view is not active?
+	if(CCoeControlStaticSettings::OrdinalForAllViews() == EFalse) // default behaviour
+		{
+		if (!iActivatingTopView)
+			{
+			if(!iCustomControl)
+				{
+				iCoeEnv.WsSession().SetWindowGroupOrdinalPosition(iCoeEnv.RootWin().Identifier(),iWindowGroupOrdinal);	
+				}
+			}
+			// else do nothing
+		}
+	else // Set for all views
+		{
+		if(!iCustomControl)
+			{
+			iCoeEnv.WsSession().SetWindowGroupOrdinalPosition(iCoeEnv.RootWin().Identifier(),iWindowGroupOrdinal);
+			}
+		}
+		
+	iActivatingTopView = EFalse;
+	iActiveViewIndex=aActiveViewIndex;
+	iActiveViewId=aViewId;
+	iAppUi.SetCurrentControlStackGroupId(iActiveViewId.iViewUid.iUid);
+	iLastActiveViewId=aViewId;
+	}
+
+void CCoeViewManager::DoDeactivation(const TVwsViewId& aViewId, const TVwsViewId& aActiveViewId, const TVwsViewEvent::TVwsViewEventType aType)
+	{
+	const TInt numObservers=iViewDeactivationObserverArray.Count();
+	for (TInt ii=0;ii<numObservers;ii++)
+		{
+		iViewDeactivationObserverArray[ii]->HandleViewDeactivation(aViewId,aActiveViewId);
+		}
+
+	if (aViewId.iViewUid.iUid != aViewId.iAppUid.iUid)
+		{	// Only deactive if not a pseudo-application view.
+		TInt indexToDeactivate=ViewIndex(aViewId);
+		__ASSERT_ALWAYS(indexToDeactivate!=KErrNotFound, Panic(ECoePanicViewNotFound));
+		iViewArray[indexToDeactivate]->iView.ViewDeactivated();
+		}
+		
+	/**	Reset active view record if:
+	1. Newly activated view is not in this app
+	2. The view to activate and view to deactivate are from different instances of the same application
+	*/
+	if ((aViewId.iAppUid!=aActiveViewId.iAppUid) || (aType == TVwsViewEvent::EVwsDeactivateViewDifferentInstance))
+		{
+		iActiveViewIndex=-1;
+		iActiveViewId=KNullViewId;
+		}
+	}
+
+TVwsViewIdAndMessage CCoeViewManager::HandleScreenDeviceChangedL(const TVwsViewId& aViewId)
+	{
+	CCoeScreenDeviceChangeDefaultHandler* screenChangeHandler=CCoeScreenDeviceChangeDefaultHandler::Self();
+	if (screenChangeHandler)
+		screenChangeHandler->HandleScreenDeviceChangedL();
+	if (aViewId.iViewUid.iUid == aViewId.iAppUid.iUid)
+		{
+		if (screenChangeHandler)
+			{
+			return screenChangeHandler->DefaultViewOnScreenDeviceChanged();
+			}
+		return TVwsViewIdAndMessage(aViewId);
+		}
+	else
+		{
+		TInt index=ViewIndex(aViewId);
+		__ASSERT_ALWAYS(index!=KErrNotFound, Panic(ECoePanicViewNotFound));
+		return iViewArray[index]->iView.ViewScreenDeviceChangedL();
+		}
+	}
+
+void CCoeViewManager::HandleViewDeactivationNotification(const TVwsViewId& aViewId,const TVwsViewId& aActiveViewId)
+	{
+	ASSERT(iNextViewDeactivationObserver);
+	MCoeViewDeactivationObserver* observer=iNextViewDeactivationObserver;
+	iNextViewDeactivationObserver=NULL;
+	observer->HandleViewDeactivation(aViewId,aActiveViewId);
+	}
+
+void CCoeViewManager::HandleViewActivationNotification(const TVwsViewId& aActiveViewId,const TVwsViewId& aViewToDeactivatedId)
+	{
+	ASSERT(iNextViewActivationObserver);
+	MCoeViewActivationObserver* observer=iNextViewActivationObserver;
+	iNextViewActivationObserver=NULL;
+	observer->HandleViewActivation(aActiveViewId,aViewToDeactivatedId);
+	}
+
+void CCoeViewManager::CreateActivateViewEventL(const TVwsViewId& aViewId,const TUid& aCustomMessageId,const TDesC8& aCustomMessage)
+	{
+	TInt err = iVwsSession->CreateActivateViewEvent(aViewId,aCustomMessageId,aCustomMessage, iCustomControl);
+	if (err == KErrOverflow)
+		{
+		err = KLeaveWithoutAlert;
+		}
+	User::LeaveIfError(err);
+	}
+
+void CCoeViewManager::SetSystemDefaultViewL(const TVwsViewId& aViewId,TInt aMode)
+	{
+	if(iPreviousAppUi)
+		{
+		iPreviousAppUi->SetSystemDefaultViewL(aViewId, aMode);
+		}
+	else
+		{
+		User::LeaveIfError(iVwsSession->SetSystemDefaultView(aViewId, aMode));
+		}
+	}
+
+void CCoeViewManager::SetSystemDefaultViewL(const TVwsViewId& aViewId)
+	{
+	if(iPreviousAppUi)
+		{
+		iPreviousAppUi->SetSystemDefaultViewL(aViewId);
+		}
+	else
+		{
+		User::LeaveIfError(iVwsSession->SetSystemDefaultView(aViewId));
+		}
+	}
+
+void CCoeViewManager::GetSystemDefaultViewL(TVwsViewId& aViewId)
+	{
+	User::LeaveIfError(iVwsSession->GetSystemDefaultView(aViewId));
+	}
+	
+TBool CCoeViewManager::IsViewConstructed(const TVwsViewId& aViewId) const
+	{
+	const TInt viewCount = iViewArray.Count();
+	for (TInt viewIndex = 0; viewIndex < viewCount; viewIndex++)
+		{
+		if (iViewArray[viewIndex]->iView.ViewId() == aViewId && iViewArray[viewIndex]->iConstructed)
+			{
+			return ETrue;
+			}
+		}
+	return EFalse;
+	}
+
+TInt CCoeViewManager::EnableExternalViewSwitches(TBool aEnable)
+	{
+	return iVwsSession->EnableExternalViewSwitches(aEnable);
+	}
+
+TInt CCoeViewManager::GetTopViewId(TVwsViewId& aViewId) const
+	{
+	if (iActivatingViewId!=KNullViewId)
+		{
+		aViewId = iActivatingViewId;
+		return KErrNone;
+		}
+	if (iLastActiveViewId!=KNullViewId)
+		{
+		aViewId = iLastActiveViewId;
+		return KErrNone;
+		}
+	if (iDefaultViewId!=KNullViewId)
+		{
+		aViewId = iDefaultViewId;
+		return KErrNone;
+		}
+	if (iViewArray.Count())
+		{
+		aViewId = iViewArray[0]->iView.ViewId();
+		return KErrNone;
+		}
+	if (iApplicationViewId!=KNullViewId)
+		{
+		aViewId = iApplicationViewId;
+		return KErrNone;
+		}
+	if (iPreviousAppUi)
+		{
+		return iPreviousAppUi->GetTopViewId(aViewId);
+		}
+	return KErrNotFound;
+	}
+
+void CCoeViewManager::SetCustomControl(const TInt aCustomControl)
+	{
+	iCustomControl=aCustomControl;
+	}
+
+void CCoeViewManager::SetWindowGroupOrdinal(const TInt aWindowGroupOrdinal)
+	{
+	iWindowGroupOrdinal=aWindowGroupOrdinal;
+	}
+
+void CCoeViewManager::UpdateViewServerBackgroundColor(const TRgb& aBgColor)
+	{
+	iVwsSession->SetWindowBackgroundColor(aBgColor);
+	}
+
+	
+