tstaskmonitor/server/src/tsfswdatalist.cpp
author hgs
Fri, 14 May 2010 17:24:44 +0300
changeset 94 dbb8300717f7
child 83 156f692b1687
permissions -rw-r--r--
201019
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
94
hgs
parents:
diff changeset
     1
/*
hgs
parents:
diff changeset
     2
* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies).
hgs
parents:
diff changeset
     3
* All rights reserved.
hgs
parents:
diff changeset
     4
* This component and the accompanying materials are made available
hgs
parents:
diff changeset
     5
* under the terms of "Eclipse Public License v1.0"
hgs
parents:
diff changeset
     6
* which accompanies this distribution, and is available
hgs
parents:
diff changeset
     7
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
hgs
parents:
diff changeset
     8
*
hgs
parents:
diff changeset
     9
* Initial Contributors:
hgs
parents:
diff changeset
    10
* Nokia Corporation - initial contribution.
hgs
parents:
diff changeset
    11
*
hgs
parents:
diff changeset
    12
* Contributors:
hgs
parents:
diff changeset
    13
*
hgs
parents:
diff changeset
    14
* Description:  File containing application list classes
hgs
parents:
diff changeset
    15
 *
hgs
parents:
diff changeset
    16
*/
hgs
parents:
diff changeset
    17
hgs
parents:
diff changeset
    18
hgs
parents:
diff changeset
    19
//INCLUDES:
hgs
parents:
diff changeset
    20
#define __E32SVR_H__
hgs
parents:
diff changeset
    21
#include "tsfswdatalist.h"
hgs
parents:
diff changeset
    22
#include "tsfswengine.h"
hgs
parents:
diff changeset
    23
#include <mmf/common/mmfcontrollerpluginresolver.h> // for CleanupResetAndDestroyPushL
hgs
parents:
diff changeset
    24
#include <featmgr.h>
hgs
parents:
diff changeset
    25
#include <apgwgnam.h>
hgs
parents:
diff changeset
    26
#include <AknsUtils.h>
hgs
parents:
diff changeset
    27
#include <gulicon.h>
hgs
parents:
diff changeset
    28
#include <e32debug.h>
hgs
parents:
diff changeset
    29
#include <bitstd.h>
hgs
parents:
diff changeset
    30
#include <AknIconUtils.h> // avkon
hgs
parents:
diff changeset
    31
#include <APGICNFL.H> // fbsbitmap
hgs
parents:
diff changeset
    32
#include <akniconsrvclient.h> 
hgs
parents:
diff changeset
    33
hgs
parents:
diff changeset
    34
// size for the created app icons
hgs
parents:
diff changeset
    35
const TInt KAppIconWidth = 128;
hgs
parents:
diff changeset
    36
const TInt KAppIconHeight = 128;
hgs
parents:
diff changeset
    37
hgs
parents:
diff changeset
    38
//uids to be hidden
hgs
parents:
diff changeset
    39
const TUid KHsApplicationUid = {0x20022F35};
hgs
parents:
diff changeset
    40
const TUid KTelephoneUid = {0x100058B3};
hgs
parents:
diff changeset
    41
hgs
parents:
diff changeset
    42
// ================= MEMBER FUNCTIONS =======================
hgs
parents:
diff changeset
    43
hgs
parents:
diff changeset
    44
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
    45
// CTsFswDataList::NewL
hgs
parents:
diff changeset
    46
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
    47
//
hgs
parents:
diff changeset
    48
CTsFswDataList* CTsFswDataList::NewL(CTsFswEngine& aEngine)
hgs
parents:
diff changeset
    49
    {
hgs
parents:
diff changeset
    50
    CTsFswDataList* self = new (ELeave) CTsFswDataList(aEngine);
hgs
parents:
diff changeset
    51
    CleanupStack::PushL (self );
hgs
parents:
diff changeset
    52
    self->ConstructL ( );
hgs
parents:
diff changeset
    53
    CleanupStack::Pop ( self );
hgs
parents:
diff changeset
    54
    return self;
hgs
parents:
diff changeset
    55
    }
hgs
parents:
diff changeset
    56
hgs
parents:
diff changeset
    57
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
    58
// CTsFswDataList::CTsFswDataList
hgs
parents:
diff changeset
    59
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
    60
//
hgs
parents:
diff changeset
    61
CTsFswDataList::CTsFswDataList(CTsFswEngine& aEngine) :
hgs
parents:
diff changeset
    62
    iEngine(aEngine)
hgs
parents:
diff changeset
    63
    {
hgs
parents:
diff changeset
    64
    }
hgs
parents:
diff changeset
    65
hgs
parents:
diff changeset
    66
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
    67
// CTsFswDataList::~CTsFswDataList
hgs
parents:
diff changeset
    68
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
    69
//
hgs
parents:
diff changeset
    70
