author | Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> |
Tue, 14 Sep 2010 21:37:10 +0300 | |
branch | RCL_3 |
changeset 24 | 269724087bed |
parent 23 | 9386f31cc85b |
permissions | -rw-r--r-- |
23 | 1 |
/* |
2 |
* Copyright (c) 2002, 2010 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: Bluetooth visibility timeout notifier class. |
|
15 |
* |
|
16 |
*/ |
|
17 |
||
18 |
||
19 |
// INCLUDE FILES |
|
20 |
||
21 |
#include <StringLoader.h> // Localisation stringloader |
|
22 |
#include <SecondaryDisplay/BTnotifSecondaryDisplayAPI.h> |
|
23 |
#include <e32cmn.h> |
|
24 |
#include <BTNotif.rsg> // Own resources |
|
25 |
#include <btengsettings.h> |
|
26 |
#include <bluetoothuiutil.h> |
|
27 |
#include "BTNGenericQueryNotifier.h" // Own class definition |
|
28 |
#include "btNotifDebug.h" // Debugging macros |
|
29 |
#include <coreapplicationuisdomainpskeys.h> |
|
30 |
||
31 |
#ifdef __SERIES60_HELP |
|
32 |
#include <hlplch.h> |
|
33 |
#include <csxhelp/bt.hlp.hrh> // The bt hrh info is needed, for help launching |
|
34 |
#endif |
|
35 |
||
36 |
const TInt KBTNotifPhonePowerKeyWatcher = 30; |
|
37 |
||
38 |
// ================= MEMBER FUNCTIONS ======================= |
|
39 |
||
40 |
// ---------------------------------------------------------- |
|
41 |
// CBTGenericQueryNotifier::NewL |
|
42 |
// Two-phased constructor. |
|
43 |
// ---------------------------------------------------------- |
|
44 |
// |
|
45 |
CBTGenericQueryNotifier* CBTGenericQueryNotifier::NewL() |
|
46 |
{ |
|
47 |
CBTGenericQueryNotifier* self=new (ELeave) CBTGenericQueryNotifier(); |
|
48 |
CleanupStack::PushL(self); |
|
49 |
self->ConstructL(); |
|
50 |
CleanupStack::Pop(); |
|
51 |
return self; |
|
52 |
} |
|
53 |
||
54 |
// ---------------------------------------------------------- |
|
55 |
// CBTGenericQueryNotifier::CBTGenericQueryNotifier |
|
56 |
// C++ default constructor can NOT contain any code, that |
|
57 |
// might leave. |
|
58 |
// ---------------------------------------------------------- |
|
59 |
// |
|
60 |
CBTGenericQueryNotifier::CBTGenericQueryNotifier() |
|
61 |
{ |
|
62 |
} |
|
63 |
||
64 |
// ---------------------------------------------------------- |
|
65 |
// Destructor |
|
66 |
// ---------------------------------------------------------- |
|
67 |
// |
|
68 |
CBTGenericQueryNotifier::~CBTGenericQueryNotifier() |
|
69 |
{ |
|
70 |
Cancel(); // Free own resources |
|
71 |
delete iName; |
|
72 |
iQueryMessage.Close(); |
|
73 |
delete iQueryHeader; |
|
74 |
if (iPhonePowerKey.Handle()) |
|
75 |
{ |
|
76 |
iPhonePowerKey.Cancel(); |
|
77 |
} |
|
78 |
delete iPhonePowerKeyWatcher; |
|
79 |
iPhonePowerKey.Close(); |
|
80 |
} |
|
81 |
||
82 |
// ---------------------------------------------------------- |
|
83 |
// CBTGenericQueryNotifier::ConstructL |
|
84 |
// Symbian 2nd phase constructor can leave. |
|
85 |
// Attach to the P&S property and create |
|
86 |
// ---------------------------------------------------------- |
|
87 |
// |
|
88 |
void CBTGenericQueryNotifier::ConstructL() |
|
89 |
{ |
|
90 |
CBTNotifierBase::ConstructL(); |
|
91 |
||
92 |
/** |
|
93 |
* SysAp notifies Alarm UI to hide alarm when powerkey is pressed. |
|
94 |
* This is called from CSysApAppUi::HandleShortPowerKeyPressedL(), |
|
95 |
* so it seems to be a better choice than the following keys: |
|
96 |
* KPSUidAvkonDomain/KAknPowerMenuStatus |
|
97 |
* KPSUidCoreApplicationUIs/KCoreAppUIsAutolockStatus |
|
98 |
* KCoreAppUIsAutolockStatus would be ideal, but it comes too late. |
|
99 |
*/ |
|
100 |
User::LeaveIfError(iPhonePowerKey.Attach(KPSUidCoreApplicationUIs, |
|
101 |
KCoreAppUIsHideAlarm)); |
|
102 |
iPhonePowerKeyWatcher = CBTNotifActive::NewL(this, |
|
103 |
KBTNotifPhonePowerKeyWatcher, CActive::EPriorityStandard); |
|
104 |
iPhonePowerKey.Subscribe(iPhonePowerKeyWatcher->RequestStatus()); |
|
105 |
iPhonePowerKeyWatcher->GoActive(); |
|
106 |
} |
|
107 |
||
108 |
// ---------------------------------------------------------- |
|
109 |
// CBTGenericQueryNotifier::RegisterL |
|
110 |
// Register notifier. |
|
111 |
// ---------------------------------------------------------- |
|
112 |
// |
|
113 |
CBTGenericQueryNotifier::TNotifierInfo CBTGenericQueryNotifier::RegisterL() |
|
114 |
{ |
|
115 |
iInfo.iUid=KBTGenericQueryNotifierUid; |
|
116 |
iInfo.iChannel=KBTGenericQueryNotifierUid; |
|
117 |
iInfo.iPriority=ENotifierPriorityHigh; |
|
118 |
return iInfo; |
|
119 |
} |
|
120 |
||
121 |
||
122 |
// ---------------------------------------------------------- |
|
123 |
// CBTGenericQueryNotifier::StartL |
|
124 |
// Synchronic notifier launch. Contructs and shows a global |
|
125 |
// note, no parameters need here. |
|
126 |
// ---------------------------------------------------------- |
|
127 |
// |
|
128 |
TPtrC8 CBTGenericQueryNotifier::StartL( const TDesC8& /*aBuffer*/ ) |
|
129 |
{ |
|
130 |
FLOG(_L("[BTNOTIF]\t CBTGenericQueryNotifier::StartL()")); |
|
131 |
||
132 |
TPtrC8 ret(KNullDesC8); |
|
133 |
return (ret); |
|
134 |
||
135 |
} |
|
136 |
||
137 |
// ---------------------------------------------------------- |
|
24
269724087bed
Revision: 201033
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
23
diff
changeset
|
138 |
// CBTGenericQueryNotifier::ProcessStartParamsL |
23 | 139 |
// Mandatory for BT Notifiers when using asynchronous launch. |
140 |
// This notifier is synchronous so no implementation is needed. |
|
141 |
// ---------------------------------------------------------- |
|
142 |
// |
|
24
269724087bed
Revision: 201033
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
23
diff
changeset
|
143 |
void CBTGenericQueryNotifier::ProcessStartParamsL() |
23 | 144 |
{ |
24
269724087bed
Revision: 201033
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
23
diff
changeset
|
145 |
FLOG(_L("[BTNOTIF]\t CBTGenericQueryNotifier::ProcessStartParamsL")); |
23 | 146 |
|
24
269724087bed
Revision: 201033
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
23
diff
changeset
|
147 |
ProcessParamBufferL(*iParamBuffer); |
23 | 148 |
|
149 |
ShowQueryAndCompleteL(); |
|
150 |
||
24
269724087bed
Revision: 201033
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
23
diff
changeset
|
151 |
FLOG(_L("[BTNOTIF]\t CBTGenericQueryNotifier::ProcessStartParamsL Complete")); |
23 | 152 |
} |
153 |
||
154 |
// ---------------------------------------------------------- |
|
155 |
// CBTGenericQueryNotifier::ProcessParamBufferL |
|
156 |
// Parse the data out of the message that is sent by the |
|
157 |
// client of the notifier. |
|
158 |
// ---------------------------------------------------------- |
|
159 |
void CBTGenericQueryNotifier::ProcessParamBufferL(const TDesC8& aBuffer) |
|
160 |
{ |
|
161 |
||
162 |
TBTGenericQueryNotifierParams bParams; |
|
163 |
TPckgC<TBTGenericQueryNotifierParams> bPckg(bParams); |
|
164 |
bPckg.Set( aBuffer ); |
|
165 |
||
166 |
if( bPckg().iMessageType == EBTNameQuery ) |
|
167 |
{ |
|
168 |
iIsNameQuery = ETrue; |
|
169 |
return; |
|
170 |
} |
|
171 |
iSecondaryDisplayCommand = ECmdBTnotifUnavailable; |
|
172 |
switch (bPckg().iMessageType) |
|
173 |
{ |
|
174 |
case EBTReceiveMessageQuery: |
|
175 |
iIsMessageQuery=EFalse; |
|
176 |
iMessageResourceId=R_BT_RECEIVE_MESSAGE ; |
|
177 |
iSecondaryDisplayCommand=ECmdShowReceiveMessageFromDeviceDlg; |
|
178 |
break; |
|
179 |
case EBTReceiveMessagePairedQuery: |
|
180 |
iIsMessageQuery=EFalse; |
|
181 |
iMessageResourceId=R_BT_RECEIVE_MESSAGE_PAIRED; |
|
182 |
iSecondaryDisplayCommand= ECmdShowReceiveMessageFromPairedDeviceDlg; |
|
183 |
break; |
|
184 |
case EBTIsOffQuery: |
|
185 |
iIsMessageQuery=EFalse; |
|
186 |
iMessageResourceId=R_BT_POWER_IS_OFF ; |
|
187 |
iSecondaryDisplayCommand=ECmdShowBtIsOffDlg; |
|
188 |
break; |
|
189 |
case EBTActivateOffLineQuery: |
|
190 |
iIsMessageQuery=EFalse; |
|
191 |
iMessageResourceId=R_BT_ACTIVATE_IN_OFFLINE; |
|
192 |
iSecondaryDisplayCommand=ECmdShowBtActivateInOfflineDlg; |
|
193 |
break; |
|
194 |
case EBTNoDevicesFoundQuery: |
|
195 |
iIsMessageQuery=EFalse; |
|
196 |
iMessageResourceId=R_BT_NO_DEVICES_FOUND; |
|
197 |
break; |
|
198 |
case EBTAcceptRequestQuery: |
|
199 |
iIsMessageQuery=EFalse; |
|
200 |
iMessageResourceId=R_BT_AUTHORISATION_NAME ; |
|
201 |
iSecondaryDisplayCommand=ECmdShowAcceptConnRequestDlg; |
|
202 |
break; |
|
203 |
||
204 |
case EBTIsOffJavaQuery: |
|
205 |
iIsMessageQuery=ETrue; |
|
206 |
if( bPckg().iNameExists ) |
|
207 |
{ |
|
208 |
iMessageResourceId=R_BT_IS_OFF_JAVA_APPNAME; // when caller provide Java application name. |
|
209 |
} |
|
210 |
else |
|
211 |
{ |
|
212 |
iMessageResourceId=R_BT_IS_OFF_JAVA; //r_bt_is_hidden_java |
|
213 |
} |
|
214 |
iSecondaryDisplayCommand=ECmdShowBtBtIsOffJavaDlg; |
|
215 |
iQueryHeader=StringLoader::LoadL( R_BT_IS_OFF_JAVA_HEADER); |
|
216 |
break; |
|
217 |
||
218 |
case EBTIsNotShownQuery: |
|
219 |
iIsMessageQuery=ETrue; |
|
220 |
if( bPckg().iNameExists ) |
|
221 |
{ |
|
222 |
iMessageResourceId=R_BT_IS_HIDDEN_JAVA_APPNAME; // when caller provide Java application name. |
|
223 |
} |
|
224 |
else |
|
225 |
{ |
|
226 |
iMessageResourceId=R_BT_IS_HIDDEN_JAVA; //r_bt_is_hidden_java |
|
227 |
} |
|
228 |
iSecondaryDisplayCommand=ECmdShowBtIsNotVisibleDlg; |
|
229 |
iQueryHeader=StringLoader::LoadL( R_BT_IS_HIDDEN_JAVA_HEADER); |
|
230 |
break; |
|
231 |
||
232 |
case EBTBlockConnectionQuery: |
|
233 |
case EBTBlockPairedConnectionQuery: |
|
234 |
iIsMessageQuery=ETrue; |
|
235 |
if( bPckg().iMessageType == EBTBlockConnectionQuery ) |
|
236 |
iMessageResourceId = R_BT_BLOCK_DEVICE_NOHELP; |
|
237 |
else |
|
238 |
iMessageResourceId = R_BT_BLOCK_PAIRED_DEVICE_NOHELP ; |
|
239 |
||
240 |
iQueryHeader= StringLoader::LoadL( R_BT_BLOCK_DEVICE_HEADER ); |
|
241 |
break; |
|
242 |
||
243 |
case EBTSwitchOffAnyway: |
|
244 |
iIsMessageQuery=EFalse; |
|
245 |
iMessageResourceId=R_BT_SWITCH_OFF_ANYWAY; |
|
246 |
break; |
|
247 |
||
248 |
default: |
|
249 |
FLOG(_L("[BTNOTIF]\t CBTGenericQueryNotifier:: Unkown messageType! ")); |
|
250 |
User::Leave(KErrNotFound); |
|
251 |
} |
|
252 |
||
253 |
// if the logic string contains substitute indicator "%U", replace it with device name: |
|
254 |
// |
|
255 |
HBufC* buf = StringLoader::LoadL( iMessageResourceId); |
|
256 |
iQueryMessage.Assign( buf ); |
|
257 |
||
258 |
TInt keyLen; |
|
259 |
TInt pos = BluetoothUiUtil::GetStringSubstringKeyPos( |
|
260 |
iQueryMessage, 0, keyLen ); |
|
261 |
if( pos > KErrNotFound) |
|
262 |
{ |
|
263 |
//if no device name provided, default name will be used: |
|
264 |
if( !bPckg().iNameExists ) |
|
265 |
iName=StringLoader::LoadL(R_BT_DIALOG_DEF_NAME); |
|
266 |
else |
|
267 |
{ |
|
268 |
iName=HBufC::NewL(bPckg().iName.Length() ); |
|
269 |
iName->Des().Copy(bPckg().iName); |
|
270 |
} |
|
271 |
BluetoothUiUtil::LoadResourceAndSubstringL( |
|
272 |
iQueryMessage, iMessageResourceId, *iName, 0); |
|
273 |
} |
|
274 |
else |
|
275 |
{ |
|
276 |
iName=NULL; |
|
277 |
} |
|
278 |
} |
|
279 |
||
280 |
// ---------------------------------------------------------- |
|
281 |
// CBTGenericQueryNotifier::UpdateL |
|
282 |
// Update notifier according to new data |
|
283 |
// ---------------------------------------------------------- |
|
284 |
// |
|
285 |
TPtrC8 CBTGenericQueryNotifier::UpdateL(const TDesC8& aBuffer) |
|
286 |
{ |
|
287 |
FLOG(_L("[BTNOTIF]\t CBTGenericQueryNotifier::UpdateL")); |
|
288 |
ProcessParamBufferL(aBuffer); |
|
289 |
if( !iNotifUiUtil->IsQueryReleased() ) |
|
290 |
{ |
|
291 |
if(iIsMessageQuery ) |
|
292 |
{ |
|
293 |
iNotifUiUtil->UpdateMessageQueryDlgL(iQueryMessage); |
|
294 |
} |
|
295 |
else |
|
296 |
{ |
|
297 |
iNotifUiUtil->UpdateQueryDlgL(iQueryMessage); |
|
298 |
} |
|
299 |
} |
|
300 |
FLOG(_L("[BTNOTIF]\t CBTGenericQueryNotifier::UpdateL complete")); |
|
301 |
||
302 |
TPtrC8 ret(KNullDesC8); |
|
303 |
return (ret); |
|
304 |
} |
|
305 |
||
306 |
// ---------------------------------------------------------- |
|
307 |
// CBTGenericQueryNotifier::ShowQueryAndCompleteL |
|
308 |
// Shows the notifier in backround and complete message |
|
309 |
// ---------------------------------------------------------- |
|
310 |
// |
|
311 |
void CBTGenericQueryNotifier::ShowQueryAndCompleteL() |
|
312 |
{ |
|
313 |
FLOG(_L("[BTNOTIF]\t CBTGenericQueryNotifier::ShowQueryAndCompleteL")); |
|
314 |
||
315 |
// Turn lights on and deactivate apps -key |
|
316 |
// |
|
317 |
iNotifUiUtil->TurnLightsOn(); |
|
318 |
if( iIsNameQuery ) |
|
319 |
{ |
|
320 |
TBool nameStatus = IsLocalNameModifiedL(); |
|
321 |
if( !nameStatus ) |
|
322 |
{ |
|
323 |
(void) AskLocalBTNameQueryL(); |
|
324 |
} |
|
325 |
// Check if Local name is set again before turn BT on. |
|
326 |
// Turn BT on only when there is local name, since user still has chance |
|
327 |
// to ignore the asking name query - like pressing End-key |
|
328 |
// |
|
329 |
TBTDeviceName localName; |
|
330 |
localName.Zero(); |
|
331 |
TInt err = iBTEngSettings->GetLocalName(localName); |
|
332 |
||
333 |
if (localName.Length() <= 0) |
|
334 |
{ |
|
335 |
err = KErrCancel; |
|
336 |
} |
|
337 |
||
338 |
CompleteMessage( (!err) ? ETrue : EFalse, KErrNone ); |
|
339 |
||
340 |
FLOG(_L("[BTNOTIF]\t CBTGenericQueryNotifier::ShowQueryAndCompleteL iIsNameQuery complete")); |
|
341 |
return; |
|
342 |
} |
|
343 |
||
344 |
TInt keypress; |
|
345 |
TBTDeviceName name(KNullDesC); |
|
346 |
if( iName ) |
|
347 |
{ |
|
348 |
name.Copy( *iName ); |
|
349 |
} |
|
350 |
if( iIsMessageQuery ) |
|
351 |
{ |
|
352 |
||
353 |
keypress = iNotifUiUtil->ShowMessageQueryL(iQueryMessage, *iQueryHeader, |
|
354 |
R_BT_GENERIC_MESSAGE_QUERY, CAknQueryDialog::EConfirmationTone ); |
|
355 |
} |
|
356 |
else |
|
357 |
{ |
|
358 |
keypress = iNotifUiUtil->ShowQueryL( iQueryMessage, R_BT_GENERIC_QUERY, |
|
359 |
iSecondaryDisplayCommand, name, CAknQueryDialog::EConfirmationTone ); |
|
360 |
} |
|
361 |
||
362 |
CompleteMessage( (keypress) ? ETrue: EFalse, KErrNone ); |
|
363 |
||
364 |
FLOG(_L("[BTNOTIF]\t CBTGenericQueryNotifier::ShowQueryAndCompleteL complete")); |
|
365 |
} |
|
366 |
||
367 |
// ---------------------------------------------------------- |
|
368 |
// CBTAuthNotifier::RequestCompletedL |
|
369 |
// Gets called when P&S key notifies the change |
|
370 |
// ---------------------------------------------------------- |
|
371 |
void CBTGenericQueryNotifier::RequestCompletedL(CBTNotifActive* aActive, |
|
372 |
TInt aId, TInt aStatus) |
|
373 |
{ |
|
374 |
FLOG(_L("[BTNOTIF]\t CBTGenericQueryNotifier::RequestCompletedL()")); |
|
375 |
switch (aId) |
|
376 |
{ |
|
377 |
case KBTNotifPhonePowerKeyWatcher: |
|
378 |
{ |
|
379 |
iPhonePowerKey.Subscribe(aActive->RequestStatus()); |
|
380 |
aActive->GoActive(); |
|
381 |
TInt val = 0; |
|
382 |
// If the Power key is pressed it is likely that he user does not |
|
383 |
// want to continue with existing query, so we dismiss it to avoid |
|
384 |
// any clashes with subsequent popups (ie for setting Lock code). |
|
385 |
// This is probably just a temporary solution to resolve immediate problem, |
|
386 |
// and the issue is raised with UI Framework team. |
|
387 |
if (!aStatus && !iPhonePowerKey.Get(val) && val == ECoreAppUIsHideAlarm) |
|
388 |
{ |
|
389 |
// DismissDialog() internally checks that actual query dialog is NOT NULL, |
|
390 |
// so it is safe to call it here. |
|
391 |
iNotifUiUtil->DismissDialog(); |
|
392 |
} |
|
393 |
} |
|
394 |
break; |
|
395 |
} |
|
396 |
||
397 |
FLOG(_L("[BTNOTIF]\t CBTGenericQueryNotifier::RequestCompletedL() completed")); |
|
398 |
} |
|
399 |
||
400 |
// ---------------------------------------------------------- |
|
401 |
// CBTAuthNotifier::HandleError |
|
402 |
// ---------------------------------------------------------- |
|
403 |
void CBTGenericQueryNotifier::HandleError(CBTNotifActive* aActive, TInt aId, |
|
404 |
TInt aError) |
|
405 |
{ |
|
406 |
FTRACE(FPrint(_L("[BTNOTIF]\t CBTGenericQueryNotifier::HandleError() error = %d"), aError )); |
|
407 |
(void) aActive; |
|
408 |
(void) aId; |
|
409 |
(void) aError; |
|
410 |
} |
|
411 |
||
412 |
// ---------------------------------------------------------- |
|
413 |
// CBTAuthNotifier::DoCancelRequest |
|
414 |
// Root caller is CBTNotifActive::CancelRequest(), which calls |
|
415 |
// CActive::Cancel that calls DoCancel() if request is active. |
|
416 |
// ---------------------------------------------------------- |
|
417 |
void CBTGenericQueryNotifier::DoCancelRequest(CBTNotifActive* aActive, TInt aId) |
|
418 |
{ |
|
419 |
FLOG(_L("[BTNOTIF]\t CBTGenericQueryNotifier::DoCancel() >>")); |
|
420 |
(void) aActive; |
|
421 |
(void) aId; |
|
422 |
||
423 |
iPhonePowerKey.Cancel(); |
|
424 |
||
425 |
FLOG(_L("[BTNOTIF]\t CBTGenericQueryNotifier::DoCancel() <<")); |
|
426 |
} |
|
427 |
||
428 |
// End of File |