tstaskmonitor/server/src/tsfswengine.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:  Task monitor engine
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
#include "tsfswengine.h"
hgs
parents:
diff changeset
    20
hgs
parents:
diff changeset
    21
#include "tsfswdatalist.h"
hgs
parents:
diff changeset
    22
hgs
parents:
diff changeset
    23
hgs
parents:
diff changeset
    24
hgs
parents:
diff changeset
    25
hgs
parents:
diff changeset
    26
#include <apgtask.h>
hgs
parents:
diff changeset
    27
#include <AknDef.h>
hgs
parents:
diff changeset
    28
#include <apgwgnam.h>
hgs
parents:
diff changeset
    29
#include <mmf/common/mmfcontrollerpluginresolver.h> // for CleanupResetAndDestroyPushL
hgs
parents:
diff changeset
    30
#include <featmgr.h>
hgs
parents:
diff changeset
    31
#include <swi/swispubsubdefs.h>
hgs
parents:
diff changeset
    32
#include <s32mem.h>
hgs
parents:
diff changeset
    33
#include <bitmaptransforms.h>
hgs
parents:
diff changeset
    34
hgs
parents:
diff changeset
    35
// time to wait before refreshing content
hgs
parents:
diff changeset
    36
const TInt KContentRefreshDelay = 50000; // 0.05 sec
hgs
parents:
diff changeset
    37
hgs
parents:
diff changeset
    38
hgs
parents:
diff changeset
    39
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
    40
// CTsFswEngine::NewL
hgs
parents:
diff changeset
    41
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
    42
//
hgs
parents:
diff changeset
    43
CTsFswEngine* CTsFswEngine::NewL( MHsDataObserver& aObserver )
hgs
parents:
diff changeset
    44
    {
hgs
parents:
diff changeset
    45
    CTsFswEngine* self = NewLC( aObserver );
hgs
parents:
diff changeset
    46
    CleanupStack::Pop( self );
hgs
parents:
diff changeset
    47
    return self;
hgs
parents:
diff changeset
    48
    }
hgs
parents:
diff changeset
    49
hgs
parents:
diff changeset
    50
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
    51
// CTsFswEngine::NewLC
hgs
parents:
diff changeset
    52
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
    53
//
hgs
parents:
diff changeset
    54
CTsFswEngine* CTsFswEngine::NewLC( MHsDataObserver& aObserver )
hgs
parents:
diff changeset
    55
    {
hgs
parents:
diff changeset
    56
    CTsFswEngine* self = new ( ELeave ) CTsFswEngine( aObserver );
hgs
parents:
diff changeset
    57
    CleanupStack::PushL( self );
hgs
parents:
diff changeset
    58
    self->ConstructL();
hgs
parents:
diff changeset
    59
    return self;
hgs
parents:
diff changeset
    60
    }
hgs
parents:
diff changeset
    61
hgs
parents:
diff changeset
    62
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
    63
// CTsFswEngine::CTsFswEngine
hgs
parents:
diff changeset
    64
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
    65
//
hgs
parents:
diff changeset
    66
CTsFswEngine::CTsFswEngine( MHsDataObserver& aObserver )
hgs
parents:
diff changeset
    67
        :iObserver( aObserver )
hgs
parents:
diff changeset
    68
    {
hgs
parents:
diff changeset
    69
    }
hgs
parents:
diff changeset
    70
hgs
parents:
diff changeset
    71
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
    72
// CTsFswEngine::ConstructL
hgs
parents:
diff changeset
    73
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
    74
//
hgs
parents:
diff changeset
    75
void CTsFswEngine::ConstructL()
hgs
parents:
diff changeset
    76
    {
hgs
parents:
diff changeset
    77
    User::LeaveIfError( iWsSession.Connect() );
hgs
parents:
diff changeset
    78
    User::LeaveIfError( iAppArcSession.Connect() );
hgs
parents:
diff changeset
    79
hgs
parents:
diff changeset
    80
    iDataList = CTsFswDataList::NewL(*this);    
hgs
parents:
diff changeset
    81
hgs
parents:
diff changeset
    82
    // get an initial list of tasks
hgs
parents:
diff changeset
    83
    iDataList->SetAppDataRefreshNeeded();
hgs
parents:
diff changeset
    84
    CollectTasksL();
hgs
parents:
diff changeset
    85
hgs
parents:
diff changeset
    86
    iUpdateStarter = CPeriodic::NewL( CActive::EPriorityStandard );   
hgs
parents:
diff changeset
    87
    }