CTsFswDataList::~CTsFswDataList( )
hgs
parents:
diff changeset
    71
    {
hgs
parents:
diff changeset
    72
    iData.ResetAndDestroy();
hgs
parents:
diff changeset
    73
    iAppArcSession.Close();
hgs
parents:
diff changeset
    74
    iWsSession.Close();
hgs
parents:
diff changeset
    75
    iHiddenUids.Close();
hgs
parents:
diff changeset
    76
    RFbsSession::Disconnect();
hgs
parents:
diff changeset
    77
    RAknIconSrvClient::Disconnect();
hgs
parents:
diff changeset
    78
    }
hgs
parents:
diff changeset
    79
hgs
parents:
diff changeset
    80
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
    81
// CTsFswDataList::ConstructL
hgs
parents:
diff changeset
    82
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
    83
//
hgs
parents:
diff changeset
    84
void CTsFswDataList::ConstructL( )
hgs
parents:
diff changeset
    85
    {
hgs
parents:
diff changeset
    86
    User::LeaveIfError( iWsSession.Connect() );
hgs
parents:
diff changeset
    87
    User::LeaveIfError( iAppArcSession.Connect() );
hgs
parents:
diff changeset
    88
    iHiddenUids.AppendL( KHsApplicationUid );
hgs
parents:
diff changeset
    89
    iHiddenUids.AppendL( KTelephoneUid );
hgs
parents:
diff changeset
    90
    User::LeaveIfError(RFbsSession::Connect());
hgs
parents:
diff changeset
    91
    RAknIconSrvClient::Connect();
hgs
parents:
diff changeset
    92
    }
hgs
parents:
diff changeset
    93
hgs
parents:
diff changeset
    94
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
    95
// CTsFswDataList::FswDataL
hgs
parents:
diff changeset
    96
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
    97
//
hgs
parents:
diff changeset
    98
const RTsFswArray& CTsFswDataList::FswDataL()
hgs
parents:
diff changeset
    99
    {
hgs
parents:
diff changeset
   100
    // check the dirty flag and refresh if needed
hgs
parents:
diff changeset
   101
    if ( iTaskListDirty )
hgs
parents:
diff changeset
   102
        {
hgs
parents:
diff changeset
   103
        CollectTasksL();
hgs
parents:
diff changeset
   104
        // dirty flag is cleared in the above call
hgs
parents:
diff changeset
   105
        }
hgs
parents:
diff changeset
   106
hgs
parents:
diff changeset
   107
    return iData;
hgs
parents:
diff changeset
   108
    }
hgs
parents:
diff changeset
   109
hgs
parents:
diff changeset
   110
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   111
// CTsFswDataList::CollectTasksL
hgs
parents:
diff changeset
   112
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   113
//
hgs
parents:
diff changeset
   114
TBool CTsFswDataList::CollectTasksL()
hgs
parents:
diff changeset
   115
    {
hgs
parents:
diff changeset
   116
    // clear dirty flag
hgs
parents:
diff changeset
   117
    iTaskListDirty = EFalse;
hgs
parents:
diff changeset
   118
    TBool changed = EFalse;
hgs
parents:
diff changeset
   119
    
hgs
parents:
diff changeset
   120
    RTsFswArray newAppsList;
hgs
parents:
diff changeset
   121
    
hgs
parents:
diff changeset
   122
    CleanupResetAndDestroyPushL(newAppsList);
hgs
parents:
diff changeset
   123
    
hgs
parents:
diff changeset
   124
    CollectAppsL(newAppsList);
hgs
parents:
diff changeset
   125
    
hgs
parents:
diff changeset
   126
    changed |= FitDataToListL(newAppsList, EFalse);
hgs
parents:
diff changeset
   127
    
hgs
parents:
diff changeset
   128
    CleanupStack::PopAndDestroy( &newAppsList );
hgs
parents:
diff changeset
   129
    
hgs
parents:
diff changeset
   130
    return changed;
hgs
parents:
diff changeset
   131
    }
hgs
parents:
diff changeset
   132
hgs
parents:
diff changeset
   133
hgs
parents:
diff changeset
   134
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   135
// CTsFswDataList::SetDirty()
hgs
parents:
diff changeset
   136
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   137
//
hgs
parents:
diff changeset
   138
void CTsFswDataList::SetDirty()
hgs
parents:
diff changeset
   139
    {
hgs
parents:
diff changeset
   140
    iTaskListDirty = ETrue;
hgs
parents:
diff changeset
   141
    }
hgs
parents:
diff changeset
   142
hgs
parents:
diff changeset
   143
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   144
// CTsFswDataList::SetAppDataRefreshNeeded()
hgs
parents:
diff changeset
   145
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   146
//
hgs
parents:
diff changeset
   147
void CTsFswDataList::SetAppDataRefreshNeeded()
hgs
parents:
diff changeset
   148
    {
hgs
parents:
diff changeset
   149
    iAppDataRefreshNeeded = ETrue;
hgs
parents:
diff changeset
   150
    }
hgs
parents:
diff changeset
   151
