--- a/idlehomescreen/hscontentcontrol/src/hscontentcontrolfactory.cpp Tue Feb 02 00:04:13 2010 +0200
+++ b/idlehomescreen/hscontentcontrol/src/hscontentcontrolfactory.cpp Fri Feb 19 22:42:37 2010 +0200
@@ -18,8 +18,10 @@
// System include files
#include <ecom/ecom.h>
#include <ecom/implementationinformation.h>
+#include <aknview.h>
// User include files
+#include "xnappuiadapter.h"
#include "hscontentcontrolfactory.h"
#include "hscontentcontrolecomlistener.h"
#include "hscontentcontroluninstallmonitor.h"
@@ -60,9 +62,11 @@
// CHsContentControlFactory::NewL()
// ----------------------------------------------------------------------------
//
-EXPORT_C CHsContentControlFactory* CHsContentControlFactory::NewL()
+EXPORT_C CHsContentControlFactory* CHsContentControlFactory::NewL(
+ CXnAppUiAdapter& aAdapter )
{
- CHsContentControlFactory* self = new ( ELeave ) CHsContentControlFactory();
+ CHsContentControlFactory* self =
+ new ( ELeave ) CHsContentControlFactory( aAdapter );
CleanupStack::PushL( self );
self->ConstructL();
CleanupStack::Pop( self );
@@ -88,7 +92,8 @@
// CHsContentControlFactory::CHsContentControlFactory()
// ----------------------------------------------------------------------------
//
-CHsContentControlFactory::CHsContentControlFactory()
+CHsContentControlFactory::CHsContentControlFactory( CXnAppUiAdapter& aAdapter )
+ :iAdapter( aAdapter )
{
}
@@ -100,6 +105,16 @@
{
iImplArray.ResetAndDestroy();
iImplArray.Close();
+
+ if ( iHsContentControlUis.Count() > 0 )
+ {
+ for( TInt index( iHsContentControlUis.Count() - 1 ); index >= 0; --index )
+ {
+ CHsContentControlUi* cc( iHsContentControlUis[ index ] );
+ ReleaseHsCcUi( cc );
+ }
+ }
+
iHsContentControlUis.ResetAndDestroy();
delete iHsContentControlEComListener;
@@ -200,6 +215,7 @@
// ImplUid of plugin must match Sis pkg uid
if ( cc && cc->ImplUid() == aPkgUid )
{
+ ReleaseHsCcUi( cc );
iHsContentControlUis.Remove( index );
delete cc;
cc = NULL;
@@ -245,6 +261,7 @@
CHsContentControlUi* cc( iHsContentControlUis[ innerIndex ] );
if ( cc && cc->ImplUid() == uid )
{
+ ReleaseHsCcUi( cc );
iHsContentControlUis.Remove( innerIndex );
delete cc;
cc = NULL;
@@ -310,6 +327,7 @@
CHsContentControlUi* cc( iHsContentControlUis[ innerIndex ] );
if ( cc && cc->ImplUid() == uid )
{
+ ReleaseHsCcUi( cc );
iHsContentControlUis.Remove( innerIndex );
delete cc;
cc = NULL;
@@ -323,4 +341,34 @@
return EFalse;
}
+// ----------------------------------------------------------------------------
+// CHsContentControlFactory::ReleaseHsCcUi
+// ----------------------------------------------------------------------------
+//
+void CHsContentControlFactory::ReleaseHsCcUi(
+ CHsContentControlUi* aHsContentControlUi )
+ {
+ if ( &iAdapter && aHsContentControlUi )
+ {
+ RPointerArray<CAknView> views;
+
+ // notify plugin about deactivation
+ aHsContentControlUi->DeActivate();
+
+ // get all views from HsContentControlUi
+ aHsContentControlUi->Views( views );
+
+ for ( TInt i=0; i<views.Count(); i++ )
+ {
+ CAknView* view = views[ i ];
+ views.Remove( i );
+ // remove/deregister/delete all views from appui
+ TRAP_IGNORE( iAdapter.RemoveViewL( *view ) );
+ }
+
+ // reset views array
+ views.Reset();
+ }
+ }
+
// End of file