idlefw/plugins/pslnactiveidleplugin/src/pslnactiveidlepluginengine.cpp
changeset 0 79c6a41cd166
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/idlefw/plugins/pslnactiveidleplugin/src/pslnactiveidlepluginengine.cpp	Thu Dec 17 08:54:17 2009 +0200
@@ -0,0 +1,724 @@
+/*
+* Copyright (c) 2005-2007 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:  Container for the Active Idle plugin.
+*
+*/
+
+
+// From this plugin.
+#include <aisystemuids.hrh>
+
+#include "pslnactiveidlepluginengine.h"
+#include "pslnactiveidleplugincontainer.h"
+#include "pslnactiveidleplugin.h"
+#include "activeidle2domainpskeys.h"
+#include "activeidle2internalpskeys.h"
+
+// from plugin side
+#include <extrstandbyscrconst.h> // for KExtrStandbyScrFullScreenMode
+
+// From PSLN framework.
+#include <pslnfwiconhelper.h>
+#include <psln.rsg>
+
+// General services.
+#include <stringloader.h>
+#include <aknglobalnote.h>
+#include <e32property.h>
+
+// Application specific skins.
+#include <pslnfwappthemehandler.h>
+
+// XUIKON.
+#include <xnodt.h>
+
+// ECOM.
+#include <ecom/ecom.h>
+#include <ecom/implementationinformation.h>
+
+#include <centralrepository.h>
+#include <activeidle2domaincrkeys.h>
+
+#include <AknSgcc.h>
+
+// Granularity of plugin array.
+const TInt KPslnPluginArrayGranularity = 4;
+
+// ActiveIdle1 plugin ECOM interface uid
+const TInt KAI1PluginInterfaceUid = 0x101F8700;
+const TInt KAIThemeStatusPaneHidden = 0x00000001;
+
+// AI1 cenrep
+const TInt KCRUidActiveIdle =  0x10207467;
+const TInt KCRPluginCountKey = 0x00000002;
+const TInt KCRFirstPluginKey = 0x00000003;
+
+const TInt KPSLNOneSecondInMicroSeconds = 1000*1000;
+
+// ========== LOCAL FUNCTIONS =================================================
+
+template<class Array>
+void CleanupResetAndDestroy(TAny* aObj)
+{
+    if(aObj)
+    {
+        static_cast<Array*>(aObj)->ResetAndDestroy();
+    }
+}
+
+template<class Array>
+void CleanupResetAndDestroyPushL(Array& aPointerArray)
+{
+    CleanupStack::PushL(TCleanupItem(&CleanupResetAndDestroy<Array>, &aPointerArray));
+}
+
+// ========== MEMBER FUNCTIONS ================================================
+
+// ---------------------------------------------------------------------------
+// CPslnActiveIdlePluginEngine::ConstructL()
+//
+// Symbian OS two phased constructor
+// ---------------------------------------------------------------------------
+//
+void CPslnActiveIdlePluginEngine::ConstructL(const TRect& /*aRect*/)
+{
+#ifdef _MY_DEBUG
+    RDebug::Print(_L("XAI: CPslnActiveIdlePluginEngine::ConstructL"));
+#endif
+
+    // Create application theme handler and list for application themes.
+    iMySkinList = new (ELeave)
+        CArrayPtrFlat<CXnODT>(KPslnPluginArrayGranularity);
+    iPslnFWThemeHandler = CPslnFWAppThemeHandler::NewL(
+        *this,
+        *iMySkinList);
+
+    CheckCurrentUIControllerL();
+    CheckCurrentAi1PluginL();
+    iRestartTimer = CPeriodic::NewL(EPriorityNormal);
+    iUiRefreshTimer = CPeriodic::NewL(EPriorityNormal);
+}
+
+// ---------------------------------------------------------------------------
+// CPslnActiveIdlePluginEngine::CPslnActiveIdlePluginEngine
+//
+// Constructor
+// ---------------------------------------------------------------------------
+//
+CPslnActiveIdlePluginEngine::CPslnActiveIdlePluginEngine(
+    CPslnActiveIdlePlugin* aPlugin)
+  :
+    iFirstUpdateRound(ETrue),
+    iFirstUpdateRoundInjected(EFalse),
+    iCurrentUIController(EAiUICUnknown),
+    iPlugin(aPlugin)
+{
+}
+
+// ---------------------------------------------------------------------------
+// CPslnActiveIdlePluginEngine::~CPslnActiveIdlePluginEngine()
+//
+// Destructor
+// ---------------------------------------------------------------------------
+//
+CPslnActiveIdlePluginEngine::~CPslnActiveIdlePluginEngine()
+{
+    if (iRestartTimer)
+    {
+        iRestartTimer->Cancel();
+    }
+    delete iRestartTimer;
+    if (iUiRefreshTimer)
+    {
+        iUiRefreshTimer->Cancel();
+    }
+    delete iUiRefreshTimer;
+
+    if (iMySkinList)
+    {
+        iMySkinList->ResetAndDestroy();
+    }
+    delete iMySkinList;
+    delete iPslnFWThemeHandler;
+}
+
+// -----------------------------------------------------------------------------
+// CPslnActiveIdlePluginEngine::ActivateThemeL
+// -----------------------------------------------------------------------------
+//
+void CPslnActiveIdlePluginEngine::ActivateThemeL()
+{
+    TInt skinIndex = 0;
+    if( iPlugin->Container() )
+        {
+        skinIndex = iPlugin->Container()->iListBox->CurrentItemIndex();
+        }
+    else
+        {
+        // No selection possible yet
+        return;
+        }
+
+    if (skinIndex >= 0 && skinIndex < iMySkinList->Count() &&
+        !iRestartTimer->IsActive())
+    {
+        if (skinIndex >= iHSStartIndex &&
+            skinIndex < iHSEndIndex)
+        {
+            CXnODT* selectedSkinODT = iMySkinList->At(skinIndex);
+            UpdateStatusPaneVisibilityCenrepL(
+                selectedSkinODT->Flags() & KAIThemeStatusPaneHidden);
+
+            if (iCurrentAi1Plugin != selectedSkinODT->ThemeUid())
+            {
+                UpdateAi1PluginLoadCenrepL(selectedSkinODT->ThemeUid());
+                CheckCurrentAi1PluginL();
+            }
+            if (iCurrentUIController == EAiUICXML)
+            {
+                UpdateUIControllersInCenrepL(EAiUICNative);
+                CheckCurrentUIControllerL();
+
+                iRestartTimer->Cancel();
+                iRestartRetryCount = 0;
+                iRestartTimer->Start(
+                    KPSLNOneSecondInMicroSeconds,
+                    KPSLNOneSecondInMicroSeconds,
+                    TCallBack(RestartTimerCallback, this));
+            }
+            else
+            {
+            if( IsAiRunning() )
+                {
+                // Recycle this method to bring to foreground
+                RestartTimerCallback( this );
+                }
+            }
+            ManualGetSkinsRestartL();
+        }
+        else
+        {
+            if (iCurrentUIController == EAiUICNative)
+            {
+                UpdateStatusPaneVisibilityCenrepL(EFalse); // Always visible status pane
+                UpdateUIControllersInCenrepL(EAiUICXML);
+                CheckCurrentUIControllerL();
+                }
+
+            RProperty::Set( KPSUidAiInformation, KActiveIdleRestartAI2, KActiveIdleRestartCode );
+            iRestartTimer->Cancel();
+            iRestartRetryCount = 0;
+            iRestartTimer->Start(
+                KPSLNOneSecondInMicroSeconds,
+                KPSLNOneSecondInMicroSeconds,
+                TCallBack(RestartTimerCallback, this));
+            CXnODT* selectedSkinODT = iMySkinList->At(skinIndex);
+            TXnServiceCompletedMessage ret;
+
+            ret = iPslnFWThemeHandler->SetApplicationSkinL(
+                *selectedSkinODT );
+
+            if (ret == EXnSetActiveThemeFailed)
+            {
+                // Show error note.
+                HBufC* errorBuf = StringLoader::LoadLC(
+                    R_PSLN_QTN_SKINS_ERROR_CORRUPTED);
+                // Display global note.
+                CAknGlobalNote* errorNote = CAknGlobalNote::NewLC();
+                errorNote->ShowNoteL(EAknGlobalErrorNote, *errorBuf);
+                CleanupStack::PopAndDestroy(2, errorBuf); // errorNote also
+            }
+            else
+            {
+                iRestartTimer->Cancel();
+                iRestartRetryCount = 0;
+                iRestartTimer->Start(
+                    KPSLNOneSecondInMicroSeconds,
+                    KPSLNOneSecondInMicroSeconds,
+                    TCallBack(RestartTimerCallback, this));
+            }
+        }
+    }
+}
+
+// -----------------------------------------------------------------------------
+// CPslnActiveIdlePluginEngine::HandleMessage
+// -----------------------------------------------------------------------------
+//
+void CPslnActiveIdlePluginEngine::HandleMessage(
+    TXnServiceCompletedMessage aMessage)
+{
+    switch (aMessage)
+    {
+    case EXnGetListHeadersEmpty:
+        // Just destroy everything and use default items only.
+    case EXnGetListHeadersFailed: // fallthrough
+        if (iMySkinList)
+        {
+            iMySkinList->ResetAndDestroy();
+        }
+        break;
+    case EXnServiceRequestCanceled: // fallthrough
+    case EXnServiceRequestError: // fallthrough
+        {
+            TRAP_IGNORE(ManualGetSkinsRestartL();)
+        }
+        break;
+    default:
+        break;
+    }
+}
+
+// -----------------------------------------------------------------------------
+// CPslnActiveIdlePluginEngine::HandleMessage
+// -----------------------------------------------------------------------------
+//
+void CPslnActiveIdlePluginEngine::HandleMessage(
+    TXnServiceCompletedMessage aMessage,
+    CArrayPtrFlat<CXnODT>& /*aAppThemeList*/)
+{
+    switch (aMessage)
+    {
+    case EXnGetListHeadersRestart:
+    case EXnGetListHeadersUpdate: // fallthrough
+        {
+            TRAP_IGNORE(AddNewThemeL(aMessage));
+            break;
+        }
+    default:
+        {
+            break;
+        }
+    }
+}
+
+// ---------------------------------------------------------------------------
+// Adds new theme to the container / listbox.
+// ---------------------------------------------------------------------------
+//
+void CPslnActiveIdlePluginEngine::AddThemesToContainerL()
+    {
+    TInt value  = 0;
+
+    GetExtStandbyScreenState(value);
+
+    /* value == 0  Only AI2 themes
+       value != 0
+         bit 31    AI2 themes
+         bit 30-0  External themes
+    */
+    value |= 0x80000000;                               // Force AI2 themes on
+    if ((value == 0) || ((value & 0x80000000) != 0))
+        {
+        if( iPlugin->Container() && iMySkinList )
+            {
+            // Remove themes. All.
+            iPlugin->Container()->RemoveThemes( 0 );
+            for ( TInt i = 0; i < iMySkinList->Count(); ++i )
+                {
+                if( i >= iHSStartIndex &&
+                    i < iHSEndIndex )
+                    {
+                    iPlugin->Container()->AddNewItemToListL( i,
+                                                             iMySkinList->At(i),
+                                                             EAiUICNative );
+                    }
+                else
+                    {
+                    iPlugin->Container()->AddNewItemToListL( i,
+                                                             iMySkinList->At(i),
+                                                             EAiUICXML );
+                    }
+                }
+            }
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// Adds new theme to the listbox.
+// ---------------------------------------------------------------------------
+//
+void CPslnActiveIdlePluginEngine::AddNewThemeL(
+    TXnServiceCompletedMessage aMessage)
+{
+    // No themes available - do not add anything.
+    if (!iMySkinList)
+    {
+        return;
+    }
+
+    // Theme activation causes restart of theme headers list.
+    if (aMessage == EXnGetListHeadersRestart)
+    {
+    iFirstUpdateRound = EFalse;
+    }
+
+    TInt value  = 0;
+
+    GetExtStandbyScreenState(value);
+
+    /* value == 0  Only AI2 themes
+       value != 0
+         bit 31    AI2 themes
+         bit 30-0  External themes
+    */
+    value |= 0x80000000;                               // Force AI2 themes on
+
+    if ((value & 0x7FFFFFFF) > 0)
+        {
+    if ((iFirstUpdateRound && !iFirstUpdateRoundInjected) ||
+        aMessage == EXnGetListHeadersRestart)
+    {
+        iFirstUpdateRoundInjected = ETrue;
+        AddHomeScreenThemesL();
+    }
+        }
+
+    UiTimerRestart();
+}
+
+//
+// Get external Standby Screen state from Cenrep
+//
+TInt CPslnActiveIdlePluginEngine::GetExtStandbyScreenState(TInt& aValue )
+    {
+    TInt ret = 0;
+    TUid uid    = { KCRUidActiveIdleLV }; // {0x10275102}; //
+
+    //TRAP_IGNORE: leaving function called in non-leaving function
+    TRAP_IGNORE
+        (
+        CRepository* cenRep = CRepository::NewLC( uid );
+
+        ret = cenRep->Get(KAIExternalStatusScreen, aValue );
+
+        CleanupStack::PopAndDestroy( cenRep );
+        )
+
+    return ret;
+    }
+
+// ---------------------------------------------------------------------------
+// Add EXT HS themes to listing
+// ---------------------------------------------------------------------------
+//
+void CPslnActiveIdlePluginEngine::AddHomeScreenThemesL()
+{
+    iHSStartIndex = iHSEndIndex = iMySkinList->Count();
+    // Resolve AI1 plugins in ECOM
+    RImplInfoPtrArray eComPlugins;
+    CleanupResetAndDestroyPushL(eComPlugins);
+
+    REComSession::ListImplementationsL(TUid::Uid(KAI1PluginInterfaceUid), eComPlugins);
+    for (TInt i = 0; i < eComPlugins.Count(); ++i)
+    {
+        CXnODT* skinODT = CXnODT::NewL();
+        skinODT->SetThemeUid(eComPlugins[i]->ImplementationUid().iUid);
+        if (eComPlugins[i]->OpaqueData() == KExtrStandbyScrFullScreenMode)
+        {
+            skinODT->SetFlags(KAIThemeStatusPaneHidden);
+        }
+        else
+        {
+            skinODT->SetFlags(0);
+        }
+        CleanupStack::PushL(skinODT);
+        iMySkinList->AppendL(skinODT);
+        CleanupStack::Pop(skinODT);
+
+        HBufC* item = HBufC::NewLC(KPslnItemMaxTextLength);
+        TPtr itemPtr = item->Des();
+        if (eComPlugins[i]->DisplayName().Length())
+        {
+            itemPtr = eComPlugins[i]->DisplayName();
+        }
+        else
+        {
+            itemPtr = _L("OperatorHomeScreen1");
+        }
+        skinODT->SetThemeFullNameL( itemPtr );
+        if (iCurrentAi1Plugin == eComPlugins[i]->ImplementationUid().iUid &&
+            iCurrentUIController == EAiUICNative)
+        {
+            itemPtr.Insert(0, KPslnFWActiveListItemFormat);
+            TInt flags = skinODT->Flags();
+            skinODT->SetFlags(flags | EXnThemeStatusActive );
+        }
+        else
+        {
+            itemPtr.Insert(0, KPslnFWNonActiveListItemFormat);
+        }
+        CleanupStack::PopAndDestroy(item);
+        ++iHSEndIndex;
+    }
+    CleanupStack::PopAndDestroy();
+}
+
+// ---------------------------------------------------------------------------
+// Check active AI2 UI Controller in cenrep keys
+// ---------------------------------------------------------------------------
+//
+void CPslnActiveIdlePluginEngine::CheckCurrentUIControllerL()
+{
+    CRepository* cenRep = CRepository::NewL(TUid::Uid(KCRUidActiveIdleLV)); // KCRUidActiveIdleLV AI2 Cenrep!
+    TInt value = 0;
+    if (cenRep->Get(KAiMainUIController, value) == KErrNone)
+    {
+        if ((value == AI_UID_ECOM_IMPLEMENTATION_UICONTROLLER_NATIVE)
+            || (value == AI3_UID_ECOM_IMPLEMENTATION_UICONTROLLER_NATIVE))
+        {
+            iCurrentUIController = EAiUICNative;
+        }
+        else if ((value == AI_UID_ECOM_IMPLEMENTATION_UICONTROLLER_XML)
+            || (value == AI3_UID_ECOM_IMPLEMENTATION_UICONTROLLER_XML))
+        {
+            iCurrentUIController = EAiUICXML;
+        }
+    }
+    delete cenRep;
+}
+
+// ---------------------------------------------------------------------------
+// Update active AI2 UI Controller in cenrep keys
+// ---------------------------------------------------------------------------
+//
+void CPslnActiveIdlePluginEngine::UpdateUIControllersInCenrepL(TInt aControllerId)
+{
+    if (iCurrentUIController != aControllerId)
+    {
+        TUid uid = { KCRUidActiveIdleLV }; // KCRUidActiveIdleLV AI2 Cenrep!
+        CRepository* cenRep = CRepository::NewL(uid);
+        if (aControllerId == EAiUICNative)
+        {
+            cenRep->Delete(KAiFirstUIController);
+            cenRep->Delete(KAiFirstUIController + 1);
+            cenRep->Set(KAiMainUIController, AI_UID_ECOM_IMPLEMENTATION_UICONTROLLER_NATIVE);
+        }
+        else if (aControllerId ==  EAiUICXML)
+        {
+            cenRep->Create(KAiFirstUIController, AI_UID_ECOM_IMPLEMENTATION_UICONTROLLER_NATIVE);
+            cenRep->Set(KAiFirstUIController, AI_UID_ECOM_IMPLEMENTATION_UICONTROLLER_NATIVE);
+            cenRep->Delete(KAiFirstUIController + 1);
+            cenRep->Set(KAiMainUIController, AI_UID_ECOM_IMPLEMENTATION_UICONTROLLER_XML);
+        }
+        delete cenRep;
+    }
+}
+
+// ---------------------------------------------------------------------------
+// Update status pane visibility for status pane cenrep key
+// ---------------------------------------------------------------------------
+//
+void CPslnActiveIdlePluginEngine::UpdateStatusPaneVisibilityCenrepL(
+    TBool aPaneHidden)
+{
+    TInt value = EAiStatusPaneLayoutIdleNormal;
+    if (aPaneHidden)
+    {
+        value = EAiStatusPaneLayoutIdleHidden;
+    }
+    TUid uid = { KCRUidActiveIdleLV }; // KCRUidActiveIdleLV AI2 Cenrep!
+    CRepository* cenRep = CRepository::NewL(uid);
+    cenRep->Set(KAiStatusPaneLayout, value);
+    delete cenRep;
+}
+
+// ---------------------------------------------------------------------------
+// Update active AI1 plugin in cenrep
+// ---------------------------------------------------------------------------
+//
+void CPslnActiveIdlePluginEngine::UpdateAi1PluginLoadCenrepL(TInt aNewUid)
+{
+    TUid uid = { KCRUidActiveIdle }; // KCRUidActiveIdle AI1 Cenrep!
+    CRepository* cenRep = CRepository::NewL(uid);
+    TInt currentCount = 0;
+    cenRep->Get(KCRPluginCountKey, currentCount);
+
+    // Delete old keys if any
+    for (TInt i = 0; i < currentCount; ++i)
+    {
+        cenRep->Delete(KCRFirstPluginKey+i);
+    }
+
+    cenRep->Delete(KCRPluginCountKey);
+    cenRep->Create(KCRPluginCountKey, 1);
+    // Set only 1 new key, the selected one
+    cenRep->Create(KCRFirstPluginKey, aNewUid);
+
+    delete cenRep;
+}
+
+// ---------------------------------------------------------------------------
+// Check the current AI1 plugin (ref. External opretor homescreen feature)
+// ---------------------------------------------------------------------------
+//
+void CPslnActiveIdlePluginEngine::CheckCurrentAi1PluginL()
+{
+    TUid uid = { KCRUidActiveIdle }; // KCRUidActiveIdle AI1 Cenrep!
+    TInt value = 0;
+    TInt currentCount = 0;
+
+    CRepository* cenRep = CRepository::NewL(uid);
+    cenRep->Get(KCRPluginCountKey, currentCount);
+
+    if (currentCount) // count must be set
+    {
+        cenRep->Get(KCRFirstPluginKey, value);
+    }
+    delete cenRep;
+
+    if (value != 0)
+    {
+        iCurrentAi1Plugin = value;
+    }
+}
+
+// ---------------------------------------------------------------------------
+// Manually start updating theme/skin listing
+// ---------------------------------------------------------------------------
+//
+void CPslnActiveIdlePluginEngine::ManualGetSkinsRestartL(TBool aForceStart)
+{
+    if( !aForceStart && iMySkinList->Count() > 0 &&
+        iUiRefreshTimer->IsActive() )
+        {
+        return;
+        }
+        
+    // Restart get skins manually!
+    if( iPlugin->Container() )
+        {
+        iPlugin->Container()->RemoveThemes(0);
+        }
+    iMySkinList->ResetAndDestroy();
+    iFirstUpdateRound = ETrue;
+    iFirstUpdateRoundInjected = EFalse;
+    iPslnFWThemeHandler->CancelGetApplicationSkins();
+    iAddIndex = 0;
+    iPslnFWThemeHandler->GetApplicationSkinsL(KUidActiveIdle);
+}
+
+// ---------------------------------------------------------------------------
+// Restart AI2 process
+// ---------------------------------------------------------------------------
+//
+TInt CPslnActiveIdlePluginEngine::RestartAifw()
+{
+    if (!IsAiRunning())
+    {
+        _LIT(KAiExeName, "z:\\sys\\bin\\ailaunch.exe");
+        RProcess process;
+        TInt ret = process.Create(KAiExeName, KNullDesC);
+        process.Resume();
+        process.Close();
+        return ret;
+    }
+    return KErrNone;
+}
+
+// ---------------------------------------------------------------------------
+// Checks if AI2 process is running
+// ---------------------------------------------------------------------------
+//
+TBool CPslnActiveIdlePluginEngine::IsAiRunning()
+{
+    TApaTaskList taskList(CCoeEnv::Static()->WsSession());
+    TApaTask startTask = taskList.FindApp(TUid::Uid(0x100058f4));
+
+    if (!startTask.Exists()) // if first boot queries are done continue bringing ai2 to foreground.
+    {
+        TApaTask aiTask = taskList.FindApp(TUid::Uid(AI_UID3_AIFW_EXE));
+        if (aiTask.Exists())  // App open
+        {
+            return ETrue;
+        }
+    }
+    return EFalse;
+}
+
+// ---------------------------------------------------------------------------
+// start ui refresh timer
+// ---------------------------------------------------------------------------
+//
+void CPslnActiveIdlePluginEngine::UiTimerRestart()
+    {
+    iUiRefreshTimer->Cancel();
+    iUiRefreshTimer->Start(
+        KPSLNOneSecondInMicroSeconds/4, // quarter second delay
+        KPSLNOneSecondInMicroSeconds/4,
+        TCallBack(UiRefreshTimerCallback, this));
+    }
+    
+// ---------------------------------------------------------------------------
+// Call back for restart timer
+// ---------------------------------------------------------------------------
+//
+TInt CPslnActiveIdlePluginEngine::RestartTimerCallback(TAny* aSelf)
+{
+    CPslnActiveIdlePluginEngine* self =
+        static_cast<CPslnActiveIdlePluginEngine*>(aSelf);
+
+    if (self)
+    {
+        ++(self->iRestartRetryCount);
+        if ( self->RestartAifw() == KErrNone)
+        {
+            self->iRestartTimer->Cancel();
+            TApaTaskList taskList(CCoeEnv::Static()->WsSession());
+            TApaTask startTask = taskList.FindApp(TUid::Uid(0x100058f4));
+
+            if (!startTask.Exists()) // if first boot queries are done continue bringing ai2 to foreground.
+            {
+                TApaTask aiTask = taskList.FindApp(TUid::Uid(AI_UID3_AIFW_EXE));
+                if (aiTask.Exists())  // App open
+                {
+                    //aiTask.BringToForeground();
+                    CAknSgcClient::MoveApp(aiTask.WgId(), ESgcMoveAppToForeground);
+                }
+            }
+            CAknEnv::RunAppShutter();
+            return 0;
+        }
+        if (self->iRestartRetryCount > 3)
+        {
+            self->iRestartTimer->Cancel();
+            TRAP_IGNORE(self->ManualGetSkinsRestartL());
+            return 0;
+        }
+    }
+    return 1;
+}
+
+// ---------------------------------------------------------------------------
+// Call back for UI refresh timer timer
+// ---------------------------------------------------------------------------
+//
+TInt CPslnActiveIdlePluginEngine::UiRefreshTimerCallback(TAny* aSelf)
+{
+    CPslnActiveIdlePluginEngine* self =
+        static_cast<CPslnActiveIdlePluginEngine*>(aSelf);
+
+    if (self)
+    {
+        self->iUiRefreshTimer->Cancel();
+        TRAP_IGNORE(self->AddThemesToContainerL());
+        if( self->iPlugin->Container() )
+            {
+            self->iPlugin->Container()->RefreshList();
+            }
+    }
+    return 0;
+}
+
+// End of File.