hgs
parents:
diff changeset
   152
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   153
// CTsFswDataList::MoveEntryAtStart
hgs
parents:
diff changeset
   154
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   155
//
hgs
parents:
diff changeset
   156
void CTsFswDataList::MoveEntryAtStart(TInt aAppId, TBool /*aWidget*/)
hgs
parents:
diff changeset
   157
    {
hgs
parents:
diff changeset
   158
    TInt appId(0);
hgs
parents:
diff changeset
   159
    //check embeded case
hgs
parents:
diff changeset
   160
hgs
parents:
diff changeset
   161
    TInt wgId(0);
hgs
parents:
diff changeset
   162
    CApaWindowGroupName::FindByAppUid(TUid::Uid(aAppId), iWsSession, wgId);
hgs
parents:
diff changeset
   163
    TInt parentWgId = FindMostTopParentWgId( wgId );
hgs
parents:
diff changeset
   164
    if( parentWgId != KErrNotFound )
hgs
parents:
diff changeset
   165
        {
hgs
parents:
diff changeset
   166
        TUid appUid = TUid::Uid(0);
hgs
parents:
diff changeset
   167
        AppUidForWgId(parentWgId, appUid); 
hgs
parents:
diff changeset
   168
        appId = appUid.iUid;
hgs
parents:
diff changeset
   169
        }
hgs
parents:
diff changeset
   170
hgs
parents:
diff changeset
   171
    
hgs
parents:
diff changeset
   172
    if( !appId )
hgs
parents:
diff changeset
   173
    	{
hgs
parents:
diff changeset
   174
		appId = aAppId;
hgs
parents:
diff changeset
   175
    	}
hgs
parents:
diff changeset
   176
    
hgs
parents:
diff changeset
   177
    for ( TInt i = 0; i < iData.Count(); ++i )
hgs
parents:
diff changeset
   178
       {
hgs
parents:
diff changeset
   179
       if( iData[i]->AppUid().iUid == appId )
hgs
parents:
diff changeset
   180
           {
hgs
parents:
diff changeset
   181
           CTsFswEntry* entry = iData[i];
hgs
parents:
diff changeset
   182
           iData.Remove(i);
hgs
parents:
diff changeset
   183
           iData.Insert(entry, 0);
hgs
parents:
diff changeset
   184
           iOrderChanged = ETrue;
hgs
parents:
diff changeset
   185
           break;
hgs
parents:
diff changeset
   186
           }
hgs
parents:
diff changeset
   187
       }
hgs
parents:
diff changeset
   188
    }
hgs
parents:
diff changeset
   189
hgs
parents:
diff changeset
   190
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   191
// CTsFswDataList::
hgs
parents:
diff changeset
   192
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   193
//
hgs
parents:
diff changeset
   194
void CTsFswDataList::CollectAppsL(RTsFswArray& aAppsList)
hgs
parents:
diff changeset
   195
    {
hgs
parents:
diff changeset
   196
hgs
parents:
diff changeset
   197
    
hgs
parents:
diff changeset
   198
    // update app data if needed
hgs
parents:
diff changeset
   199
    // (usually on startup and when new apps might have been installed)
hgs
parents:
diff changeset
   200
    if ( iAppDataRefreshNeeded )
hgs
parents:
diff changeset
   201
        {
hgs
parents:
diff changeset
   202
hgs
parents:
diff changeset
   203
        iAppArcSession.GetAllApps();
hgs
parents:
diff changeset
   204
        iAppDataRefreshNeeded = EFalse;
hgs
parents:
diff changeset
   205
        }
hgs
parents:
diff changeset
   206
hgs
parents:
diff changeset
   207
    // get all window groups
hgs
parents:
diff changeset
   208
    RArray<RWsSession::TWindowGroupChainInfo> allWgIds;
hgs
parents:
diff changeset
   209
    CleanupClosePushL( allWgIds );
hgs
parents:
diff changeset
   210
    User::LeaveIfError( iWsSession.WindowGroupList( 0, &allWgIds ) );
hgs
parents:
diff changeset
   211
hgs
parents:
diff changeset
   212
    TInt count = allWgIds.Count();
hgs
parents:
diff changeset
   213
    for ( TInt i = 0; i < count; ++i )
hgs
parents:
diff changeset
   214
        {
hgs
parents:
diff changeset
   215
        // ignore uninteresting entries (e.g. embedded apps)
hgs
parents:
diff changeset
   216
        if ( allWgIds[i].iParentId > 0 )
hgs
parents:
diff changeset
   217
            {
hgs
parents:
diff changeset
   218
            continue;
hgs
parents:
diff changeset
   219
            }
hgs
parents:
diff changeset
   220
        
hgs
parents:
diff changeset
   221
        // get window group name
hgs
parents:
diff changeset
   222
        TInt wgId = allWgIds[i].iId;
hgs
parents:
diff changeset
   223
        CApaWindowGroupName* windowName =
hgs
parents:
diff changeset
   224
            CApaWindowGroupName::NewLC( iWsSession, wgId );
hgs
parents:
diff changeset
   225
        TUid appUid = windowName->AppUid();
hgs
parents:
diff changeset
   226
        
hgs
parents:
diff changeset
   227
        // ignore entries with null uid
hgs
parents:
diff changeset
   228
        if ( !appUid.iUid )
hgs
parents:
diff changeset
   229
            {
hgs
parents:
diff changeset
   230
            CleanupStack::PopAndDestroy( windowName );
hgs
parents:
diff changeset
   231
            continue;
hgs
parents:
diff changeset
   232
            }
hgs
parents:
diff changeset
   233
hgs
parents:
diff changeset
   234
        // add item to task list if it is not hidden
hgs
parents:
diff changeset
   235
        if ( !windowName->Hidden() && !IsHiddenUid(appUid) )
hgs
parents:
diff changeset
   236
            {
hgs
parents:
diff changeset
   237
            AddEntryL(wgId, appUid, windowName, aAppsList, EFalse);
hgs
parents:
diff changeset
   238
            }
hgs
parents:
diff changeset
   239
        CleanupStack::PopAndDestroy( windowName );
hgs
parents:
diff changeset
   240
        }
hgs
parents:
diff changeset
   241
    CleanupStack::PopAndDestroy( &allWgIds );
hgs
parents:
diff changeset
   242
    }
