idlefw/plugins/shortcutplugin/src/caiscutsettingsmodel.cpp
branchRCL_3
changeset 8 d0529222e3f0
parent 4 1a2a00e78665
child 11 bd874ee5e5e2
equal deleted inserted replaced
4:1a2a00e78665 8:d0529222e3f0
     1 /*
       
     2 * Copyright (c) 2005-2006 Nokia Corporation and/or its subsidiary(-ies).
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of "Eclipse Public License v1.0"
       
     6 * which accompanies this distribution, and is available
       
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - initial contribution.
       
    11 *
       
    12 * Contributors:
       
    13 *
       
    14 * Description:  Shrortcut settings plug-in model.
       
    15 *
       
    16 */
       
    17 
       
    18 
       
    19 #include <centralrepository.h>
       
    20 #include <eikenv.h>
       
    21 #include <menu2internalcrkeys.h>
       
    22 
       
    23 #include "caiscutsettings.h"
       
    24 #include "caiscutsettingsmodel.h"
       
    25 #include "caiscutsettingscontainer.h"
       
    26 #include "caiscutsettingsitem.h"
       
    27 #include "aiscutpluginprivatecrkeys.h"
       
    28 #include "aiscutdefs.h"
       
    29 #include "aiscutappuidparser.h"
       
    30 #include "aiscutrepositorywatcher.h"
       
    31 
       
    32 #include "debug.h"
       
    33 
       
    34 LOCAL_C TInt CompareKey(const TUint32& aLeft, const TUint32& aRight)
       
    35 {
       
    36     TBool softkey1 = (0 != ((aLeft  & 0xFFFF) >= EAiScutSoftKeyLeft));
       
    37     TBool softkey2 = (0 != ((aRight & 0xFFFF) >= EAiScutSoftKeyLeft));
       
    38     TUint32 left  = aLeft  & (KScutBitMaskThemeDefault & KScutBitMaskLocked);
       
    39     TUint32 right = aRight & (KScutBitMaskThemeDefault & KScutBitMaskLocked);
       
    40 
       
    41     // Softkey shortcuts are always sorted to be smallest.
       
    42     if (!(softkey1 && softkey2))
       
    43     {
       
    44         if (softkey1)
       
    45         {
       
    46             return -1;
       
    47         }
       
    48         else if (softkey2)
       
    49         {
       
    50             return 1;
       
    51         }
       
    52     }
       
    53 
       
    54     if (left < right)
       
    55     {
       
    56         return -1;
       
    57     }
       
    58     else if (left > right)
       
    59     {
       
    60         return 1;
       
    61     }
       
    62 
       
    63     return 0;
       
    64 }
       
    65 
       
    66 
       
    67 
       
    68 // ======== MEMBER FUNCTIONS ========
       
    69 
       
    70 // ---------------------------------------------------------------------------
       
    71 //
       
    72 // ---------------------------------------------------------------------------
       
    73 //
       
    74 CAiScutSettingsModel* CAiScutSettingsModel::NewL(CAiScutSettings& aPlugin,
       
    75     CCoeEnv* aEnv)
       
    76 {
       
    77     CAiScutSettingsModel* self = new (ELeave) CAiScutSettingsModel(aPlugin, aEnv);
       
    78 
       
    79     CleanupStack::PushL(self);
       
    80     self->ConstructL();
       
    81     CleanupStack::Pop(self);
       
    82 
       
    83     return self;
       
    84 }
       
    85 
       
    86 // ---------------------------------------------------------------------------
       
    87 //
       
    88 // ---------------------------------------------------------------------------
       
    89 //
       
    90 CAiScutSettingsModel::CAiScutSettingsModel(CAiScutSettings& aPlugin, CCoeEnv* aEnv) 
       
    91     : iPlugin(aPlugin), iEnv(aEnv)
       
    92 {
       
    93 }
       
    94 
       
    95 // ---------------------------------------------------------------------------
       
    96 //
       
    97 // ---------------------------------------------------------------------------
       
    98 //
       
    99 CAiScutSettingsModel::~CAiScutSettingsModel()
       
   100 {
       
   101     ActivateObservers(EFalse);
       
   102 
       
   103     delete iSettingsNotifier;
       
   104     delete iRepository;
       
   105 
       
   106     delete iHiddenAppsNotifier;
       
   107     delete iHiddenAppsRepository;
       
   108 
       
   109     iHiddenApps.Close();
       
   110 
       
   111     delete iAppList;
       
   112     delete iBkmList;
       
   113 
       
   114     iSettings.ResetAndDestroy();
       
   115     iKeys.Reset();
       
   116     delete iFavItemList;
       
   117     iBookmarkDb.Close();
       
   118     iBookmarkSess.Close();
       
   119     iApaSession.Close();
       
   120 }
       
   121 
       
   122 // ---------------------------------------------------------------------------
       
   123 //
       
   124 // ---------------------------------------------------------------------------
       
   125 //
       
   126 void CAiScutSettingsModel::ConstructL()
       
   127 {
       
   128     User::LeaveIfError(iApaSession.Connect());
       
   129     User::LeaveIfError(iBookmarkSess.Connect());
       
   130     User::LeaveIfError(iBookmarkDb.Open(iBookmarkSess, KBrowserBookmarks));
       
   131 
       
   132     iRepository = CRepository::NewL(KCRUidShortcutItems);
       
   133 
       
   134     iHiddenAppsRepository = CRepository::NewL(KCRUidMenu);
       
   135 
       
   136     // Create cenrep key observer for monitoring settings changes
       
   137     // when theme is changed.
       
   138     iSettingsNotifier = CAiScutRepositoryWatcher::NewL(
       
   139         KCRUidShortcutItems,
       
   140         TCallBack(HandleShortcutsChanged, this),
       
   141         iRepository);
       
   142 
       
   143     iSettingsNotifier->StartListeningL();
       
   144 
       
   145     iHiddenAppsNotifier = CAiScutRepositoryWatcher::NewL(
       
   146         KCRUidMenu,
       
   147         KMenuHideApplication,
       
   148         CCenRepNotifyHandler::EStringKey,
       
   149         TCallBack(HandleHiddenAppsChanged, this),
       
   150         iHiddenAppsRepository);
       
   151 
       
   152     iHiddenAppsNotifier->StartListeningL();
       
   153 
       
   154     GetHiddenAppsL();
       
   155 
       
   156     iAppList = CAiScutSettingsAppList::NewL(iEnv, *this);
       
   157     iAppList->StartL();
       
   158 
       
   159     iBkmList = CAiScutSettingsBkmList::NewL(iEnv, this, *this);
       
   160 }
       
   161 
       
   162 // ---------------------------------------------------------------------------
       
   163 //
       
   164 // ---------------------------------------------------------------------------
       
   165 //
       
   166 void CAiScutSettingsModel::SetSettingsKeys(RArray<TUint32>& aKeys)
       
   167     {
       
   168     iKeys.Reset();
       
   169     
       
   170     for( TInt i = 0; i < aKeys.Count(); i++ )
       
   171         {
       
   172         TUint32 value( aKeys[i] );
       
   173         
       
   174         iKeys.Append( value );
       
   175         }        
       
   176     }
       
   177     
       
   178 // ---------------------------------------------------------------------------
       
   179 //
       
   180 // ---------------------------------------------------------------------------
       
   181 //
       
   182 void CAiScutSettingsModel::UpdateSettingsL()
       
   183 {
       
   184     if( !iPlugin.Activated() )
       
   185         {
       
   186         return;
       
   187         }
       
   188         
       
   189     iSettings.ResetAndDestroy();
       
   190 
       
   191     TInt keyCount( iKeys.Count() );
       
   192 
       
   193     if( keyCount > 0 )
       
   194         {
       
   195         for( TInt i = 0; i < keyCount; i++ )
       
   196             {
       
   197             CAiScutSettingsItem* setting = CAiScutSettingsItem::NewLC(
       
   198                 *this, i, iKeys[i] );
       
   199 
       
   200             setting->ReadL( iRepository );
       
   201 
       
   202             User::LeaveIfError( iSettings.Append( setting ) );
       
   203             CleanupStack::Pop( setting );           
       
   204             }
       
   205                 
       
   206         return;
       
   207         }
       
   208         
       
   209     RArray<TUint32> defaultKeys;
       
   210     CleanupClosePushL(defaultKeys);
       
   211     
       
   212     // Find the default keys and user defined keys.
       
   213     iRepository->FindL(
       
   214         KScutCenRepKeyThemeDefault, KScutCenRepKeyMask, defaultKeys);        
       
   215 
       
   216     TInt i;
       
   217     TUint32 defaultKey;
       
   218     TUint32 userKey;
       
   219     TInt count;
       
   220     TInt lockedKeys  = 0;
       
   221     TInt visibleKeys = 0;
       
   222 
       
   223     TLinearOrder<TUint32> order(CompareKey);
       
   224     defaultKeys.Sort(order);
       
   225 
       
   226     count = defaultKeys.Count();
       
   227     for (i = 0; i < count; ++i)
       
   228     {
       
   229         defaultKey = defaultKeys[i];
       
   230         userKey = defaultKey & KScutBitMaskThemeDefault;
       
   231         // We show only actual shortcuts
       
   232         if ( (! ( defaultKey & KScutFlagBitIconOverride )) && 
       
   233              (! ( defaultKey & KScutFlagBitToolbarShortcut )))
       
   234             {                               
       
   235     		__PRINT( __DBG_FORMAT( "XAI:   %d. key = 0x%x"), i+1, 
       
   236     			(defaultKey & (KScutBitMaskThemeDefault & KScutBitMaskLocked)));
       
   237 
       
   238             if (!(userKey & KScutFlagBitOptionallyVisible))
       
   239             {
       
   240                 visibleKeys++;
       
   241             }
       
   242 
       
   243             TBool locked = (0 != (userKey & KScutFlagBitLocked));
       
   244 
       
   245             if (locked)
       
   246             {
       
   247                 lockedKeys++;
       
   248             }
       
   249             else
       
   250             {
       
   251                 CAiScutSettingsItem* setting = CAiScutSettingsItem::NewLC(
       
   252                     *this, visibleKeys-1, defaultKey);
       
   253 
       
   254                 setting->ReadL(iRepository);
       
   255 
       
   256                 User::LeaveIfError(iSettings.Append(setting));
       
   257                 CleanupStack::Pop(setting);
       
   258             }
       
   259         }
       
   260 
       
   261     }
       
   262 
       
   263 	__PRINT( __DBG_FORMAT("XAI:   %d keys, %d locked"), count, lockedKeys);
       
   264 
       
   265     CleanupStack::PopAndDestroy(&defaultKeys);
       
   266 }
       
   267 
       
   268 // ---------------------------------------------------------------------------
       
   269 //
       
   270 // ---------------------------------------------------------------------------
       
   271 //
       
   272 void CAiScutSettingsModel::UpdateSettingsContainerL()
       
   273 {
       
   274     if (iContainer)
       
   275     {
       
   276         if (iContainer->IsChangeDialogShowing())
       
   277         {
       
   278             iContainer->CloseChangeDialog();
       
   279         }
       
   280     }
       
   281 
       
   282     UpdateSettingsL();
       
   283 
       
   284     if (iContainer)
       
   285     {
       
   286         iContainer->ResetCurrentListL(0);
       
   287     }
       
   288 }
       
   289 
       
   290 // ---------------------------------------------------------------------------
       
   291 //
       
   292 // ---------------------------------------------------------------------------
       
   293 //
       
   294 void CAiScutSettingsModel::GetHiddenAppsL()
       
   295 {
       
   296     HBufC* buffer = HBufC::NewLC(
       
   297         NCentralRepositoryConstants::KMaxUnicodeStringLength);
       
   298     TPtr bufferPtr = buffer->Des();
       
   299 
       
   300     iHiddenAppsRepository->Get(KMenuHideApplication, bufferPtr);
       
   301 
       
   302 	__PRINT( __DBG_FORMAT("XAI: CAiScutSettingsModel::GetHiddenAppsL '%S' "), buffer);
       
   303 
       
   304     iHiddenApps.Reset();
       
   305     TAiScutAppUidParser uidParser(bufferPtr, iHiddenApps);
       
   306     uidParser.ParseL();
       
   307 
       
   308     CleanupStack::PopAndDestroy(buffer);
       
   309 }
       
   310 
       
   311 // ---------------------------------------------------------------------------
       
   312 // From MDesCArray
       
   313 // Returns the number of descriptor elements in a descriptor array.
       
   314 // ---------------------------------------------------------------------------
       
   315 //
       
   316 TInt CAiScutSettingsModel::MdcaCount() const
       
   317 {
       
   318     return iSettings.Count();
       
   319 }
       
   320 
       
   321 // ---------------------------------------------------------------------------
       
   322 // From MDesCArray
       
   323 // Indexes into a descriptor array.
       
   324 // ---------------------------------------------------------------------------
       
   325 //
       
   326 TPtrC CAiScutSettingsModel::MdcaPoint(TInt aIndex) const
       
   327 {
       
   328     if (aIndex < 0 || aIndex >= iSettings.Count())
       
   329     {
       
   330         TPtrC ret(KNullDesC);
       
   331         return ret;
       
   332     }
       
   333 
       
   334     return iSettings[aIndex]->ListBoxLine();
       
   335 }
       
   336 
       
   337 // ---------------------------------------------------------------------------
       
   338 //
       
   339 // ---------------------------------------------------------------------------
       
   340 //
       
   341 TInt CAiScutSettingsModel::HandleShortcutsChanged(TAny* aPtr)
       
   342 {
       
   343 	__PRINTS( "XAI: CAiScutSettingsModel::HandleShortcutsChanged");
       
   344 
       
   345     if (aPtr)
       
   346         {
       
   347         CAiScutSettingsModel* self = static_cast<CAiScutSettingsModel*>(aPtr);
       
   348         TRAP_IGNORE(self->UpdateSettingsContainerL());
       
   349         }
       
   350 
       
   351     return KErrNone;
       
   352 }
       
   353 
       
   354 // ---------------------------------------------------------------------------
       
   355 //
       
   356 // ---------------------------------------------------------------------------
       
   357 //
       
   358 TInt CAiScutSettingsModel::HandleHiddenAppsChanged(TAny* aPtr)
       
   359 {
       
   360 	__PRINTS("XAI: CAiScutSettingsModel::HandleHiddenAppsChanged");
       
   361 
       
   362     if (aPtr)
       
   363         {
       
   364         CAiScutSettingsModel* self = static_cast<CAiScutSettingsModel*>(aPtr);
       
   365 
       
   366         TRAP_IGNORE(
       
   367             self->iAppList->StartL();
       
   368             self->GetHiddenAppsL();
       
   369             self->UpdateSettingsContainerL() ) // TRAP_IGNORE
       
   370         }
       
   371 
       
   372     return KErrNone;
       
   373 }
       
   374 
       
   375 // ---------------------------------------------------------------------------
       
   376 //
       
   377 // ---------------------------------------------------------------------------
       
   378 //
       
   379 TBool CAiScutSettingsModel::IsHidden(const TUid& aAppUid) const
       
   380 {
       
   381     if (iHiddenApps.Find(aAppUid) == KErrNotFound)
       
   382     {
       
   383         return EFalse;
       
   384     }
       
   385 
       
   386 	__PRINT( __DBG_FORMAT( "XAI: CAiScutSettingsModel::IsHidden (0x%x) ETrue"), aAppUid);
       
   387 
       
   388     return ETrue;
       
   389 }
       
   390 
       
   391 // ---------------------------------------------------------------------------
       
   392 // From MAiScutListObserver
       
   393 // Callback for application list events.
       
   394 // ---------------------------------------------------------------------------
       
   395 //
       
   396 void CAiScutSettingsModel::HandleScutListEventL(TScutListEvent aEvent,
       
   397     TBool /*aAdded*/)
       
   398 {
       
   399     switch (aEvent)
       
   400     {
       
   401     case MAiScutListObserver::EAppListReady:
       
   402         if (iContainer)
       
   403         {
       
   404             iContainer->HideWaitNoteDialog();
       
   405         }
       
   406         break;
       
   407 
       
   408     case MAiScutListObserver::EAppListUpdated:
       
   409     case MAiScutListObserver::EBkmListUpdated:
       
   410         UpdateSettingsContainerL();
       
   411         break;
       
   412 
       
   413     default:
       
   414         break;
       
   415     }
       
   416 }
       
   417 
       
   418 // ---------------------------------------------------------------------------
       
   419 //
       
   420 // ---------------------------------------------------------------------------
       
   421 //
       
   422 void CAiScutSettingsModel::ActivateObservers(TBool aActivate)
       
   423 {
       
   424     TRAP_IGNORE(
       
   425         if (iAppList)
       
   426         {
       
   427             iAppList->SetObservingL(aActivate);
       
   428         }
       
   429         if (iBkmList)
       
   430         {
       
   431             iBkmList->SetObservingL(aActivate);
       
   432         }
       
   433     )
       
   434 }
       
   435 
       
   436 // ---------------------------------------------------------------------------
       
   437 // Returns a setting item for the given index.
       
   438 // ---------------------------------------------------------------------------
       
   439 //
       
   440 CAiScutSettingsItem* CAiScutSettingsModel::Item(TInt aIndex) const
       
   441 {
       
   442     if (aIndex >= 0 && aIndex < iSettings.Count())
       
   443     {
       
   444         return iSettings[aIndex];
       
   445     }
       
   446 
       
   447     return NULL;
       
   448 }
       
   449 
       
   450 // ---------------------------------------------------------------------------
       
   451 // Utility function to retrieve a bookmark caption from an uid.
       
   452 // ---------------------------------------------------------------------------
       
   453 //
       
   454 TInt CAiScutSettingsModel::GetBkmCaptionL(const TUid aUid, TDes& aCaption)
       
   455 {
       
   456     CFavouritesItem* favItem = CFavouritesItem::NewLC();
       
   457     TInt err = iBookmarkDb.Get(aUid.iUid, *favItem);
       
   458     if (err == KErrNone)
       
   459     {
       
   460         aCaption.Copy(favItem->Name());
       
   461     }
       
   462 
       
   463     CleanupStack::PopAndDestroy(favItem);
       
   464 
       
   465     return err;
       
   466 }
       
   467 
       
   468 // ---------------------------------------------------------------------------
       
   469 // Utility function to retrieve an appliation caption from an uid.
       
   470 // ---------------------------------------------------------------------------
       
   471 //
       
   472 TInt CAiScutSettingsModel::GetAppCaption(const TUid aUid, TDes& aCaption)
       
   473 {
       
   474     TInt err = KErrNone;
       
   475     TApaAppInfo appInfo;
       
   476 
       
   477     err = iApaSession.GetAppInfo(appInfo, aUid);
       
   478     if (err == KErrNone)
       
   479     {
       
   480         aCaption.Copy(appInfo.iCaption);
       
   481     }
       
   482 
       
   483     return err;
       
   484 }
       
   485 
       
   486 // ---------------------------------------------------------------------------
       
   487 // Returns a pointer to the coe environment.
       
   488 // ---------------------------------------------------------------------------
       
   489 //
       
   490 CCoeEnv* CAiScutSettingsModel::Env()
       
   491 {
       
   492     return iEnv;
       
   493 }
       
   494 
       
   495 // ---------------------------------------------------------------------------
       
   496 // Handles saving a setting item to central repository.
       
   497 // ---------------------------------------------------------------------------
       
   498 //
       
   499 void CAiScutSettingsModel::SaveItemL(CAiScutSettingsItem& aItem)
       
   500 {
       
   501     // Stop monitoring own settings changes.
       
   502     iSettingsNotifier->StopListening();
       
   503 
       
   504     TInt err = aItem.Save(iRepository);
       
   505 
       
   506 	__PRINT( __DBG_FORMAT( "XAI: CAiScutSettingsModel::SaveItemL key = 0x%x, err = %d"), 
       
   507 		aItem.Key(), err);
       
   508     UpdateSettingsL();
       
   509     iSettingsNotifier->StartListeningL();
       
   510 }
       
   511 
       
   512 // ---------------------------------------------------------------------------
       
   513 //
       
   514 // ---------------------------------------------------------------------------
       
   515 //
       
   516 void CAiScutSettingsModel::SetContainer(CAiScutSettingsContainer* aContainer)
       
   517 {
       
   518     iContainer = aContainer;
       
   519 }
       
   520 
       
   521 // -----------------------------------------------------------------------------
       
   522 // Using the Favorites dB, get the bookmarked pages
       
   523 // -----------------------------------------------------------------------------
       
   524 //
       
   525 void CAiScutSettingsModel::ReadBookmarksL()
       
   526 {
       
   527     // Get bookmarks
       
   528     delete iFavItemList;
       
   529     iFavItemList = NULL;
       
   530 
       
   531     iFavItemList = new (ELeave) CFavouritesItemList();
       
   532     TInt err = iBookmarkDb.GetAll(
       
   533         *iFavItemList, KFavouritesNullUid, CFavouritesItem::EItem);
       
   534 }
       
   535 
       
   536 // ---------------------------------------------------------------------------
       
   537 //
       
   538 // ---------------------------------------------------------------------------
       
   539 //
       
   540 TInt CAiScutSettingsModel::BookmarkCount() const
       
   541 {
       
   542     if (iFavItemList)
       
   543     {
       
   544         return iFavItemList->Count();
       
   545     }
       
   546     else
       
   547     {
       
   548         return 0;
       
   549     }
       
   550 }
       
   551 
       
   552 // ---------------------------------------------------------------------------
       
   553 //
       
   554 // ---------------------------------------------------------------------------
       
   555 //
       
   556 CFavouritesItem* CAiScutSettingsModel::GetBookmark(TInt aIndex)
       
   557 {
       
   558     if (aIndex >= 0 && aIndex < iFavItemList->Count())
       
   559     {
       
   560     	    
       
   561     	if (iFavItemList)
       
   562     	{
       
   563         	return iFavItemList->At(aIndex);
       
   564     	}
       
   565     	else
       
   566     	{
       
   567         	return NULL;
       
   568     	}
       
   569     }
       
   570     else
       
   571     {
       
   572     	return NULL;	
       
   573     }
       
   574 }
       
   575 
       
   576 // ---------------------------------------------------------------------------
       
   577 // Returns reference to the bookmark database owned by the engine.
       
   578 // ---------------------------------------------------------------------------
       
   579 //
       
   580 RFavouritesDb& CAiScutSettingsModel::FavouritesDb()
       
   581 {
       
   582     return iBookmarkDb;
       
   583 }
       
   584 
       
   585 // ---------------------------------------------------------------------------
       
   586 //
       
   587 // ---------------------------------------------------------------------------
       
   588 //
       
   589 CAiScutSettingsAppList* CAiScutSettingsModel::AppList()
       
   590 {
       
   591     return iAppList;
       
   592 }
       
   593 
       
   594 // ---------------------------------------------------------------------------
       
   595 //
       
   596 // ---------------------------------------------------------------------------
       
   597 //
       
   598 CAiScutSettingsBkmList* CAiScutSettingsModel::BkmList()
       
   599 {
       
   600     return iBkmList;
       
   601 }
       
   602 
       
   603 // End of File.