taskswitcher/backstepping/src/tsbackstepping.cpp
changeset 124 e36b2f4799c0
parent 121 0b3699f6c654
child 125 26079c1bb561
--- a/taskswitcher/backstepping/src/tsbackstepping.cpp	Fri Sep 17 08:32:18 2010 +0300
+++ b/taskswitcher/backstepping/src/tsbackstepping.cpp	Mon Oct 04 00:38:31 2010 +0300
@@ -29,12 +29,17 @@
 
 #include "tsbacksteppingfilter.h"
 
+/**
+ * String to switch hsapplication to IDLE state using activity framework
+ */
 _LIT(KHsActivactionUri, "appto://20022F35?activityname=HsIdleView&activityinbackground=true");
 
 // -----------------------------------------------------------------------------
 /** 
- *  CTsBackstepping::NewL
- *  two phase constructor
+ *  Symbian two-phases constructor. Allocate create and initialize backstepping engine
+ *  Instance is pushed int cleanup stack.
+ *  @param aMonitor - window group changes monitor
+ *  @return address to backstepping engine
  */
 CTsBackstepping* CTsBackstepping::NewL( MTsWindowGroupsMonitor& aMonitor )
     {
@@ -45,8 +50,9 @@
 
 // -----------------------------------------------------------------------------
 /** 
- *  CTsBackstepping::NewLC
- *  two phase constructor
+ *  Symbian two-phases constructor. Allocate create and initialize backstepping engine
+ *  @param aMonitor - window group changes monitor
+ *  @return address to backstepping engine
  */
 CTsBackstepping* CTsBackstepping::NewLC( MTsWindowGroupsMonitor& aMonitor )
     { 
@@ -58,12 +64,12 @@
 
 // -----------------------------------------------------------------------------
 /** 
- * CTsBackstepping::CTsBackstepping
- * constructor
+ * Constructor.
+ * @param aMonitor - window group changes monitor
  */
 CTsBackstepping::CTsBackstepping( MTsWindowGroupsMonitor &aMonitor )
 :
-CTsWindowGroupsObserver( aMonitor )
+CTsWindowGroupsObserver( aMonitor ), iHsWasFirst(ETrue)
     {
     }
 
@@ -79,8 +85,9 @@
 
 // -----------------------------------------------------------------------------
 /** 
- *  CTsBackstepping::ConstructL
- *  two phase constructor
+ *  Symbian second-phase constructor. 
+ *  Subscribe to window group monitor events (using BaseConstructL) and allocate
+ *  filtering list
  */
 void CTsBackstepping::ConstructL ()
     {
@@ -89,48 +96,50 @@
     }
 
 // -----------------------------------------------------------------------------
-/** 
- * CTsBackstepping::AnalyseWindowStackL
- * Analyzes window stack and move homescreen to proper position
+/**
+ * Analyzes window stack and move homescreen to proper position 
+ * Interface implementation.
+ * @see MTsWindowGroupsObserver::HandleWindowGroupChanged
  */
 void CTsBackstepping::HandleWindowGroupChanged( 
-               MTsResourceManager &aResource, 
-               const TArray<RWsSession::TWindowGroupChainInfo> &aWindowGroups )
+                                MTsResourceManager &aResources, 
+                                const MTsRunningApplicationStorage& aStorage )
+
     {
     RDebug::Print(_L("[Backstepping] started"));
-    TRAP_IGNORE( HandleWindowGroupChangedL( aResource, aWindowGroups ) );
+    TRAP_IGNORE( HandleWindowGroupChangedL( aResources, aStorage ) );
     RDebug::Print(_L("[Backstepping] finished"));
     }
 
 // -----------------------------------------------------------------------------
 /** 
- * CTsBackstepping::AnalyseWindowStackL
  * Analyzes window stack and move homescreen to proper position
+ * @see MTsWindowGroupsObserver::HandleWindowGroupChanged from param info
  */
 void CTsBackstepping::HandleWindowGroupChangedL( 
-                MTsResourceManager& aResource,
-                const TArray<RWsSession::TWindowGroupChainInfo>& aWindowGroups )
+                                 MTsResourceManager &aResources, 
+                                 const MTsRunningApplicationStorage& aStorage )
     {
     // calculate the desired position of Homescreen
-    const TInt currentHsOffset( HomescreenOffsetL( aResource, aWindowGroups ) );
+    const TInt currentHsOffset( HomescreenOffsetL( aStorage ) );
     TInt optimalOffset(1);
     TInt targetHsOffset(currentHsOffset);
+    TBool isFirst(ETrue);
     for( TInt offset(0); offset < currentHsOffset; ++offset ) 
         {
-        TUid uid = GetUidFromWindowGroupL( aResource, 
-                                           aWindowGroups[offset].iId );
-        RDebug::Print(_L("[Backstepping] application: %d"), uid.iUid);
-                                           
-        if( TUid::Null() != uid )
+        RDebug::Print( _L("[Backstepping] application: %08x"), 
+                       aStorage[offset].UidL().iUid );
+        if( TUid::Null() != aStorage[offset].UidL() )
             {
-            if( IsEmbededApp( aWindowGroups[offset] ) )
+            isFirst = EFalse;
+            if( aStorage[offset].IsEmbeded())
                 {
-                targetHsOffset = ParentOffsetL( offset, aWindowGroups ) + 1;
+                targetHsOffset = aStorage.ParentIndex(aStorage[offset])+ 1;
                 } 
-            else if (!iFilter->isBlocked(uid))
+            else if (!iFilter->isBlocked( aStorage[offset].UidL() ))
                 {
                 if(offset + 1 < currentHsOffset && 
-                   GetUidFromWindowGroupL( aResource, aWindowGroups[offset+1].iId) == TUid::Null() ) 
+                   aStorage[offset+1].UidL() == TUid::Null() ) 
                     {
                     ++optimalOffset;
                     }
@@ -143,48 +152,30 @@
             ++optimalOffset;
             }
         }
-
-    // switch Homescreen to Idle state if Homescreen is not in foreground and is in different state
-    if( 0 != targetHsOffset)
-        {
-        TInt hsState( EHomeScreenIdleState );
-        User::LeaveIfError(RProperty::Get( KHsCategoryUid, 
-                                           KHsCategoryStateKey, 
-                                           hsState ) );
-        if(!(hsState & EHomeScreenWidgetViewActive ) )
-            {
-            RDebug::Print(_L("[Backstepping] about to switch HS activity"));
-            
-            CAfActivityLauncher *activityEnabler = 
-                CAfActivityLauncher::NewLC( aResource.ApaSession(), 
-                                            aResource.WsSession() );
-            activityEnabler->launchActivityL( KHsActivactionUri );
-            CleanupStack::PopAndDestroy( activityEnabler );
-            }
-        }
+    SwitchToIdleStateL(aResources, isFirst);
     // change windows order if necessary
     if(targetHsOffset != currentHsOffset)
         {
         RDebug::Print(_L("[Backstepping] about to change window groups order"));
-        
-        const TInt hsWindowGroup( aWindowGroups[currentHsOffset].iId );
-        aResource.WsSession().SetWindowGroupOrdinalPosition( hsWindowGroup, 
-                                                             targetHsOffset );
+        aResources.WsSession().SetWindowGroupOrdinalPosition( 
+                                    aStorage[currentHsOffset].WindowGroupId(), 
+                                    targetHsOffset );
         }
     }
 
 // -----------------------------------------------------------------------------
 /** 
- * CTsBackstepping::HomescreenOffsetL
+ * Find and return current position of hsapplication on window server stack
+ * @param aStorage - storage with running app info
+ * @return position of hsapplication on window server stack
  */
 TInt CTsBackstepping::HomescreenOffsetL( 
-        MTsResourceManager& aResource,
-        const TArray<RWsSession::TWindowGroupChainInfo>& aWindowGroups ) const 
+                        const MTsRunningApplicationStorage& aStorage ) const 
     {
     TInt offset( KErrNotFound );
-    for( TInt iter(0); KErrNotFound == offset && iter < aWindowGroups.Count(); ++iter )
+    for( TInt iter(0); KErrNotFound == offset && iter < aStorage.Count(); ++iter )
         {
-        if( KHsCategoryUid == GetUidFromWindowGroupL( aResource, aWindowGroups[iter].iId ) )
+        if( KHsCategoryUid == aStorage[iter].UidL() )
             {
             offset = iter;
             }
@@ -194,49 +185,32 @@
     }
 
 // -----------------------------------------------------------------------------
-/** 
- * CTsBackstepping::ParentOffsetL
+/**
+ * Change hsapplication state to IDLE if moves to background
+ * @param aResources - OS resources manager
+ * @param aIsFrst - flag to inform if hsapplication is in foreground
  */
-TInt CTsBackstepping::ParentOffsetL( 
-        TInt aOffset,
-        const TArray<RWsSession::TWindowGroupChainInfo>& aWindowGroups )const 
+void CTsBackstepping::SwitchToIdleStateL(MTsResourceManager& aResources, 
+                                         TBool aIsFirst)
     {
-    for( TInt iter(aOffset + 1); iter < aWindowGroups.Count(); ++iter )
+    // switch Homescreen to Idle state if Homescreen is not in foreground and is in different state
+    if( iHsWasFirst && !aIsFirst )
         {
-        if(aWindowGroups[iter].iId == aWindowGroups[aOffset].iParentId)
+        TInt hsState( EHomeScreenIdleState );
+        User::LeaveIfError(RProperty::Get( KHsCategoryUid, 
+                                           KHsCategoryStateKey, 
+                                           hsState ) );
+        if(!(hsState & EHomeScreenWidgetViewActive ) )
             {
-            return IsEmbededApp( aWindowGroups[iter] ) ? 
-                   ParentOffsetL( iter, aWindowGroups ) : iter; 
+            RDebug::Print(_L("[Backstepping] about to switch HS activity"));
+            CAfActivityLauncher *activityEnabler = 
+                CAfActivityLauncher::NewLC( aResources.ApaSession(), 
+                                            aResources.WsSession() );
+            activityEnabler->launchActivityL( KHsActivactionUri );
+            CleanupStack::PopAndDestroy( activityEnabler );
             }
         }
-    User::Leave( KErrNotFound) ;
-    return KErrNotFound;
-    }
-
-// -----------------------------------------------------------------------------
-/** 
- * CTsBackstepping::IsEmbededApp
- */
-TBool CTsBackstepping::IsEmbededApp( 
-            const RWsSession::TWindowGroupChainInfo &aWindowGroupInfo ) const 
-    {
-    return 0 < aWindowGroupInfo.iParentId;
-    }
-
-// -----------------------------------------------------------------------------
-/** 
- * CTsBackstepping::GetUidFromWindowGroupL
- */
-TUid CTsBackstepping::GetUidFromWindowGroupL( MTsResourceManager &aResource, 
-                                              TInt aWindowGroupId ) const
-    {
-    TUid retVal(TUid::Null());
-    CApaWindowGroupName *windowGroupName = 
-            CApaWindowGroupName::NewLC( aResource.WsSession() );
-    windowGroupName->ConstructFromWgIdL( aWindowGroupId );
-    retVal = windowGroupName->AppUid();
-    CleanupStack::PopAndDestroy( windowGroupName );
-    return retVal;
+    iHsWasFirst = aIsFirst;
     }
 
 // end of file