hgs
parents:
diff changeset
   243
hgs
parents:
diff changeset
   244
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   245
// CTsFswDataList::AddEntryL
hgs
parents:
diff changeset
   246
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   247
//
hgs
parents:
diff changeset
   248
TBool CTsFswDataList::AddEntryL( TInt aWgId, const TUid& aAppUid,
hgs
parents:
diff changeset
   249
        CApaWindowGroupName* aWgName, RTsFswArray& aNewList,
hgs
parents:
diff changeset
   250
        TBool /*aIsWidget*/ )
hgs
parents:
diff changeset
   251
    {
hgs
parents:
diff changeset
   252
    TBool changed = EFalse;
hgs
parents:
diff changeset
   253
    CTsFswEntry* entry = CTsFswEntry::NewLC();
hgs
parents:
diff changeset
   254
    entry->SetWgId( aWgId );
hgs
parents:
diff changeset
   255
    entry->SetAppUid( aAppUid );
hgs
parents:
diff changeset
   256
hgs
parents:
diff changeset
   257
    // check if present in old list and if yes then take some of the old data
hgs
parents:
diff changeset
   258
    TBool found = ConsiderOldDataL( *entry, aAppUid, changed, aNewList );
hgs
parents:
diff changeset
   259
hgs
parents:
diff changeset
   260
    // if not present previously then find out app name
hgs
parents:
diff changeset
   261
    // and check if screenshot is already available
hgs
parents:
diff changeset
   262
    if ( !found )
hgs
parents:
diff changeset
   263
        {
hgs
parents:
diff changeset
   264
        // when adding a new entry to the list it is changed for sure
hgs
parents:
diff changeset
   265
        changed = ETrue;
hgs
parents:
diff changeset
   266
        HBufC* name = FindAppNameLC( aWgName, aAppUid, aWgId );
hgs
parents:
diff changeset
   267
        if ( name )
hgs
parents:
diff changeset
   268
            {
hgs
parents:
diff changeset
   269
            entry->SetAppNameL( *name );
hgs
parents:
diff changeset
   270
            }
hgs
parents:
diff changeset
   271
        CleanupStack::PopAndDestroy( name );
hgs
parents:
diff changeset
   272
hgs
parents:
diff changeset
   273
        if ( aWgName )
hgs
parents:
diff changeset
   274
            {
hgs
parents:
diff changeset
   275
            entry->SetCloseableApp( !aWgName->IsSystem() );
hgs
parents:
diff changeset
   276
            }
hgs
parents:
diff changeset
   277
        CFbsBitmap* iconBitmap = NULL;
hgs
parents:
diff changeset
   278
        CFbsBitmap* iconMask = NULL;
hgs
parents:
diff changeset
   279
        GetAppIconL(aAppUid, iconBitmap, iconMask);    
hgs
parents:
diff changeset
   280
        //transfer ownership to entry
hgs
parents:
diff changeset
   281
        entry->SetAppIcon( iconBitmap, iconMask );        
hgs
parents:
diff changeset
   282
        }        
hgs
parents:
diff changeset
   283
hgs
parents:
diff changeset
   284
    // add to new list, ownership is transferred
hgs
parents:
diff changeset
   285
    aNewList.AppendL( entry );
hgs
parents:
diff changeset
   286
    CleanupStack::Pop( entry );
hgs
parents:
diff changeset
   287
    return changed;
hgs
parents:
diff changeset
   288
    }
hgs
parents:
diff changeset
   289
hgs
parents:
diff changeset
   290
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   291
// CTsFswDataList::ConsiderOldDataL
hgs
parents:
diff changeset
   292
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   293
//
hgs
parents:
diff changeset
   294
