66 wn->SetWindowGroupName (iWg); |
66 wn->SetWindowGroupName (iWg); |
67 CleanupStack::PopAndDestroy (wn); |
67 CleanupStack::PopAndDestroy (wn); |
68 |
68 |
69 // Window group change event |
69 // Window group change event |
70 User::LeaveIfError (iWg.EnableGroupListChangeEvents()); |
70 User::LeaveIfError (iWg.EnableGroupListChangeEvents()); |
|
71 |
|
72 iCache = CTsRunningAppStorage::NewL(); |
|
73 RefreshCacheL(); |
71 Subscribe(); |
74 Subscribe(); |
72 } |
75 } |
73 |
76 |
74 // ----------------------------------------------------------------------------- |
77 // ----------------------------------------------------------------------------- |
75 // |
78 // |
76 // ----------------------------------------------------------------------------- |
79 // ----------------------------------------------------------------------------- |
77 // |
80 // |
78 CTsWindowGroupsMonitor::~CTsWindowGroupsMonitor() |
81 CTsWindowGroupsMonitor::~CTsWindowGroupsMonitor() |
79 { |
82 { |
80 CActive::Cancel(); |
83 CActive::Cancel(); |
81 iWg.Close(); |
84 iWg.Close(); |
82 } |
85 } |
83 |
86 |
84 // ----------------------------------------------------------------------------- |
87 // ----------------------------------------------------------------------------- |
85 // |
88 // |
86 // ----------------------------------------------------------------------------- |
89 // ----------------------------------------------------------------------------- |
87 // |
90 // |
88 void CTsWindowGroupsMonitor::SubscribeL(MTsWindowGroupsObserver &observer) |
91 void CTsWindowGroupsMonitor::SubscribeL(MTsWindowGroupsObserver &observer) |
89 { |
92 { |
|
93 if(KErrNotFound != iObservers.Find(&observer)) |
|
94 { |
|
95 User::Leave(KErrAlreadyExists); |
|
96 } |
|
97 iObservers.InsertL(&observer, 0); |
|
98 observer.HandleWindowGroupChanged(iResources, *iCache); |
|
99 } |
|
100 |
|
101 // ----------------------------------------------------------------------------- |
|
102 // |
|
103 // ----------------------------------------------------------------------------- |
|
104 // |
|
105 void CTsWindowGroupsMonitor::Cancel(MTsWindowGroupsObserver & observer) |
|
106 { |
90 const TInt offset(iObservers.Find(&observer)); |
107 const TInt offset(iObservers.Find(&observer)); |
91 KErrNotFound == offset ? iObservers.InsertL(&observer, 0) : |
108 if(KErrNotFound != offset) |
92 User::Leave(KErrAlreadyExists); |
109 { |
93 } |
|
94 |
|
95 // ----------------------------------------------------------------------------- |
|
96 // |
|
97 // ----------------------------------------------------------------------------- |
|
98 // |
|
99 void CTsWindowGroupsMonitor::Cancel(MTsWindowGroupsObserver & observer) |
|
100 { |
|
101 const TInt offset(iObservers.Find(&observer)); |
|
102 if (KErrNotFound != offset) { |
|
103 iObservers.Remove(offset); |
110 iObservers.Remove(offset); |
104 } |
111 } |
|
112 } |
|
113 |
|
114 // ----------------------------------------------------------------------------- |
|
115 /** |
|
116 * @see MTsWindowGroupsMonitor::Storage |
|
117 */ |
|
118 const MTsRunningApplicationStorage& CTsWindowGroupsMonitor::Storage() const |
|
119 { |
|
120 return *iCache; |
|
121 } |
|
122 // ----------------------------------------------------------------------------- |
|
123 TBool CTsWindowGroupsMonitor::IsSupported(TInt aFunction) const |
|
124 { |
|
125 return ( VisibilityChange == aFunction ); |
|
126 } |
|
127 |
|
128 // ----------------------------------------------------------------------------- |
|
129 void CTsWindowGroupsMonitor::HandleDataL(TInt aFunction, RReadStream& aDataStream) |
|
130 { |
|
131 if(VisibilityChange == aFunction) |
|
132 { |
|
133 CTsVisibilitMsg* msg = CTsVisibilitMsg::NewLC(aDataStream); |
|
134 const TBool hide (Invisible == msg->visibility()); |
|
135 bool changed = false; |
|
136 for(TInt offset(0); offset < iCache->Count(); ++offset) |
|
137 { |
|
138 if( msg->windowGroupId() == (*iCache)[offset].WindowGroupId() ) |
|
139 { |
|
140 (*iCache)[offset].SetHidden(hide); |
|
141 offset = iCache->Count(); |
|
142 changed = true; |
|
143 } |
|
144 } |
|
145 if(changed) |
|
146 { |
|
147 for( TInt iter(0); iter < iObservers.Count(); ++iter ) |
|
148 { |
|
149 iObservers[iter]->HandleWindowGroupChanged( iResources, *iCache ); |
|
150 } |
|
151 } |
|
152 CleanupStack::PopAndDestroy(msg); |
|
153 } |
105 } |
154 } |
106 |
155 |
107 // ----------------------------------------------------------------------------- |
156 // ----------------------------------------------------------------------------- |
108 // |
157 // |
109 // ----------------------------------------------------------------------------- |
158 // ----------------------------------------------------------------------------- |
147 iResources.WsSession().EventReady( &iStatus ); |
196 iResources.WsSession().EventReady( &iStatus ); |
148 SetActive(); |
197 SetActive(); |
149 } |
198 } |
150 |
199 |
151 // ----------------------------------------------------------------------------- |
200 // ----------------------------------------------------------------------------- |
152 // |
|
153 // ----------------------------------------------------------------------------- |
|
154 // |
|
155 void CTsWindowGroupsMonitor::ProvideEventL() |
201 void CTsWindowGroupsMonitor::ProvideEventL() |
156 { |
202 { |
157 TWsEvent wsEvent; |
203 TWsEvent wsEvent; |
158 iResources.WsSession().GetEvent(wsEvent); |
204 iResources.WsSession().GetEvent(wsEvent); |
159 if( EEventWindowGroupListChanged == wsEvent.Type() ) |
205 if( EEventWindowGroupListChanged == wsEvent.Type() ) |
160 { |
206 { |
161 |
207 RefreshCacheL(); |
162 CTsRunningAppStorage *storage = CTsRunningAppStorage::NewLC(); |
208 } |
163 |
209 } |
164 RArray<RWsSession::TWindowGroupChainInfo> filteredWgInfo, fullWgInfo; |
210 |
165 CleanupClosePushL(filteredWgInfo); |
211 // ----------------------------------------------------------------------------- |
166 CleanupClosePushL(fullWgInfo); |
212 void CTsWindowGroupsMonitor::RefreshCacheL() |
167 User::LeaveIfError(iResources.WsSession().WindowGroupList(0, &filteredWgInfo)); |
213 { |
168 User::LeaveIfError(iResources.WsSession().WindowGroupList(&fullWgInfo)); |
214 RArray<RWsSession::TWindowGroupChainInfo> filteredWgInfo, fullWgInfo; |
169 storage->HandleWindowGroupChanged(iResources, |
215 CleanupClosePushL(filteredWgInfo); |
170 fullWgInfo.Array(), |
216 CleanupClosePushL(fullWgInfo); |
171 filteredWgInfo.Array()); |
217 User::LeaveIfError(iResources.WsSession().WindowGroupList(0, &filteredWgInfo)); |
172 CleanupStack::PopAndDestroy( &fullWgInfo ); |
218 User::LeaveIfError(iResources.WsSession().WindowGroupList(&fullWgInfo)); |
173 CleanupStack::PopAndDestroy( &filteredWgInfo ); |
219 iCache->HandleWindowGroupChanged(iResources, |
174 |
220 fullWgInfo.Array(), |
175 for( TInt iter(0); iter < iObservers.Count(); ++iter ) |
221 filteredWgInfo.Array()); |
176 { |
222 CleanupStack::PopAndDestroy( &fullWgInfo ); |
177 iObservers[iter]->HandleWindowGroupChanged( iResources, *storage ); |
223 CleanupStack::PopAndDestroy( &filteredWgInfo ); |
178 } |
224 |
179 CleanupStack::PopAndDestroy( storage ); |
225 for( TInt iter(0); iter < iObservers.Count(); ++iter ) |
180 |
226 { |
181 } |
227 iObservers[iter]->HandleWindowGroupChanged( iResources, *iCache ); |
182 } |
228 } |
|
229 } |