diff -r c743ef5928ba -r f966699dea19 idlehomescreen/hscontentcontrol/src/hscontentcontrolfactory.cpp --- 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 #include +#include // 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 views; + + // notify plugin about deactivation + aHsContentControlUi->DeActivate(); + + // get all views from HsContentControlUi + aHsContentControlUi->Views( views ); + + for ( TInt i=0; i