TBool CTsFswDataList::ConsiderOldDataL( CTsFswEntry& aEntry,
hgs
parents:
diff changeset
   295
        const TUid& aAppUid,
hgs
parents:
diff changeset
   296
        TBool& aChanged,
hgs
parents:
diff changeset
   297
        RTsFswArray& aNewList )
hgs
parents:
diff changeset
   298
    {
hgs
parents:
diff changeset
   299
    for ( TInt entryIdx = 0, oldCount = iData.Count();
hgs
parents:
diff changeset
   300
            entryIdx < oldCount; ++entryIdx )
hgs
parents:
diff changeset
   301
        {
hgs
parents:
diff changeset
   302
        // Enough to check appuid, no need to bother with wgid as the
hgs
parents:
diff changeset
   303
        // screenshot handle is up-to-date or will be updated later anyway.
hgs
parents:
diff changeset
   304
        if ( iData[entryIdx]->AppUid() == aAppUid )
hgs
parents:
diff changeset
   305
            {
hgs
parents:
diff changeset
   306
            iData[entryIdx]->SetWgId( aEntry.WgId());
hgs
parents:
diff changeset
   307
            // if positions do not match then the list is different than before
hgs
parents:
diff changeset
   308
            if ( entryIdx != aNewList.Count() )
hgs
parents:
diff changeset
   309
                {
hgs
parents:
diff changeset
   310
                aChanged = ETrue;
hgs
parents:
diff changeset
   311
                }
hgs
parents:
diff changeset
   312
            CTsFswEntry* oldEntry = iData[entryIdx];
hgs
parents:
diff changeset
   313
            aEntry.SetAppNameL( oldEntry->AppName() );            
hgs
parents:
diff changeset
   314
            aEntry.SetCloseableApp( oldEntry->CloseableApp() );
hgs
parents:
diff changeset
   315
            return ETrue;
hgs
parents:
diff changeset
   316
            }
hgs
parents:
diff changeset
   317
        }
hgs
parents:
diff changeset
   318
    return EFalse;
hgs
parents:
diff changeset
   319
    }
hgs
parents:
diff changeset
   320
hgs
parents:
diff changeset
   321
hgs
parents:
diff changeset
   322
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   323
// CTsFswDataList::FindParentWgId
hgs
parents:
diff changeset
   324
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   325
//
hgs
parents:
diff changeset
   326
TInt CTsFswDataList::FindParentWgId( TInt aWgId )
hgs
parents:
diff changeset
   327
    {
hgs
parents:
diff changeset
   328
    TInt parent( KErrNotFound );
hgs
parents:
diff changeset
   329
    RArray<RWsSession::TWindowGroupChainInfo> allWgIds;
hgs
parents:
diff changeset
   330
    // Ask for window group list from RWsSession
hgs
parents:
diff changeset
   331
    TInt error = iWsSession.WindowGroupList( 0, &allWgIds );
hgs
parents:
diff changeset
   332
    if ( !error )
hgs
parents:
diff changeset
   333
        {
hgs
parents:
diff changeset
   334
        TInt count( allWgIds.Count() );
hgs
parents:
diff changeset
   335
        for ( TInt i( 0 ); i < count; i++ )
hgs
parents:
diff changeset
   336
            {
hgs
parents:
diff changeset
   337
            RWsSession::TWindowGroupChainInfo info = allWgIds[i];
hgs
parents:
diff changeset
   338
            if ( info.iId == aWgId && info.iParentId > 0)
hgs
parents:
diff changeset
   339
                {
hgs
parents:
diff changeset
   340
                parent = info.iParentId;
hgs
parents:
diff changeset
   341
                break;
hgs
parents:
diff changeset
   342
                }
hgs
parents:
diff changeset
   343
            }
hgs
parents:
diff changeset
   344
        }
hgs
parents:
diff changeset
   345
    allWgIds.Close();
hgs
parents:
diff changeset
   346
    return parent;
hgs
parents:
diff changeset
   347
    }
hgs
parents:
diff changeset
   348
hgs
parents:
diff changeset
   349
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   350
// CTsFswDataList::FindMostTopParentWgId
hgs
parents:
diff changeset
   351
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   352
//
hgs
parents:
diff changeset
   353
TInt CTsFswDataList::FindMostTopParentWgId( TInt aWgId )
hgs
parents:
diff changeset
   354
    {
hgs
parents:
diff changeset
   355
    TInt parent( KErrNotFound );
hgs
parents:
diff changeset
   356
    parent = FindParentWgId( aWgId );
hgs
parents:
diff changeset
   357
    if( parent != KErrNotFound)
hgs
parents:
diff changeset
   358
        {
hgs
parents:
diff changeset
   359
        TInt topParent = FindMostTopParentWgId(parent);
hgs
parents:
diff changeset
   360
        if( topParent != KErrNotFound )
hgs
parents:
diff changeset
   361
            {
hgs
parents:
diff changeset
   362
            parent = topParent;
hgs
parents:
diff changeset
   363
            }
hgs
parents:
diff changeset
   364
        }
hgs
parents:
diff changeset
   365
    return parent;
hgs
parents:
diff changeset
   366
    }
