--- a/idlefw/plugins/shortcutplugin/src/caiscutengine.cpp Tue Feb 02 00:23:10 2010 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,1787 +0,0 @@
-/*
-* Copyright (c) 2005-2006 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: Shortcut plug-in engine class
-*
-*/
-
-
-#include <coemain.h> // For CCoeEnv
-#include <centralrepository.h> // For CRepository
-#include <w32std.h> // For RWsSession
-#include <apgtask.h> // For TApaTaskList
-#include <viewcli.h> // For CVwsSessionWrapper
-#include <vwsdef.h> // For TVwsViewId
-#include <e32property.h> // For RProperty
-#include <utf.h> // For CnvUtfConverter
-#include <bautils.h>
-#include <featmgr.h>
-#include <activefavouritesdbnotifier.h> // For CActiveFavouritesDbNotifier
-#include <pathinfo.h>
-#include <data_caging_path_literals.hrh>
-#include <AknSgcc.h> // for fast swap
-#ifdef SYMBIAN_ENABLE_SPLIT_HEADERS
-#include <viewclipartner.h>
-#endif
-
-
-#include <ctsydomainpskeys.h>
-#include <UikonInternalPSKeys.h>
-#include <menu2internalcrkeys.h>
-#include <activeidle2internalpskeys.h>
-#include <activeidle2domaincrkeys.h>
-#include <activeidle2domainpskeys.h>
-#include <aipspropertyobserver.h>
-
-#include <aiscuttexts.rsg>
-#include "caiscutengine.h"
-#include "aiscutpluginprivatecrkeys.h"
-#include "aiscutcontentmodel.h"
-#include "caiscutplugin.h"
-#include "caiscutshortcut.h"
-#include "caiscutshortcutinfo.h"
-#include "aidefaultshortcut.h"
-#include "aiscutappuidparser.h"
-#include "aiscutrepositorywatcher.h"
-#include "aiscuttargetshutter.h"
-#include "aiscutdefs.h"
-#include "aiscutfactory.h"
-
-#include <keylockpolicyapi.h>
-#include "debug.h"
-/**
- * Timer delay for access check retry. Two seconds.
- */
-const TInt KScutAccessCheckRetryDelay = 2000000;
-const TUid KVoiceCallUidViewId = { 0x10282D81 };
-const TUid KVideoCallUid = { 0x101F8681 };
-
-_LIT(KScutTextsResourceFileName, "aiscuttexts.rsc");
-_LIT8(KScutDirectOpen, "?open");
-
-// ======== LOCAL FUNCTIONS ========
-
-LOCAL_C TInt CompareKey(const TUint32& aLeft, const TUint32& aRight)
-{
- TUint32 left = aLeft & (KScutBitMaskThemeDefault & KScutBitMaskLocked);
- TUint32 right = aRight & (KScutBitMaskThemeDefault & KScutBitMaskLocked);
-
- if (left < right)
- {
- return -1;
- }
- else if (left > right)
- {
- return 1;
- }
-
- return 0;
-}
-
-static TInt IntFromDesc( const TDesC &aParam )
- {
- TInt err = KErrArgument;
- if (aParam.Length() > 0)
- {
- _LIT(KHexPrefix, "0x");
- const TInt prefixLen = 2;
-
- TRadix radix(EDecimal);
- TPtrC ptr(aParam);
-
- if (aParam.Left(prefixLen).CompareC(KHexPrefix) == 0)
- {
- // Strip the '0x' prefix.
- ptr.Set(aParam.Right(aParam.Length() - prefixLen));
-
- radix = EHex;
- }
-
- TLex lexer(ptr);
- TUint32 id;
-
- err = lexer.Val(id, radix);
- if ( err == KErrNone )
- {
- return id;
- }
- else
- {
- return err;
- }
- }
- return err;
- }
-// ---------------------------------------------------------------------------
-// Timer callback.
-// ---------------------------------------------------------------------------
-//
-TInt DelayedCheckCallBack(TAny* aEngine)
-{
- if (aEngine)
- {
- static_cast<CAiScutEngine*>(aEngine)->RetryAccessCheck();
- }
-
- return KErrNone;
-}
-
-// ======== MEMBER FUNCTIONS ========
-
-// ---------------------------------------------------------------------------
-//
-// ---------------------------------------------------------------------------
-//
-CAiScutEngine::CAiScutEngine(CAiScutPlugin& aPlugin)
- :
- iPlugin(aPlugin),
- iResourceLoaderTexts(*CCoeEnv::Static()),
- iResourceLoaderSendUi(*CCoeEnv::Static())
-{
-}
-
-// ---------------------------------------------------------------------------
-//
-// ---------------------------------------------------------------------------
-//
-void CAiScutEngine::ConstructL()
-{
- FeatureManager::InitializeLibL();
-
- User::LeaveIfError(iApaSession.Connect());
- User::LeaveIfError(iBookmarkSess.Connect());
- User::LeaveIfError(iBookmarkDb.Open(iBookmarkSess, KBrowserBookmarks));
-
- iVwsSession = CVwsSessionWrapper::NewL();
- iRepository = CRepository::NewL(KCRUidShortcutItems);
-
- iHiddenAppsRepository = CRepository::NewL(KCRUidMenu);
-
- // Create message server session because it may be needed during shortcut
- // creation for checking mailbox access.
- iMsvSession = CMsvSession::OpenAsObserverL(*this);
-
- iEnv = CCoeEnv::Static();
-
- TParsePtrC driveParse(PathInfo::RomRootPath());
- TFileName resourceName(driveParse.Drive());
- TParse parse;
- parse.Set(KScutTextsResourceFileName, &KDC_RESOURCE_FILES_DIR, NULL);
- resourceName.Append(parse.FullName());
- iResourceLoaderTexts.OpenL(resourceName);
-
- TFileName resourceName2(driveParse.Drive());
- TParse parse2;
- parse2.Set(KSendNormResource, &KDC_RESOURCE_FILES_DIR, NULL);
- resourceName2.Append(parse2.FullName());
- iResourceLoaderSendUi.OpenL(resourceName2);
-
- LoadAppTitleListL();
-
- // Engine should still remain alive even though shortcut construction failed
- // because LaunchByValue must still be possible.
- TRAP_IGNORE(CreateShortcutsL());
-
- // Close message server session for now. It's opened again in Resume if needed.
- delete iMsvSession;
- iMsvSession = NULL;
-
- iKeyEventObserver = AiUtility::CreatePSPropertyObserverL(
- TCallBack(HandlePSCommand, this),
- KUidSystemCategory, KPSUidShortcutCmd);
-
- iCallStateObserver = AiUtility::CreatePSPropertyObserverL(
- TCallBack(CallStateChangeCallback, this),
- KPSUidCtsyCallInformation, KCTsyCallState);
-
- iKeylockApi = CKeyLockPolicyApi::NewL( EPolicyActivateKeyguard );
- if ( !iKeylockApi->HasConfiguration() )
- {
- delete iKeylockApi;
- iKeylockApi = NULL;
- }
- CRepository* repository = CRepository::NewLC(TUid::Uid(KCRUidActiveIdleLV));
-
- repository->Get(KAIFirstKeyLockKey, iFirstLockKey);
- repository->Get(KAISecondKeyLockKey, iSecondLockKey);
- repository->Get(KAIKeyLockTimeout, iDelayTimerDelay);
- CleanupStack::PopAndDestroy(repository);
- // convert micro to milliseconds
- const TInt KUsInMs = 1000;
- iDelayTimerDelay = KUsInMs * iDelayTimerDelay;
- iDelayTimer = CPeriodic::NewL (CActive::EPriorityStandard );
-}
-
-TInt CAiScutEngine::DelayTimerCallBack (TAny *aSelf )
- {
- CAiScutEngine* self = static_cast<CAiScutEngine*>(aSelf );
- TInt err = KErrNone;
- if (self )
- {
- self->iDelayTimer->Cancel();
- TRAP(err,
- self->HandleLaunchByIndexL( *(self->iDelayedLaunchCmd) );
- );
-
- }
- return err;
- }
-
-void CAiScutEngine::DelayedLaunchByIndexL( const TDesC &aParam )
- {
- delete iDelayedLaunchCmd;
- iDelayedLaunchCmd = NULL;
- iDelayedLaunchCmd = aParam.AllocL();
- iDelayTimer->Cancel();
- iDelayTimer->Start( iDelayTimerDelay,
- iDelayTimerDelay,
- TCallBack( DelayTimerCallBack, this ));
-}
-
-// ---------------------------------------------------------------------------
-//
-// ---------------------------------------------------------------------------
-//
-CAiScutEngine* CAiScutEngine::NewL(CAiScutPlugin& aPlugin)
-{
- CAiScutEngine* self = new (ELeave) CAiScutEngine(aPlugin);
- CleanupStack::PushL(self);
- self->ConstructL();
- CleanupStack::Pop(self);
- return self;
-}
-
-// ---------------------------------------------------------------------------
-//
-// ---------------------------------------------------------------------------
-//
-CAiScutEngine::~CAiScutEngine()
-{
-#ifdef __WEB_WIDGETS
- if( iWidgetRegistryConnected )
- {
- iWidgetRegistry.Disconnect();
- }
-#endif
- delete iKeylockApi;
- delete iSettingsNotifier;
- delete iRepository;
-
- delete iHiddenAppsNotifier;
- delete iHiddenAppsRepository;
-
- iHiddenApps.Close();
-
- delete iAppNotifier;
- delete iTimer;
- delete iMsvSession;
- delete iVwsSession;
- delete iScutShutter;
-
- Release(iKeyEventObserver);
- Release(iCallStateObserver);
-
- iShortcuts.ResetAndDestroy();
- iThemeShortcuts.ResetAndDestroy();
- iDefaultUsed.Close();
-
- delete iBookmarkDbObserver;
- iBookmarkDb.Close();
- iBookmarkSess.Close();
-
- iApaSession.Close();
-
- while(iAppTitleList.Count())
- {
- delete iAppTitleList[0].iLongTitle;
- delete iAppTitleList[0].iShortTitle;
- delete iAppTitleList[0].iSkeyTitle;
- delete iAppTitleList[0].iMskTitle;
- iAppTitleList.Remove(0);
- }
- iAppTitleList.Close();
-
- iResourceLoaderTexts.Close();
- iResourceLoaderSendUi.Close();
-
- delete iDelayTimer;
- delete iDelayedLaunchCmd;
- iIcons.Close();
- FeatureManager::UnInitializeLib();
-}
-
-// ---------------------------------------------------------------------------
-// From class MMsvSessionObserver.
-// Handles an event from the message server.
-// ---------------------------------------------------------------------------
-//
-void CAiScutEngine::HandleSessionEventL(
- TMsvSessionEvent aEvent, TAny* /*aArg1*/, TAny* /*aArg2*/, TAny* /*aArg3*/)
-{
- switch (aEvent)
- {
- case EMsvEntriesCreated:
- case EMsvEntriesDeleted:
- case EMsvEntriesChanged:
- if (iShortcuts.Count() > 0)
- {
- MergeShortcuts(EScutMailbox, ETrue);
- CheckAccessAndPublish(EScutCheckMailbox, EFalse);
- }
- break;
-
- default:
- break;
- }
-}
-
-// ---------------------------------------------------------------------------
-// From class MApaAppListServObserver.
-// Handles a change in the application list.
-// ---------------------------------------------------------------------------
-//
-void CAiScutEngine::HandleAppListEvent(TInt /*aEvent*/)
-{
- TRAP_IGNORE( CheckForThemeDefaultReinstalledL() );
- MergeShortcuts(EScutAnyType, ETrue);
- CheckAccessAndPublish(EScutCheckApp, ETrue);
-}
-
-// ---------------------------------------------------------------------------
-// Resumes the engine.
-// ---------------------------------------------------------------------------
-//
-void CAiScutEngine::ResumeL(TBool aPublishAll, TAiTransitionReason /*aReason*/)
-{
- // Merge shortcuts and start notifiers only if we have publishable shortcuts.
- if (iShortcuts.Count() > 0)
- {
- if (!iSettingsNotifier)
- {
- iSettingsNotifier = CAiScutRepositoryWatcher::NewL(
- KCRUidShortcutItems,
- TCallBack(HandleShortcutsChanged, this),
- iRepository);
- }
-
- if (!iHiddenAppsNotifier)
- {
- iHiddenAppsNotifier = CAiScutRepositoryWatcher::NewL(
- KCRUidMenu,
- KMenuHideApplication,
- CCenRepNotifyHandler::EStringKey,
- TCallBack(HandleHiddenAppsChanged, this),
- iHiddenAppsRepository);
- }
- }
-#ifdef __WEB_WIDGETS
- if( !iWidgetRegistryConnected )
- {
- TInt cError = iWidgetRegistry.Connect();
- if( cError == KErrNone )
- {
- iWidgetRegistryConnected = ETrue;
- }
- }
-#endif
-
- GetHiddenAppsL();
-
- MergeShortcutsL(EScutAnyType, EFalse);
-
- // Call state check must be done always because RSK "Back"
- // must be published when theme is changed during phone call, too.
- HandleCallStateChange();
-
- CheckAccessAndPublish(EScutCheckAll, aPublishAll);
-
- if (iShortcuts.Count() > 0)
- {
- iSettingsNotifier->StartListeningL();
-
- iHiddenAppsNotifier->StartListeningL();
-
- if (!iAppNotifier)
- {
- iAppNotifier = CApaAppListNotifier::NewL(this, CActive::EPriorityStandard);
- }
- }
-}
-
-// ---------------------------------------------------------------------------
-// Suspends the engine.
-// ---------------------------------------------------------------------------
-//
-void CAiScutEngine::Suspend()
-{
- delete iMsvSession; // This is to stop receiving message server events.
- iMsvSession = NULL;
-
- delete iSettingsNotifier;
- iSettingsNotifier = NULL;
-
- delete iHiddenAppsNotifier;
- iHiddenAppsNotifier = NULL;
-
- delete iAppNotifier;
- iAppNotifier = NULL;
-
- delete iTimer;
- iTimer = NULL;
-
- delete iScutShutter;
- iScutShutter = NULL;
-
- if (iBookmarkDbObserver)
- {
- iBookmarkDbObserver->Cancel();
- }
- delete iBookmarkDbObserver;
- iBookmarkDbObserver = NULL;
-#ifdef __WEB_WIDGETS
- if( iWidgetRegistryConnected )
- {
- TInt cError = iWidgetRegistry.Disconnect();
- if( cError == KErrNone )
- {
- iWidgetRegistryConnected = EFalse;
- }
- }
-#endif
-}
-
-// ---------------------------------------------------------------------------
-//
-// ---------------------------------------------------------------------------
-//
-TInt CAiScutEngine::HandleShortcutsChanged(TAny* aPtr)
-{
- __PRINTS("XAI: CAiScutEngine::HandleShortcutsChanged");
- CAiScutEngine* self = static_cast<CAiScutEngine*>(aPtr);
-
- if (self)
- {
- self->MergeShortcuts(EScutAnyType, ETrue);
- self->CheckAccessAndPublish(EScutCheckAll, EFalse);
- }
-
- return KErrNone;
-}
-
-// ---------------------------------------------------------------------------
-//
-// ---------------------------------------------------------------------------
-//
-TInt CAiScutEngine::HandleHiddenAppsChanged(TAny* aPtr)
-{
- CAiScutEngine* self = static_cast<CAiScutEngine*>(aPtr);
-
- if (self)
- {
- TRAP_IGNORE(self->GetHiddenAppsL());
- self->MergeShortcuts(EScutAnyType, ETrue);
- self->CheckAccessAndPublish(EScutCheckAll, EFalse);
- }
-
- return KErrNone;
-}
-
-// ---------------------------------------------------------------------------
-//
-// ---------------------------------------------------------------------------
-//
-TBool CAiScutEngine::IsLockKey( TInt aScanCode, TScutLockKey aLockKey ) const
- {
- TBool returnValue = EFalse;
- if ( iKeylockApi )
- {
- TInt index = 0;
- TUint32 priKey = 0;
- TUint32 secKey = 0;
- TInt err = KErrNone;
- // Loop through all the combinations in order
- // to find wether this key is part of the locking
- // process or not (1st or 2nd key)
- while( !returnValue )
- {
- err = iKeylockApi->GetKeyCombination(index, priKey, secKey);
- if ( err == KErrNone )
- {
- switch( aLockKey )
- {
- case EScutFirstLockKey:
- returnValue = (priKey == aScanCode);
- break;
- case EScutSecondLockKey:
- returnValue = (secKey == aScanCode);
- break;
- default:
- returnValue = EFalse;
- break;
- }
- }
- else // no more combinations
- {
- break;
- }
- ++index;
- }
- return returnValue;
- }
- switch( aLockKey )
- {
- case EScutFirstLockKey:
- returnValue = iFirstLockKey == aScanCode;
- break;
- case EScutSecondLockKey:
- returnValue = iSecondLockKey == aScanCode;
- break;
- default:
- returnValue = EFalse;
- break;
- }
- return returnValue;
- }
-
-
-
-// ---------------------------------------------------------------------------
-//
-// ---------------------------------------------------------------------------
-//
-TBool CAiScutEngine::IsHidden(const TUid& aAppUid) const
-{
- if (iHiddenApps.Find(aAppUid) == KErrNotFound)
- {
- return EFalse;
- }
-
- __PRINT( __DBG_FORMAT( "XAI: CAiScutEngine::IsHidden (0x%x) ETrue"), aAppUid);
- return ETrue;
-}
-
-// ---------------------------------------------------------------------------
-// Handles an event sent by the AI framework.
-// ---------------------------------------------------------------------------
-//
-void CAiScutEngine::HandleAiEventL(TInt aEvent, const TDesC& aParam)
-{
- __PRINT( __DBG_FORMAT( "XAI: CAiScutEngine::HandleAiEventL( %d, '%S' ) alive = %d"), aEvent, &aParam, iPlugin.IsAlive());
-
- TUid appUid = KNullUid;
- iFirstLockKeyPressed = EFalse;
- iSoftkeyAppRunning = EFalse;
-
- if (aParam.Compare(KLeftSoftkey) == 0)
- {
- if ( IsLockKey( EStdKeyDevice0, EScutFirstLockKey) || IsLockKey( EStdKeyDevice0 , EScutSecondLockKey))
- {
- // Raise the first lock key pressed flag
- // only when this is raised, keylock skip causes scut launch
- iFirstLockKeyPressed = ETrue;
- appUid = SoftkeyUid(KLeftSoftkeyId);
- }
- }
-
- if (aParam.Compare(KRightSoftkey) == 0)
- {
- if ( IsLockKey( EStdKeyDevice1 , EScutFirstLockKey) || IsLockKey( EStdKeyDevice1 , EScutSecondLockKey))
- {
- // Raise the first lock key pressed flag
- // only when this is raised, keylock skip causes scut launch
- iFirstLockKeyPressed = ETrue;
- appUid = SoftkeyUid(KRightSoftkeyId);
- }
- }
-
- if (iFirstLockKeyPressed && appUid != KNullUid)
- {
- TApaTaskList taskList(iEnv->WsSession());
- TApaTask task(taskList.FindApp(appUid));
-
- if (task.Exists())
- {
- if (IsHiddenFromFSW(appUid))
- iSoftkeyAppRunning = EFalse;
- else
- iSoftkeyAppRunning = ETrue;
- }
- }
-
- if (IsDelayRequired(appUid))
- {
- DelayedLaunchByIndexL( aParam );
- return;
- }
-
- if( iActiveCall && aParam.Compare( KRightSoftkey ) == 0 )
- {
- ActivateTopMostApp();
- return;
- }
-
- switch( aEvent )
- {
- case EAiScutEventLaunchByIndex:
- HandleLaunchByIndexL(aParam);
- break;
-
- case EAiScutEventLaunchByValue:
- HandleLaunchByValueL(aParam);
- break;
-
- case EAiScutEventShowSettings:
- ShowSettingsL(aParam);
- break;
-
- case EAiScutEventShowSetting:
- ShowSettingL(aParam);
- break;
-
- case EAiScutEventLaunchFastswap:
- OpenFastSwap();
- break;
-
- case EAiScutEventLaunchByIndexAlternate:
- HandleLaunchByIndexAlternateL(aParam);
- break;
-
- default:
- break;
- }
-
-}
-
-// ---------------------------------------------------------------------------
-// Called by the timer. Retries the access check for shortcuts.
-// ---------------------------------------------------------------------------
-//
-void CAiScutEngine::RetryAccessCheck()
-{
- CheckAccessAndPublish(EScutCheckAll, iPublishAll);
-
- // One retry is enough.
- iTimer->Cancel();
- delete iTimer;
- iTimer = NULL;
-}
-
-// ---------------------------------------------------------------------------
-//
-// ---------------------------------------------------------------------------
-//
-TBool CAiScutEngine::IsNonNative(const TUid& aUid)
-{
- TBool ret = EFalse;
-
- const TUid KMidletAppType = { 0x10210E26 };
- TUid typeuid = KNullUid;
-
- if (KErrNone == iApaSession.GetAppType(typeuid, aUid))
- {
- if (typeuid == KMidletAppType)
- {
- ret = ETrue;
- }
- }
-
-#ifdef __WEB_WIDGETS
- if (IsWidget(aUid))
- {
- ret = ETrue;
- }
-#endif
-
- return ret;
-}
-
-#ifdef __WEB_WIDGETS
-TBool CAiScutEngine::IsWidget(const TUid& aUid)
-{
- if( iWidgetRegistryConnected )
- {
- return iWidgetRegistry.IsWidget(aUid);
- }
- else
- {
- return EFalse;
- }
-}
-#endif
-
-// ---------------------------------------------------------------------------
-// Creates the default shortcuts.
-// ---------------------------------------------------------------------------
-//
-void CAiScutEngine::CreateShortcutsL()
-{
- TInt scIndex = 0;
-
- iShortcuts.ResetAndDestroy();
-
- RArray<TUint32> keys;
- CleanupClosePushL(keys);
- // Find the keys that define theme-default shortcut settings.
- iRepository->FindL(KScutCenRepKeyThemeDefault, KScutCenRepKeyMask, keys);
-
-
- TLinearOrder<TUint32> order(CompareKey);
- keys.Sort(order);
-
- HBufC* buffer = HBufC::NewLC(NCentralRepositoryConstants::KMaxUnicodeStringLength);
- TPtr bufferPtr = buffer->Des();
-
- if (iSettingsNotifier)
- {
- iSettingsNotifier->StopListening();
- }
- if (iHiddenAppsNotifier)
- {
- iHiddenAppsNotifier->StopListening();
- }
-
- for (TInt i = 0; i < keys.Count(); ++i)
- {
- TUint32 key = keys[i];
- if (iRepository->Get(key, bufferPtr) == KErrNone)
- {
- // Strip off the default-setting-bit, it's not part of the shortcut id.
- key &= KScutBitMaskThemeDefault;
-
- // Parse the icon from the URL and fetch the icon to our icon array
- // The actual icon => shortcut matching and overriding is done in
- // CheckAccessAndPublishL() just before publishing
- iParser.Parse(bufferPtr);
- TAiScutIcon icon = iParser.Icon();
- if ( icon.iType != EScutIconNone )
- {
- AddOverrideIcon( icon );
- }
- // Keys over 0x20000000 means that they are just icon overrides
- if ( !(key & KScutFlagBitIconOverride ) )
- {
- key &= KScutMaskAdditionalSetting;
- // Ignore possible errors during shortcut construction
- // and simply try to move on to the next shortcut.
- CAiScutShortcut* shortcut = NULL;
- TRAPD(err, shortcut = AiScutFactory::CreateAiScutShortcutL(key, bufferPtr, *this));
- if (err == KErrNone)
- {
- // If shortcut is not accessible, replace it with platform default.
- TBool access = EFalse;
- if (shortcut)
- {
- // Append theme default to our array, incase of uninstall/reinstall/mem card removal
- // restoration is required.
- CAiScutShortcutInfo* shortcutInfo = NULL;
- TRAP_IGNORE(shortcutInfo = CAiScutShortcutInfo::NewL(key | KScutFlagBitThemeDefault,
- bufferPtr));
- if ( shortcutInfo )
- {
- iThemeShortcuts.Append(shortcutInfo);
- }
-
- TScutDefault usedDefault = EScutDefaultToPlatform;
-
- TRAP_IGNORE(access = shortcut->CheckAccessL(EScutCheckAll));
- if (!access)
- {
- HBufC* target = HBufC::NewLC(NCentralRepositoryConstants::KMaxUnicodeStringLength);
- TPtr targetPtr = target->Des();
- TUid dummy;
-
- // Get the default shortcut definition for index 'scIndex'.
- // uid is ignored.
- TAiDefaultShortcut::GetDefaultShortcut(key, dummy, targetPtr);
-
- delete shortcut;
- shortcut = NULL;
- TRAP(err, shortcut = AiScutFactory::CreateAiScutShortcutL(key, targetPtr, *this));
-
- if (err == KErrNone)
- {
- // Add the bit that indicates this is a default shortcut setting.
- key |= KScutFlagBitThemeDefault;
- iRepository->Set(key, targetPtr);
-
- // Try to locate a icon override from the default
- // definition
- iParser.Parse( targetPtr );
- TAiScutIcon tIcon = iParser.Icon();
- if ( tIcon.iType != EScutIconNone )
- {
- AddOverrideIcon( tIcon );
- }
- }
- CleanupStack::PopAndDestroy( target );
- }
- else
- {
- usedDefault = EScutDefaultToTheme;
- }
-
- scIndex++;
-
- if (shortcut) // This test ensures that the creation right above went well.
- {
- iDefaultUsed.Append(usedDefault);
- err = iShortcuts.Append(shortcut);
-
- if (err != KErrNone)
- {
- delete shortcut;
- shortcut = NULL;
- }
- }
- }
- }
- }
- }
- }
-
- if (iSettingsNotifier)
- {
- iSettingsNotifier->StartListeningL();
- }
- if (iHiddenAppsNotifier)
- {
- iHiddenAppsNotifier->StartListeningL();
- }
-
- CleanupStack::PopAndDestroy(buffer);
- CleanupStack::PopAndDestroy(&keys);
-}
-
-// ---------------------------------------------------------------------------
-// Check whether theme default sc was reinstalled.
-// ---------------------------------------------------------------------------
-//
-void CAiScutEngine::CheckForThemeDefaultReinstalledL()
-{
- HBufC* buffer = HBufC::NewLC(NCentralRepositoryConstants::KMaxUnicodeStringLength);
- TPtr bufferPtr = buffer->Des();
-
- if (iSettingsNotifier)
- {
- iSettingsNotifier->StopListening();
- }
- if (iHiddenAppsNotifier)
- {
- iHiddenAppsNotifier->StopListening();
- }
-
- TInt count = iThemeShortcuts.Count();
- for (TInt i = 0; (i < count) &&
- (i < iDefaultUsed.Count()) &&
- (i < iShortcuts.Count());
- ++i)
- {
- if (iDefaultUsed[i] == EScutDefaultToPlatform ||
- iDefaultUsed[i] == EScutUserDefined)
- {
- bufferPtr.Zero();
- CAiScutShortcut*& shortcut = iShortcuts[i];
- // Strip off the default-setting-bit, it's not part of the shortcut id.
- TUint32 scutKey = iThemeShortcuts[i]->Id() & KScutBitMaskThemeDefault;
- bufferPtr.Append(iThemeShortcuts[i]->Target());
- CAiScutShortcut* newScut = NULL;
- TRAPD(err, newScut = AiScutFactory::CreateAiScutShortcutL(scutKey, bufferPtr, *this));
- if (err == KErrNone)
- {
- delete shortcut;
- shortcut = NULL;
- shortcut = newScut;
- // Add the bit that indicates this is a default shortcut setting.
- scutKey |= KScutFlagBitThemeDefault;
- iRepository->Set(scutKey, bufferPtr);
- }
- iDefaultUsed[i] = EScutDefaultToTheme;
- // Recheck access
- shortcut->CheckAccessL(EScutCheckAll);
- }
- }
- if (iSettingsNotifier)
- {
- iSettingsNotifier->StartListeningL();
- }
- if (iHiddenAppsNotifier)
- {
- iHiddenAppsNotifier->StartListeningL();
- }
-
- CleanupStack::PopAndDestroy(buffer);
-}
-
-// ---------------------------------------------------------------------------
-// Merges the user defined shortcuts with the defaults and checks shortcut access.
-// ---------------------------------------------------------------------------
-//
-void CAiScutEngine::MergeShortcuts(TShortcutType aType, TBool aRecreateAll)
-{
- TRAP_IGNORE(MergeShortcutsL(aType, aRecreateAll));
-}
-
-// ---------------------------------------------------------------------------
-// Merges the user defined shortcuts with the defaults.
-// ---------------------------------------------------------------------------
-//
-void CAiScutEngine::MergeShortcutsL(TShortcutType aType, TBool aRecreateAll)
-{
- RArray<TUint32> keys;
- CleanupClosePushL(keys);
-
- // Find the keys that define user defined shortcut settings.
- iRepository->FindL(KScutCenRepKeyUserDefined, KScutCenRepKeyMask, keys);
-
- HBufC* buffer = HBufC::NewLC(
- NCentralRepositoryConstants::KMaxUnicodeStringLength);
- TPtr bufferPtr = buffer->Des();
-
- for (TInt i = 0; i < iShortcuts.Count(); ++i)
- {
- CAiScutShortcut* shortcut = iShortcuts[i];
- if (aType == EScutAnyType || shortcut->Type() == aType)
- {
-
- TInt keyIndex = keys.Find(shortcut->Id());
- if (keyIndex != KErrNotFound)
- {
- // Set the new user target.
- if (keys.Count() > keyIndex && keyIndex >= 0 &&
- iRepository->Get(keys[keyIndex], bufferPtr) == KErrNone)
- {
- iParser.Parse(bufferPtr);
- TAiScutIcon icon = iParser.Icon();
- if ( icon.iType != EScutIconNone )
- {
- AddOverrideIcon( icon );
- }
- if ( aRecreateAll ||
- buffer->CompareC( shortcut->ActiveDefinition() ) != 0 )
- {
- shortcut->DeleteUserTarget();
- shortcut->SetUserTarget(bufferPtr);
- }
- if (i < iDefaultUsed.Count())
- {
- iDefaultUsed[i] = EScutUserDefined;
- }
- }
- }
- }
- }
-
- CleanupStack::PopAndDestroy(buffer);
- CleanupStack::PopAndDestroy(&keys);
-}
-
-// ---------------------------------------------------------------------------
-// Checks shortcut accessibility.
-// ---------------------------------------------------------------------------
-//
-void CAiScutEngine::CheckAccessAndPublish(TInt aCheckType, TBool aPublishAll)
-{
- TRAPD(err, CheckAccessAndPublishL(aCheckType, aPublishAll));
-
- if (err == KErrNotReady)
- {
- // Access check failed, create a timer to try again later.
- iTimer = CPeriodic::New(CActive::EPriorityStandard);
- iTimer->Start(KScutAccessCheckRetryDelay, KScutAccessCheckRetryDelay,
- TCallBack(DelayedCheckCallBack));
- }
-}
-
-// ---------------------------------------------------------------------------
-// Tells each shortcut to check whether or not its target is accessible.
-// ---------------------------------------------------------------------------
-//
-void CAiScutEngine::CheckAccessAndPublishL(TInt aCheckType, TBool aPublishAll)
-{
- __PRINTS("XAI: CheckAccessAndPublishL");
- if (!iMsvSession && IsMsvSessionNeeded())
- {
- iMsvSession = CMsvSession::OpenAsObserverL(*this);
- }
-
- if (!iBookmarkDbObserver && IsBookmarkObserverNeeded())
- {
- iBookmarkDbObserver =
- new (ELeave) CActiveFavouritesDbNotifier(iBookmarkDb, *this);
- if (! iBookmarkDbObserver->IsActive())
- {
- iBookmarkDbObserver->Start();
- }
- }
-
- iPublishAll = aPublishAll;
-
- TInt count = iShortcuts.Count();
- for (TInt i = 0; i < count; ++i)
- {
- CAiScutShortcut*& shortcut = iShortcuts[i];
-
- // Check shortcut access and publish it if its target has changed.
- // When the plug-in is being resumed, all shortcuts are published.
- // Non-visible and locked shortcuts are never published.
- if ( !shortcut->CheckAccessL(aCheckType) )
- {
- HBufC* target = HBufC::NewLC(NCentralRepositoryConstants::KMaxUnicodeStringLength);
- TPtr targetPtr = target->Des();
- TUid dummy;
- // Get the default shortcut definition from cenrep using key 'key'.
- // uid is ignored.
- TUint32 key = shortcut->Id();
- TAiDefaultShortcut::GetDefaultShortcut(key, dummy, targetPtr);
- delete shortcut;
- shortcut = NULL;
- TRAPD(err, shortcut = AiScutFactory::CreateAiScutShortcutL(key, targetPtr, *this));
- if (err == KErrNone)
- {
- // Add the bit that indicates this is a default shortcut setting.
- key |= KScutFlagBitThemeDefault;
- iRepository->Set(key, targetPtr);
-
- // Try to locate a icon override from the default
- // definition
- iParser.Parse( targetPtr );
- TAiScutIcon tIcon = iParser.Icon();
- if ( tIcon.iType != EScutIconNone )
- {
- AddOverrideIcon( tIcon );
- }
- }
- CleanupStack::PopAndDestroy( target );
- if (i < iDefaultUsed.Count())
- {
- iDefaultUsed[i] = EScutDefaultToPlatform;
- }
- // Recheck access
- shortcut->CheckAccessL(aCheckType);
- }
-
- TBool targetChanged = shortcut->IsTargetChanged();
- TInt32 id = shortcut->Id();
- TBool nonVisible = (0 != (id & KScutFlagBitNonVisible));
-
- if (aCheckType == EScutCheckBkm && shortcut->Type() == EScutBookmark)
- {
- targetChanged = ETrue;
- }
-
- shortcut->SetToBePublished(
- (targetChanged || iPublishAll) &&
- !nonVisible
- );
-
- // Assign overridden icons to shortcuts if needed
- for ( TInt j = 0; j < iIcons.Count(); j++)
- {
- // Check that the appuid and type matches
- if ( shortcut->AppUid() == iIcons[j].iAppUid &&
- shortcut->Type() == iIcons[j].iShortcutType )
- {
- // We need to check also the view id / bkm id if present or otherwise all bookmarks
- // app views would be overridden
- if ( iIcons[j].iViewId.iUid <= 0 ||
- iIcons[j].iViewId == shortcut->AdditionalUid() )
- {
- shortcut->SetIcon(iIcons[j]);
- }
- }
- }
-
- __PRINT( __DBG_FORMAT( "XAI: id = 0x%x, type = %d, publish = %d"),
- shortcut->Id(), shortcut->Type(), shortcut->NeedsToBePublished());
- }
-
- iPlugin.PublishShortcutsL(iShortcuts);
-}
-
-// ---------------------------------------------------------------------------
-// Finds the shortcut object with the given id.
-// ---------------------------------------------------------------------------
-//
-TInt CAiScutEngine::FindShortcutIndex(TInt32 aId)
-{
- for (TInt i = 0; i < iShortcuts.Count(); ++i)
- {
- if (iShortcuts[i]->Id() == aId)
- {
- return i;
- }
- }
-
- return KErrNotFound;
-}
-
-// ---------------------------------------------------------------------------
-// Handles the shortcut launch by index.
-// ---------------------------------------------------------------------------
-//
-void CAiScutEngine::HandleLaunchByIndexL(const TDesC& aParam)
-{
- __PRINT( __DBG_FORMAT( "XAI: CAiScutEngine::HandleLaunchByIndexL ('%S')"), &aParam);
- if (aParam.Length() > 0)
- {
- _LIT(KHexPrefix, "0x");
- const TInt prefixLen = 2;
-
- TRadix radix(EDecimal);
- TPtrC ptr(aParam);
-
- if (aParam.Left(prefixLen).CompareC(KHexPrefix) == 0)
- {
- // Strip the '0x' prefix.
- ptr.Set(aParam.Right(aParam.Length() - prefixLen));
-
- radix = EHex;
- }
-
- TLex lexer(ptr);
- TUint32 id;
- if (lexer.Val(id, radix) == KErrNone)
- {
- TInt idx = FindShortcutIndex(id);
- if (idx != KErrNotFound && idx >= 0 && iShortcuts.Count() > idx)
- {
- iShortcuts[idx]->LaunchL();
- }
- }
- }
-}
-// ---------------------------------------------------------------------------
-// Handles the shortcut launch by index.
-// ---------------------------------------------------------------------------
-//
-void CAiScutEngine::HandleLaunchByIndexAlternateL(const TDesC& aParam)
-/**
- * These are the cases at the moment that are handled here.
- * 1) Appshell targeted => Fastswap opened
- */
-{
- __PRINT( __DBG_FORMAT( "XAI: CAiScutEngine::HandleLaunchByIndexAlternateL ('%S')"), &aParam);
- TInt index = IntFromDesc( aParam );
- TInt idx = FindShortcutIndex( index );
- if (idx != KErrNotFound && idx >= 0 && iShortcuts.Count() > idx)
- {
- CAiScutShortcut *scut = iShortcuts[idx];
- // Open fastswap in case appshell was targeted with alternate launch
- if ( scut->AppUid() == KScutAppShellUid )
- {
- OpenFastSwap();
- return;
- }
- // add other special cases here
- /*if ( index == EAiScutSoftKeyLeft )
- {
- // do something
- }*/
- }
-}
-
-// ---------------------------------------------------------------------------
-// Handles the shortcut launch by value.
-// ---------------------------------------------------------------------------
-//
-void CAiScutEngine::HandleLaunchByValueL(const TDesC& aParam)
-{
- __PRINT( __DBG_FORMAT( "XAI: CAiScutEngine::HandleLaunchByIndexL ('%S')"), &aParam);
-
- if (aParam.Length() > 0)
- {
- CAiScutShortcut* shortcut = AiScutFactory::CreateAiScutShortcutLC(0x0, aParam, *this);
- shortcut->CheckAccessL(EScutCheckAll);
- shortcut->LaunchL();
- CleanupStack::PopAndDestroy(shortcut);
- }
-}
-
-// ---------------------------------------------------------------------------
-// Shows the plug-in settings dialog.
-// ---------------------------------------------------------------------------
-//
-void CAiScutEngine::ShowSettingsL(const TDesC& aParam)
-{
- __PRINT( __DBG_FORMAT( "XAI: CAiScutEngine::ShowSettingsL ('%S')"), &aParam);
-
- _LIT(KGeneralSettings, "localapp:0x100058EC?view=0x102750FC");
-
- CAiScutShortcut* shortcut = CAiScutShortcut::NewLC(0x0, KGeneralSettings, *this);
- shortcut->CheckAccessL(EScutCheckAll);
-
- if (aParam.Length() > 0)
- {
- HBufC8* param = CnvUtfConverter::ConvertFromUnicodeToUtf8L(aParam);
- CleanupStack::PushL(param);
-
- const TDesC8& msg(*param);
-
- shortcut->LaunchL(msg);
-
- CleanupStack::PopAndDestroy(param);
- }
- else
- {
- shortcut->LaunchL(KNullDesC8);
- }
-
-
- CleanupStack::PopAndDestroy(shortcut);
-}
-
-// ---------------------------------------------------------------------------
-// Shows the plug-in setting.
-// ---------------------------------------------------------------------------
-//
-void CAiScutEngine::ShowSettingL(const TDesC& aParam)
-{
- __PRINT( __DBG_FORMAT( "XAI: CAiScutEngine::ShowSettingL ('%S')"), &aParam);
-
- _LIT(KGeneralSettings, "localapp:0x100058EC?view=0x102750FC");
-
- CAiScutShortcut* shortcut = CAiScutShortcut::NewLC(0x0, KGeneralSettings, *this);
- shortcut->CheckAccessL(EScutCheckAll);
-
- if (aParam.Length() > 0)
- {
- HBufC8* param = CnvUtfConverter::ConvertFromUnicodeToUtf8L(aParam);
- CleanupStack::PushL(param);
-
- HBufC8* param2 = HBufC8::NewLC(param->Des().Length()+KScutDirectOpen.iTypeLength);
- param2->Des().Copy(param->Des());
- param2->Des().Append(KScutDirectOpen);
- const TDesC8& msg(*param2);
-
- shortcut->LaunchL(msg);
-
- CleanupStack::PopAndDestroy(param2);
- CleanupStack::PopAndDestroy(param);
- }
- else
- {
- shortcut->LaunchL(KNullDesC8);
- }
-
-
- CleanupStack::PopAndDestroy(shortcut);
-}
-
-// ---------------------------------------------------------------------------
-// Opens the fastswap window
-// ---------------------------------------------------------------------------
-//
-void CAiScutEngine::OpenFastSwap()
-{
- RAknUiServer* uiServer = CAknSgcClient::AknSrv();
- if ( uiServer )
- {
- uiServer->MakeTaskListVisible( ETrue );
- }
-}
-
-
-
-// ---------------------------------------------------------------------------
-// Handles PS commands from WSPlugin.
-// ---------------------------------------------------------------------------
-//
-TInt CAiScutEngine::HandlePSCommand(TAny* aAny)
-{
- CAiScutEngine* self = reinterpret_cast< CAiScutEngine* >(aAny);
- TInt err = KErrNone;
- if (self)
- {
- TRAP(err, self->DoHandlePSCommandL());
- }
-
- return err;
-}
-
-// ---------------------------------------------------------------------------
-// Handles call state changes.
-// ---------------------------------------------------------------------------
-//
-TInt CAiScutEngine::CallStateChangeCallback(TAny* /*aAny*/)
-{
- return KErrNone;
-}
-
-// ---------------------------------------------------------------------------
-//
-// ---------------------------------------------------------------------------
-//
-TUid CAiScutEngine::SoftkeyUid(TUint32 aSoftkeyId)
-{
- TUid uid = KNullUid;
-
- TInt idx = FindShortcutIndex(aSoftkeyId);
- if (idx != KErrNotFound && idx >= 0 && iShortcuts.Count() > idx)
- {
- uid = iShortcuts[idx]->AppUid();
-
- __PRINT( __DBG_FORMAT( "XAI: SoftkeyUid %d app uid = 0x%x"), idx, uid.iUid);
- }
-
- return uid;
-}
-
-// ---------------------------------------------------------------------------
-//
-// ---------------------------------------------------------------------------
-//
-TBool CAiScutEngine::IsDelayRequired(TUid aAppUid)
-{
- // softkey delay is reuired for these applications because of problems
- // in killing them immediatly after keylock activation.
- if (aAppUid.iUid == KScutBrowserUidValue ||
- aAppUid.iUid == KScutOperatorMenuUidValue ||
- aAppUid.iUid == KScutVideoServicesUidValue ||
- IsNonNative( aAppUid )
- )
- {
- return ETrue;
- }
-
- return EFalse;
-}
-
-// ---------------------------------------------------------------------------
-// Handles PS commands from WSPlugin.
-// ---------------------------------------------------------------------------
-//
-void CAiScutEngine::DoHandlePSCommandL()
-{
- TBuf<RProperty::KMaxPropertySize> command;
- TUint32 lockKeyId = 0;
- iKeyEventObserver->Get(command);
-
- __PRINT( __DBG_FORMAT( "XAI: CAiScutEngine::DoHandlePSCommandL command = '%S'"), &command);
-
- TUid appUid = KNullUid;
-
- if (iFirstLockKey == EStdKeyDevice0)
- {
- appUid = SoftkeyUid(KLeftSoftkeyId);
- lockKeyId = KLeftSoftkeyId;
- }
-
- if (iFirstLockKey == EStdKeyDevice1)
- {
- appUid = SoftkeyUid(KRightSoftkeyId);
- lockKeyId = KRightSoftkeyId;
- }
-
- if (iFirstLockKeyPressed && command.Compare(KAiPSEnableKeyLock) == 0)
- {
- if (appUid != KNullUid)
- {
- TBool isDialog = EFalse;
- TInt idx = 0;
- delete iScutShutter;
- iScutShutter = NULL;
-
- // In case new message shortcut in lockkey
- // we need to dismiss the dialog
- if ( lockKeyId > 0 )
- {
- idx = FindShortcutIndex( lockKeyId );
- if (idx != KErrNotFound)
- {
- switch (iShortcuts[idx]->Type())
- {
- case EScutNewMsgType:
- isDialog = ETrue;
- break;
- default:
- isDialog = EFalse;
- break;
- }
- }
-
- }
- iDelayTimer->Cancel();
- iScutShutter = CAiScutTargetShutter::NewL(iEnv, appUid, iSoftkeyAppRunning, isDialog);
- iScutShutter->StartL();
- }
- }
-
- if (command.Compare(KAiPSSkipKeyLock) == 0)
- {
- iDelayTimer->Cancel();
- return ;
- }
- else if (command.Compare(KAiPSKeyLockTimeout) == 0)
- {
- if (iFirstLockKeyPressed)
- {
- iFirstLockKeyPressed = EFalse;
-
- if (iFirstLockKey == EStdKeyDevice0)
- {
- if (IsDelayRequired(appUid))
- {
- HandleLaunchByIndexL(KLeftSoftkey);
- }
- return ;
- }
-
- if (iFirstLockKey == EStdKeyDevice1)
- {
- if (IsDelayRequired(appUid))
- {
- HandleLaunchByIndexL(KRightSoftkey);
- }
- return ;
- }
- }
- return ;
- }
-
- if (FeatureManager::FeatureSupported(KFeatureIdKeypadNoVoiceKey) &&
- command.Compare(KAiPSSkipNameDialer) == 0)
- {
- HandleLaunchByIndexL(KRightSoftkey);
- return ;
- }
-
- HandleLaunchByValueL(command);
-}
-
-// ---------------------------------------------------------------------------
-// Handles call state changes.
-// ---------------------------------------------------------------------------
-//
-void CAiScutEngine::HandleCallStateChange()
-{
- TInt value = 0;
- TInt err = iCallStateObserver->Get(value);
- iActiveCall = (value > EPSCTsyCallStateNone) && err == KErrNone;
-
- __PRINT( __DBG_FORMAT( "XAI: CAiScutEngine::HandleCallStateChange = %d"), value);
- __PRINT( __DBG_FORMAT( "XAI: iActiveCall = %d"), iActiveCall);
-
- for (TInt i = 0; i < iShortcuts.Count(); ++i)
- {
- iShortcuts[i]->SetCallState(iActiveCall);
- }
-}
-
-// ---------------------------------------------------------------------------
-// Activates TopMost Application
-// ---------------------------------------------------------------------------
-//
-void CAiScutEngine::ActivateTopMostApp()
-{
- // Phone Topmost app as default
- TInt idleAppUid = 0;
- TInt topMostAppId = 0;
-
- RProperty::Get(KPSUidAiInformation, KActiveIdleUid, idleAppUid);
-
- RProperty property;
- TInt err = property.Attach(KPSUidUikon, KUikVideoCallTopApp);
-
- if (err == KErrNone)
- {
- property.Get(topMostAppId);
- }
-
- property.Close();
-
- __PRINT( __DBG_FORMAT( "XAI: ActivateTopMostApp idle uid = 0x%x topmost = 0x%x"), idleAppUid, topMostAppId);
-
- TUid appId(TUid::Uid(topMostAppId));
-
- if(appId == KVideoCallUid)
- {
- const TVwsViewId viewId(appId, appId);
- err = iVwsSession->CreateActivateViewEvent(viewId, KNullUid, KNullDesC8());
-
- __PRINT( __DBG_FORMAT( "XAI: CreateActivateViewEvent = %d"), err);
- }
- else
- {
- const TVwsViewId viewId(appId, KVoiceCallUidViewId);
- err = iVwsSession->CreateActivateViewEvent(viewId, KVoiceCallUidViewId, KNullDesC8());
-
- __PRINT( __DBG_FORMAT( "XAI: CreateActivateViewEvent = %d"), err);
- }
-
-}
-
-// ---------------------------------------------------------------------------
-// From class MFavouritesDbObserver.
-// Handles database event.
-// ---------------------------------------------------------------------------
-//
-void CAiScutEngine::HandleFavouritesDbEventL(RDbNotifier::TEvent aEvent)
-{
- __PRINT( __DBG_FORMAT( "XAI: CAiScutEngine::HandleFavouritesDbEventL aEvent = %d"), aEvent);
-
- if (aEvent == RDbNotifier::ECommit)
- {
- MergeShortcuts(EScutBookmark, ETrue);
- CheckAccessAndPublish(EScutCheckBkm, EFalse);
- }
-}
-
-// ---------------------------------------------------------------------------
-//
-// ---------------------------------------------------------------------------
-//
-TBool CAiScutEngine::IsMsvSessionNeeded()
-{
- TInt count = iShortcuts.Count();
-
- for (TInt i = 0; i < count; ++i)
- {
- CAiScutShortcut* shortcut = iShortcuts[i];
- TShortcutType type = shortcut->Type();
-
- if (type == EScutNewMessage ||
- type == EScutNewEmail ||
- type == EScutNewSyncMLMail ||
- type == EScutNewPostcard ||
- type == EScutNewAudioMsg ||
- type == EScutNewMsgType ||
- type == EScutMailbox)
- {
- return ETrue;
- }
- }
-
- return EFalse;
-}
-
-// ---------------------------------------------------------------------------
-//
-// ---------------------------------------------------------------------------
-//
-TBool CAiScutEngine::IsBookmarkObserverNeeded()
-{
- TInt count = iShortcuts.Count();
-
- for (TInt i = 0; i < count; ++i)
- {
- CAiScutShortcut* shortcut = iShortcuts[i];
- if (shortcut->Type() == EScutBookmark)
- {
- return ETrue;
- }
- }
-
- return EFalse;
-}
-
-// ---------------------------------------------------------------------------
-//
-// ---------------------------------------------------------------------------
-//
-TBool CAiScutEngine::GetAppTitle(
- const TUid& aAppUid, const TUid& aViewId, TDes& aTitle, TAiScutAppTitleType aType)
-{
- TBool ret = EFalse;
- TInt count = iAppTitleList.Count();
-
- for (TInt i = 0; i < count; i++)
- {
- TAiScutAppTitleEntry entry = iAppTitleList[i];
-
- if (entry.iAppUid == aAppUid && entry.iViewId == aViewId)
- {
- switch (aType)
- {
- case EAiScutLongTitle:
- if (entry.iLongTitle)
- {
- aTitle = *entry.iLongTitle;
- ret = ETrue;
- }
- break;
-
- case EAiScutShortTitle:
- if (entry.iShortTitle)
- {
- aTitle = *entry.iShortTitle;
- ret = ETrue;
- }
- break;
-
- case EAiScutSkeyTitle:
- if (entry.iSkeyTitle)
- {
- aTitle = *entry.iSkeyTitle;
- ret = ETrue;
- }
- break;
-
- case EAiScutMskTitle:
- if (entry.iMskTitle)
- {
- aTitle = *entry.iMskTitle;
- ret = ETrue;
- }
- break;
- default :
- break;
- }
-
- break; // break the for loop
- }
- }
-
- if (! ret) __PRINT( __DBG_FORMAT( "XAI: GetAppTitle NOT found for uid = 0x%x"), aAppUid);
-
- return ret;
-}
-
-// ---------------------------------------------------------------------------
-//
-// ---------------------------------------------------------------------------
-//
-void CAiScutEngine::LoadAppTitleListL()
-{
- TResourceReader reader;
- iEnv->CreateResourceReaderLC(reader, R_SCUT_APP_TITLE_LIST);
-
- TInt items = reader.ReadInt16();
-
- __PRINT( __DBG_FORMAT( "XAI: LoadAppTitleListL items = %d"), items);
-
- TUid appuid;
- TUid viewid;
-
- for (TInt i = 0; i < items; i++)
- {
- appuid.iUid = reader.ReadInt32();
- viewid.iUid = reader.ReadInt32();
-
- HBufC16* longTitle = reader.ReadHBufC16L();
- CleanupStack::PushL(longTitle);
-
- HBufC16* shortTitle = reader.ReadHBufC16L();
- CleanupStack::PushL(shortTitle);
-
- HBufC16* skeyTitle = reader.ReadHBufC16L();
- CleanupStack::PushL(skeyTitle);
-
- HBufC16* mskTitle = reader.ReadHBufC16L();
- CleanupStack::PushL(mskTitle);
-
- TAiScutAppTitleEntry entry;
-
- entry.iAppUid = appuid;
- entry.iViewId = viewid;
- entry.iLongTitle = longTitle;
- entry.iShortTitle = shortTitle;
- entry.iSkeyTitle = skeyTitle;
- entry.iMskTitle = mskTitle;
-
- User::LeaveIfError(iAppTitleList.Append(entry));
-
- // Title names are deleted in destructor.
- CleanupStack::Pop(4, longTitle);
- }
-
- CleanupStack::PopAndDestroy(); // reader
-}
-
-// ---------------------------------------------------------------------------
-//
-// ---------------------------------------------------------------------------
-//
-void CAiScutEngine::GetHiddenAppsL()
-{
- HBufC* buffer = HBufC::NewLC(
- NCentralRepositoryConstants::KMaxUnicodeStringLength);
- TPtr bufferPtr = buffer->Des();
-
- iHiddenAppsRepository->Get(KMenuHideApplication, bufferPtr);
-
- __PRINT( __DBG_FORMAT( "XAI: CAiScutSettingsModel::GetHiddenAppsL '%S' "), buffer);
-
- iHiddenApps.Reset();
- TAiScutAppUidParser uidParser(bufferPtr, iHiddenApps);
- uidParser.ParseL();
-
- CleanupStack::PopAndDestroy(buffer);
-}
-
-// ---------------------------------------------------------------------------
-//
-// ---------------------------------------------------------------------------
-//
-TBool CAiScutEngine::IsHiddenFromFSW( const TUid& aAppUid )
-{
- const TUid KPSUidUikon = { 0x101F8773 };
- const TUint32 KUikAppHiddenList = 0x00000010;
- const TInt KMaxHiddenApps = 25;
-
- TBuf16 <2*KMaxHiddenApps> retrievedList;
- TInt err = RProperty::Get( KPSUidUikon, KUikAppHiddenList,
-retrievedList );
- TInt i = 0;
-
- TUint32 listValue;
- while( i < KMaxHiddenApps && KErrNone == err )
- {
- // 32-bit uid values are retrieved in two 16-bit parts
- listValue = retrievedList[2*i] << 16;
- listValue += retrievedList[2*i+1];
-
- if ( listValue )
- {
- TUid t ( KNullUid );
- t.iUid = listValue;
- if( t == aAppUid )
- {
- return ETrue;
- }
- }
- else
- {
- err = KErrEof;
- return EFalse;
- }
- i++;
- }
- return EFalse;
-}
-// ---------------------------------------------------------------------------
-// Adds an override icon to iIcons array in case the same icon
-// isn't there already
-// ---------------------------------------------------------------------------
-//
-TInt CAiScutEngine::AddOverrideIcon( TAiScutIcon &aIcon )
- {
- TBool foundExisting = EFalse;
-
- for ( TInt i = 0; i < iIcons.Count(); i++)
- {
- if ( aIcon.iAppUid == iIcons[i].iAppUid &&
- aIcon.iShortcutType == iIcons[i].iShortcutType &&
- aIcon.iViewId == iIcons[i].iViewId &&
- aIcon.iDestination == iIcons[i].iDestination )
- {
- foundExisting = ETrue;
- break;
- }
- }
- if ( !foundExisting )
- {
- return iIcons.Append( aIcon );
- }
- return KErrNone;
- }
-// End of File.