hgs
parents:
diff changeset
    88
hgs
parents:
diff changeset
    89
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
    90
// CTsFswEngine::~CTsFswEngine
hgs
parents:
diff changeset
    91
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
    92
//
hgs
parents:
diff changeset
    93
CTsFswEngine::~CTsFswEngine()
hgs
parents:
diff changeset
    94
    {
hgs
parents:
diff changeset
    95
hgs
parents:
diff changeset
    96
    delete iUpdateStarter;
hgs
parents:
diff changeset
    97
hgs
parents:
diff changeset
    98
    iWgIds.Close();
hgs
parents:
diff changeset
    99
hgs
parents:
diff changeset
   100
    iAppArcSession.Close();
hgs
parents:
diff changeset
   101
    iWsSession.Close();
hgs
parents:
diff changeset
   102
hgs
parents:
diff changeset
   103
    delete iDataList;
hgs
parents:
diff changeset
   104
    }
hgs
parents:
diff changeset
   105
hgs
parents:
diff changeset
   106
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   107
// CTsFswEngine::FswDataL
hgs
parents:
diff changeset
   108
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   109
//
hgs
parents:
diff changeset
   110
const RTsFswArray& CTsFswEngine::FswDataL()
hgs
parents:
diff changeset
   111
    {
hgs
parents:
diff changeset
   112
    return iDataList->FswDataL();
hgs
parents:
diff changeset
   113
    }
hgs
parents:
diff changeset
   114
hgs
parents:
diff changeset
   115
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   116
// CTsFswEngine::UpdateTaskList
hgs
parents:
diff changeset
   117
// Callback from appui
hgs
parents:
diff changeset
   118
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   119
//
hgs
parents:
diff changeset
   120
void CTsFswEngine::UpdateTaskList()
hgs
parents:
diff changeset
   121
    {
hgs
parents:
diff changeset
   122
    // There can be many calls in a row, use a timer to prevent degrading
hgs
parents:
diff changeset
   123
    // device performance.
hgs
parents:
diff changeset
   124
    iDataList->SetDirty();
hgs
parents:
diff changeset
   125
    if ( !iUpdateStarter->IsActive() )
hgs
parents:
diff changeset
   126
        {
hgs
parents:
diff changeset
   127
        iUpdateStarter->Start( KContentRefreshDelay, 0,
hgs
parents:
diff changeset
   128
                TCallBack( UpdateStarterCallback, this ) );
hgs
parents:
diff changeset
   129
        }    
hgs
parents:
diff changeset
   130
    // get the foreground app uid and publish it to CFW if different than before
hgs
parents:
diff changeset
   131
    TRAP_IGNORE( PublishFgAppUidL() );
hgs
parents:
diff changeset
   132
    }
hgs
parents:
diff changeset
   133
hgs
parents:
diff changeset
   134
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   135
// CTsFswEngine::UpdateStarterCallback
hgs
parents:
diff changeset
   136
// Callback for the timer
hgs
parents:
diff changeset
   137
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   138
//
hgs
parents:
diff changeset
   139
TInt CTsFswEngine::UpdateStarterCallback( TAny* aParam )
hgs
parents:
diff changeset
   140
    {
hgs
parents:
diff changeset
   141
    CTsFswEngine* self = static_cast<CTsFswEngine*>( aParam );
hgs
parents:
diff changeset
   142
    self->iUpdateStarter->Cancel();
hgs
parents:
diff changeset
   143
    // get list of tasks and notify observer if there is a change in the list
hgs
parents:
diff changeset
   144
    TBool changed = EFalse;
hgs
parents:
diff changeset
   145
    TRAPD( err, changed = self->CollectTasksL() );
hgs
parents:
diff changeset
   146
    if ( err == KErrNone && changed )
hgs
parents:
diff changeset
   147
        {
hgs
parents:
diff changeset
   148
        self->iObserver.DataChanged();
hgs
parents:
diff changeset
   149
        }
hgs
parents:
diff changeset
   150
    return 0;
hgs
parents:
diff changeset
   151
    }
hgs
parents:
diff changeset
   152
hgs
parents:
diff changeset
   153
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   154
// CTsFswEngine::CollectTasksL
hgs
parents:
diff changeset
   155
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   156
//
hgs
parents:
diff changeset
   157
TBool CTsFswEngine::CollectTasksL()
hgs
parents:
diff changeset
   158
    {
hgs
parents:
diff changeset
   159
    TBool changed = iDataList->CollectTasksL();
hgs
parents:
diff changeset
   160
    return changed;
hgs
parents:
diff changeset
   161
    }