hgs
parents:
diff changeset
   367
hgs
parents:
diff changeset
   368
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   369
// CTsFswDataList::FindAppNameLC
hgs
parents:
diff changeset
   370
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   371
//
hgs
parents:
diff changeset
   372
HBufC* CTsFswDataList::FindAppNameLC( CApaWindowGroupName* aWindowName,
hgs
parents:
diff changeset
   373
                                  const TUid& aAppUid,
hgs
parents:
diff changeset
   374
                                  TInt aWgId )
hgs
parents:
diff changeset
   375
    {
hgs
parents:
diff changeset
   376
    //Retrieve the app name
hgs
parents:
diff changeset
   377
    TApaAppInfo info;
hgs
parents:
diff changeset
   378
    iAppArcSession.GetAppInfo( info, aAppUid );
hgs
parents:
diff changeset
   379
    TPtrC caption = info.iShortCaption;
hgs
parents:
diff changeset
   380
hgs
parents:
diff changeset
   381
    HBufC* tempName = 0;
hgs
parents:
diff changeset
   382
    if ( !caption.Length() && aWindowName ) // if not set - use thread name instead
hgs
parents:
diff changeset
   383
        {
hgs
parents:
diff changeset
   384
        if ( aWindowName->Caption().Length() )
hgs
parents:
diff changeset
   385
            {
hgs
parents:
diff changeset
   386
            tempName = aWindowName->Caption().AllocL();
hgs
parents:
diff changeset
   387
            //put on cleanupstack after the if
hgs
parents:
diff changeset
   388
            }
hgs
parents:
diff changeset
   389
        else
hgs
parents:
diff changeset
   390
            {
hgs
parents:
diff changeset
   391
            TThreadId threadId;
hgs
parents:
diff changeset
   392
            TInt err = iWsSession.GetWindowGroupClientThreadId(
hgs
parents:
diff changeset
   393
                    aWgId, threadId );
hgs
parents:
diff changeset
   394
            if ( err == KErrNone )
hgs
parents:
diff changeset
   395
                {
hgs
parents:
diff changeset
   396
                RThread thread;
hgs
parents:
diff changeset
   397
                CleanupClosePushL( thread );
hgs
parents:
diff changeset
   398
                err = thread.Open ( threadId );
hgs
parents:
diff changeset
   399
                if ( err==KErrNone )
hgs
parents:
diff changeset
   400
                    {
hgs
parents:
diff changeset
   401
                    tempName = thread.Name().AllocL(); // codescanner::forgottoputptroncleanupstack
hgs
parents:
diff changeset
   402
                    // tempName put on cleanupstack after the if
hgs
parents:
diff changeset
   403
                    }
hgs
parents:
diff changeset
   404
                CleanupStack::PopAndDestroy( &thread );
hgs
parents:
diff changeset
   405
                }
hgs
parents:
diff changeset
   406
            }
hgs
parents:
diff changeset
   407
        }
hgs
parents:
diff changeset
   408
    else
hgs
parents:
diff changeset
   409
        {
hgs
parents:
diff changeset
   410
        tempName = caption.AllocL();
hgs
parents:
diff changeset
   411
        //put on cleanupstack after the if
hgs
parents:
diff changeset
   412
        }
hgs
parents:
diff changeset
   413
    CleanupStack::PushL( tempName );
hgs
parents:
diff changeset
   414
    return tempName;
hgs
parents:
diff changeset
   415
    }
hgs
parents:
diff changeset
   416
hgs
parents:
diff changeset
   417
hgs
parents:
diff changeset
   418
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   419
// CTsFswDataList::FitDataToListL
hgs
parents:
diff changeset
   420
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   421
//
hgs
parents:
diff changeset
   422
TBool CTsFswDataList::FitDataToListL(RTsFswArray& aListToFit,
hgs
parents:
diff changeset
   423
        TBool /*aConsiderWidgets*/)
hgs
parents:
diff changeset
   424
    {
hgs
parents:
diff changeset
   425
    TBool changed = EFalse;
hgs
parents:
diff changeset
   426
    TInt listCount = aListToFit.Count();
hgs
parents:
diff changeset
   427
    TInt dataCount = iData.Count();
hgs
parents:
diff changeset
   428
    
hgs
parents:
diff changeset
   429
hgs
parents:
diff changeset
   430
    //remove items that dont't exists in newly collected list      
hgs
parents:
diff changeset
   431
    for (TInt i = dataCount -1; i >= 0; --i)
hgs
parents:
diff changeset
   432
          {
hgs
parents:
diff changeset
   433
          if ( !CheckIfExists(*iData[i], aListToFit) )
hgs
parents:
diff changeset
   434
              {
hgs
parents:
diff changeset
   435
              delete iData[i];
hgs
parents:
diff changeset
   436
              iData.Remove(i);
hgs
parents:
diff changeset
   437
              changed = ETrue;
hgs
parents:
diff changeset
   438
              }
hgs
parents:
diff changeset
   439
          }
hgs
parents:
diff changeset
   440
      
hgs
parents:
diff changeset
   441
    //add new item at start
hgs
parents:
diff changeset
   442
    //for (TInt i = 0; i < aListToFit.Count(); ++i)
hgs
parents:
diff changeset
   443
    for (TInt i = aListToFit.Count()-1; i >= 0; --i)
hgs
parents:
diff changeset
   444
        {
hgs
parents:
diff changeset
   445
        if (!CheckIfExists(*aListToFit[i], iData))
hgs
parents:
diff changeset
   446
            {
hgs
parents:
diff changeset
   447
            iData.Insert(aListToFit[i], 0);
hgs
parents:
diff changeset
   448
            aListToFit[i] = 0;
hgs
parents:
diff changeset
   449
            changed = ETrue;
hgs
parents:
diff changeset
   450
            }
hgs
parents:
diff changeset
   451
        }
hgs
parents:
diff changeset
   452
    changed = changed || iOrderChanged;
hgs
parents:
diff changeset
   453
    iOrderChanged = EFalse;
hgs
parents:
diff changeset
   454
    return changed;
hgs
parents:
diff changeset
   455
    }
hgs
parents:
diff changeset
   456
hgs
parents:
diff changeset
   457
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   458
// CTsFswDataList::CheckIfExists
hgs
parents:
diff changeset
   459
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   460
//
hgs
parents:
diff changeset
   461
TBool CTsFswDataList::CheckIfExists(const CTsFswEntry& aEntry,
hgs
parents:
diff changeset
   462
        const RTsFswArray& aList) const
hgs
parents:
diff changeset
   463
    {
hgs
parents:
diff changeset
   464
    TBool exists(EFalse);
hgs
parents:
diff changeset
   465
    TInt dataCount = aList.Count();
hgs
parents:
diff changeset
   466
    for (TInt entryIdx = 0; entryIdx < dataCount; ++entryIdx)
hgs
parents:
diff changeset
   467
        {
hgs
parents:
diff changeset
   468
        if (aList[entryIdx]->AppUid() == aEntry.AppUid())
hgs
parents:
diff changeset
   469
            {
hgs
parents:
diff changeset
   470
            exists = ETrue;
hgs
parents:
diff changeset
   471
            break;
hgs
parents:
diff changeset
   472
            }
hgs
parents:
diff changeset
   473
        }
hgs
parents:
diff changeset
   474
    return exists;
hgs
parents:
diff changeset
   475
    }
hgs
parents:
diff changeset
   476
hgs
parents:
diff changeset
   477
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   478
// CTsFswDataList::AppUidForWgId
hgs
parents:
diff changeset
   479
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   480
//
hgs
parents:
diff changeset
   481
TInt CTsFswDataList::AppUidForWgId( TInt aWgId, TUid& aUid )
hgs
parents:
diff changeset
   482
    {
hgs
parents:
diff changeset
   483
	TRAPD(err, aUid = AppUidForWgIdL( aWgId ) );
hgs
parents:
diff changeset
   484
	return err;
hgs
parents:
diff changeset
   485
    }
hgs
parents:
diff changeset
   486
hgs
parents:
diff changeset
   487
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   488
// CTsFswDataList::AppUidForWgIdL
hgs
parents:
diff changeset
   489
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   490
//
hgs
parents:
diff changeset
   491
TUid CTsFswDataList::AppUidForWgIdL( TInt aWgId )
hgs
parents:
diff changeset
   492
    {
hgs
parents:
diff changeset
   493
    CApaWindowGroupName* windowName =
hgs
parents:
diff changeset
   494
        CApaWindowGroupName::NewLC( iWsSession, aWgId );
hgs
parents:
diff changeset
   495
    TUid appUid = windowName->AppUid();
hgs
parents:
diff changeset
   496
    CleanupStack::PopAndDestroy( windowName );
hgs
parents:
diff changeset
   497
    return appUid;
hgs
parents:
diff changeset
   498
    }
hgs
parents:
diff changeset
   499
hgs
parents:
diff changeset
   500
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   501
// CTsFswDataList::GetAppIconL
hgs
parents:
diff changeset
   502
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   503
//
hgs
parents:
diff changeset
   504
void CTsFswDataList::GetAppIconL( const TUid& aAppUid,
hgs
parents:
diff changeset
   505
        CFbsBitmap*& aBitmap, CFbsBitmap*& aMask )