hgs
parents:
diff changeset
   162
hgs
parents:
diff changeset
   163
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   164
// CTsFswEngine::ForegroundAppUidL
hgs
parents:
diff changeset
   165
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   166
//
hgs
parents:
diff changeset
   167
TUid CTsFswEngine::ForegroundAppUidL( TInt aType )
hgs
parents:
diff changeset
   168
    {
hgs
parents:
diff changeset
   169
    // Do not use GetFocusWindowGroup or others.
hgs
parents:
diff changeset
   170
    // We want to see only "real" application uids in FgApp,
hgs
parents:
diff changeset
   171
    // i.e. stuff that would also be shown in the task swapper
hgs
parents:
diff changeset
   172
    // area of Taskswitcher.
hgs
parents:
diff changeset
   173
hgs
parents:
diff changeset
   174
    TUid result = KNullUid;
hgs
parents:
diff changeset
   175
    RArray<RWsSession::TWindowGroupChainInfo> allWgIds;
hgs
parents:
diff changeset
   176
    CleanupClosePushL( allWgIds );
hgs
parents:
diff changeset
   177
    User::LeaveIfError( iWsSession.WindowGroupList( 0, &allWgIds ) );
hgs
parents:
diff changeset
   178
    TInt count = allWgIds.Count();
hgs
parents:
diff changeset
   179
    for ( TInt i = 0; i < count; ++i )
hgs
parents:
diff changeset
   180
        {
hgs
parents:
diff changeset
   181
        // Depending on aType we may not need to bother with iParentId here.
hgs
parents:
diff changeset
   182
        // If aType == EUseEmbeddedUid => embedded apps are treated as others.
hgs
parents:
diff changeset
   183
        // If aType == EUseStandaloneUid => embedded apps must be ignored.
hgs
parents:
diff changeset
   184
        if ( allWgIds[i].iParentId > 0
hgs
parents:
diff changeset
   185
                && aType == CTsFswEngine::EUseStandaloneUid )
hgs
parents:
diff changeset
   186
            {
hgs
parents:
diff changeset
   187
            continue;
hgs
parents:
diff changeset
   188
            }
hgs
parents:
diff changeset
   189
hgs
parents:
diff changeset
   190
        CApaWindowGroupName* wgn = CApaWindowGroupName::NewLC(
hgs
parents:
diff changeset
   191
            iWsSession, allWgIds[i].iId );
hgs
parents:
diff changeset
   192
        TUid newUid = wgn->AppUid();
hgs
parents:
diff changeset
   193
        TBool hidden = wgn->Hidden();
hgs
parents:
diff changeset
   194
        CleanupStack::PopAndDestroy( wgn );
hgs
parents:
diff changeset
   195
hgs
parents:
diff changeset
   196
        if ( !hidden && newUid.iUid && !iDataList->IsHiddenUid(newUid) )
hgs
parents:
diff changeset
   197
            {
hgs
parents:
diff changeset
   198
            result = newUid;
hgs
parents:
diff changeset
   199
            break;
hgs
parents:
diff changeset
   200
            }
hgs
parents:
diff changeset
   201
        }
hgs
parents:
diff changeset
   202
    CleanupStack::PopAndDestroy( &allWgIds );
hgs
parents:
diff changeset
   203
    
hgs
parents:
diff changeset
   204
    return result;
hgs
parents:
diff changeset
   205
    }
hgs
parents:
diff changeset
   206
hgs
parents:
diff changeset
   207
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   208
// CTsFswEngine::PublishFgAppUidL
hgs
parents:
diff changeset
   209
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   210
//
hgs
parents:
diff changeset
   211
void CTsFswEngine::PublishFgAppUidL()
hgs
parents:
diff changeset
   212
    {
hgs
parents:
diff changeset
   213
    TUid newUid = ForegroundAppUidL( CTsFswEngine::EUseEmbeddedUid );
hgs
parents:
diff changeset
   214
    if ( iFgAppUid != newUid && newUid.iUid )
hgs
parents:
diff changeset
   215
        {
hgs
parents:
diff changeset
   216
        iFgAppUid = newUid;
hgs
parents:
diff changeset
   217
        iDataList->MoveEntryAtStart(newUid.iUid, EFalse);
hgs
parents:
diff changeset
   218
        }
hgs
parents:
diff changeset
   219
    }
hgs
parents:
diff changeset
   220
hgs
parents:
diff changeset
   221
// end of file