hgs
parents:
diff changeset
   506
    {
hgs
parents:
diff changeset
   507
    aBitmap = aMask = NULL;
hgs
parents:
diff changeset
   508
hgs
parents:
diff changeset
   509
    TSize size( KAppIconWidth, KAppIconHeight );
hgs
parents:
diff changeset
   510
    CApaMaskedBitmap* apaMaskedBitmap = CApaMaskedBitmap::NewLC();
hgs
parents:
diff changeset
   511
    TInt err = iAppArcSession.GetAppIcon( aAppUid, size, *apaMaskedBitmap );
hgs
parents:
diff changeset
   512
    TInt iconsCount(0);
hgs
parents:
diff changeset
   513
    if ( err == KErrNone )
hgs
parents:
diff changeset
   514
        {
hgs
parents:
diff changeset
   515
        err = iAppArcSession.NumberOfOwnDefinedIcons(aAppUid, iconsCount);
hgs
parents:
diff changeset
   516
        }
hgs
parents:
diff changeset
   517
    
hgs
parents:
diff changeset
   518
    if ( (err == KErrNone) && (iconsCount>0) )
hgs
parents:
diff changeset
   519
        {
hgs
parents:
diff changeset
   520
        aBitmap = static_cast<CFbsBitmap*>(apaMaskedBitmap);
hgs
parents:
diff changeset
   521
        TInt maskHandle = apaMaskedBitmap->Mask()->Handle();
hgs
parents:
diff changeset
   522
        aMask = new (ELeave) CFbsBitmap;
hgs
parents:
diff changeset
   523
        aMask->Duplicate( maskHandle );
hgs
parents:
diff changeset
   524
        CleanupStack::Pop( apaMaskedBitmap );
hgs
parents:
diff changeset
   525
        }
hgs
parents:
diff changeset
   526
    else
hgs
parents:
diff changeset
   527
        {
hgs
parents:
diff changeset
   528
        CleanupStack::PopAndDestroy( apaMaskedBitmap );
hgs
parents:
diff changeset
   529
        HBufC* fileNameFromApparc = NULL;
hgs
parents:
diff changeset
   530
        TInt err = iAppArcSession.GetAppIcon(aAppUid,fileNameFromApparc);        
hgs
parents:
diff changeset
   531
        if ( err == KErrNone ) 
hgs
parents:
diff changeset
   532
            {
hgs
parents:
diff changeset
   533
            CleanupStack::PushL(fileNameFromApparc);
hgs
parents:
diff changeset
   534
            CFbsBitmap *bitamp(0);
hgs
parents:
diff changeset
   535
            CFbsBitmap *mask(0);
hgs
parents:
diff changeset
   536
            TInt bitmapIndex = 0;
hgs
parents:
diff changeset
   537
            TInt maskIndex = 1;    
hgs
parents:
diff changeset
   538
            // it will change bitmap ids if it is mif (checking inside)
hgs
parents:
diff changeset
   539
            AknIconUtils::ValidateLogicalAppIconId( *fileNameFromApparc, bitmapIndex, maskIndex );
hgs
parents:
diff changeset
   540
            AknIconUtils::CreateIconLC( bitamp, mask, fileNameFromApparc->Des(), bitmapIndex, maskIndex );
hgs
parents:
diff changeset
   541
hgs
parents:
diff changeset
   542
            if (AknIconUtils::IsMifFile(*fileNameFromApparc)) \
hgs
parents:
diff changeset
   543
                {
hgs
parents:
diff changeset
   544
                AknIconUtils::DisableCompression(bitamp);
hgs
parents:
diff changeset
   545
                AknIconUtils::SetSize(bitamp, TSize(KAppIconWidth, KAppIconHeight), EAspectRatioPreservedAndUnusedSpaceRemoved);                                
hgs
parents:
diff changeset
   546
                // bitmap and icon, AknsUtils::CreateIconLC doesn't specify the order
hgs
parents:
diff changeset
   547
                CleanupStack::Pop(2);                  
hgs
parents:
diff changeset
   548
                aBitmap = bitamp;
hgs
parents:
diff changeset
   549
                aMask = mask;
hgs
parents:
diff changeset
   550
                }
hgs
parents:
diff changeset
   551
            else
hgs
parents:
diff changeset
   552
                {
hgs
parents:
diff changeset
   553
                CleanupStack::PopAndDestroy(2);                       
hgs
parents:
diff changeset
   554
                }
hgs
parents:
diff changeset
   555
            CleanupStack::PopAndDestroy(fileNameFromApparc);
hgs
parents:
diff changeset
   556
            }
hgs
parents:
diff changeset
   557
        }
hgs
parents:
diff changeset
   558
    }
hgs
parents:
diff changeset
   559
hgs
parents:
diff changeset
   560
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   561
// CTsFswDataList::GetAppIconL
hgs
parents:
diff changeset
   562
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   563
//
hgs
parents:
diff changeset
   564
TBool CTsFswDataList::IsHiddenUid( TUid aUid )
hgs
parents:
diff changeset
   565
    {
hgs
parents:
diff changeset
   566
    TInt result = iHiddenUids.Find( aUid );
hgs
parents:
diff changeset
   567
    return result >= 0 ? ETrue : EFalse;
hgs
parents:
diff changeset
   568
    }
hgs
parents:
diff changeset
   569
hgs
parents:
diff changeset
   570
// end of file