diff -r 613943a21004 -r 9386f31cc85b bluetoothengine/btnotif/src/btnotifuiutil.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/bluetoothengine/btnotif/src/btnotifuiutil.cpp Wed Sep 01 12:20:04 2010 +0100 @@ -0,0 +1,412 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Declares Utility to show UI notes and queries. +* +*/ + +#include // BAFL utils (for language file) +#include "btnotifuiutil.h" +#include "btNotifDebug.h" // Debugging macros +#include // Localisation stringloader +#include // Information note +#include // for the blocking query +#include // CoverUI +#include // Backlight control +#include // Application Key enable/disable + +CBTNotifUIUtil* CBTNotifUIUtil::NewL( TBool aCoverDisplayEnabled ) + { + CBTNotifUIUtil* self = new (ELeave) CBTNotifUIUtil( aCoverDisplayEnabled ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +CBTNotifUIUtil::CBTNotifUIUtil( TBool aCoverDisplayEnabled ) : + iCoverDisplayEnabled( aCoverDisplayEnabled ), + iSystemCancel( EFalse ), + iAppKeyBlocked( EFalse ) + { + } + +void CBTNotifUIUtil::ConstructL() + { + iEikEnv = CEikonEnv::Static(); + + TFileName filename; + filename += KFileDrive; + filename += KDC_RESOURCE_FILES_DIR; + filename += KResourceFileName; + BaflUtils::NearestLanguageFile(iEikEnv->FsSession(),filename); + iResourceFileFlag=iEikEnv->AddResourceFileL(filename); + } + +CBTNotifUIUtil::~CBTNotifUIUtil() + { + iSystemCancel = ETrue; + delete iQueryDlg; + delete iWaitDlg; + // Activate apps key again before exit, in case any interruption happens before activation + if( iAppKeyBlocked ) + { + FLOG(_L("[BTNOTIF]\t CBTNotifUIUtil destructor Activate apps key before exiting. ")); + (void) ((CAknNotifierAppServerAppUi*)iEikEnv->EikAppUi())->SuppressAppSwitching(EFalse); + } + iEikEnv->DeleteResourceFile(iResourceFileFlag); + } +// ---------------------------------------------------------- +// CBTNotifierBase::TurnLightsOn +// ---------------------------------------------------------- +// +void CBTNotifUIUtil::TurnLightsOn() + { + // Change the bit on and off. SysAp will detect that + // the lights should be switched on for the specified time. + // + TInt err = KErrNone; + + err = RProperty::Set(KPSUidCoreApplicationUIs, KLightsControl, ELightsOn); + err = RProperty::Set(KPSUidCoreApplicationUIs, KLightsControl, ELightsOff); + + if ( err != KErrNone ) + { + FTRACE(FPrint(_L("[BTNOTIF]\t CBTNotifUIUtil::TurnLightsOn() RProperty::Set return error %d"), err )); + } + + FLOG(_L("[BTNOTIF]\t CBTNotifUIUtil::TurnLightsOn() <<")); + } + +// ---------------------------------------------------------- +// CBTNotifierBase::LocalEikonEnv +// ---------------------------------------------------------- +// +CEikonEnv& CBTNotifUIUtil::LocalEikonEnv() + { + return *iEikEnv; + } + +// ---------------------------------------------------------- +// CBTNotifierBase::ShowQueryL +// ---------------------------------------------------------- +// +TInt CBTNotifUIUtil::ShowQueryL(TInt aPromptResource, TInt aExecuteResource, + TSecondaryDisplayBTnotifDialogs aDialogId, CAknQueryDialog::TTone aTone ) + { + TInt ret; + TBTDeviceName name( KNullDesC ); + if ( aPromptResource ) + { + HBufC* prompt = StringLoader::LoadLC( aPromptResource ); + ret = ShowQueryL(*prompt, aExecuteResource, aDialogId, name, aTone ); + CleanupStack::PopAndDestroy( prompt ); + } + else + { + ret = ShowQueryL(KNullDesC, aExecuteResource, aDialogId, name, aTone ); + } + return ret; + } + +TInt CBTNotifUIUtil::ShowQueryL(const TDesC& aPrompt, TInt aExecuteResource, + TSecondaryDisplayBTnotifDialogs aDialogId, const TBTDeviceName& aDevNameInCoverUi, CAknQueryDialog::TTone aTone ) + { + FLOG(_L("[BTNOTIF]\t CBTNotifUIUtil::ShowQueryL >>")); + __ASSERT_DEBUG( iQueryDlg == NULL, + User::Panic(_L("CBTNotifier iQueryDlg not released!"),KErrAlreadyExists)); + + iQueryDlg = CAknQueryDialog::NewL(aTone); + if( iCoverDisplayEnabled && aDialogId != ECmdBTnotifUnavailable) + { + // initializes cover support + iQueryDlg->PublishDialogL(aDialogId, KUidCoverUiCategoryBTnotif ); + CoverUIDisplayL( iQueryDlg, aDevNameInCoverUi ); + } + + // Deactivate apps key + // we can do nothing if this operation fails + (void) ((CAknNotifierAppServerAppUi*)iEikEnv->EikAppUi())->SuppressAppSwitching(ETrue); + iAppKeyBlocked = ETrue; + TurnLightsOn(); + iQueryDlg->SetFocus( ETrue ); + + TInt keypress; + if ( aPrompt.Length() ) + { + keypress = iQueryDlg->ExecuteLD(aExecuteResource, aPrompt ); + } + else + { + keypress = iQueryDlg->ExecuteLD( aExecuteResource ); + } + + iQueryDlg = NULL; + if( !iSystemCancel ) + { // Activate apps key when no external cancellation happens + (void) ((CAknNotifierAppServerAppUi*)iEikEnv->EikAppUi())->SuppressAppSwitching(EFalse); + iAppKeyBlocked = EFalse; + } + + FTRACE(FPrint(_L("[BTNOTIF]\t CBTNotifUIUtil::ShowQueryL keypress %d <<"), keypress ) ); + return keypress; + } + +TInt CBTNotifUIUtil::ShowMessageQueryL(TDesC& aMessage, const TDesC& aHeader, + TInt aResourceId, CAknQueryDialog::TTone aTone ) + { + FLOG(_L("[BTNOTIF]\t CBTNotifUIUtil::ShowMessageQueryL >>")); + __ASSERT_DEBUG( iQueryDlg == NULL, + User::Panic(_L("CBTNotifier iQueryDlg not released!"),KErrAlreadyExists)); + + iQueryDlg = CAknMessageQueryDialog::NewL( aMessage, aTone ); + iQueryDlg->PrepareLC( aResourceId ); + if( aHeader.Length() ) + { + static_cast(iQueryDlg)->Heading()->SetTextL( aHeader ); + } + + // Deactivate apps key + // we can do nothing if this operation fails + (void) ((CAknNotifierAppServerAppUi*)iEikEnv->EikAppUi())->SuppressAppSwitching(ETrue); + iAppKeyBlocked = ETrue; + TurnLightsOn(); + iQueryDlg->SetFocus( ETrue ); + TInt keypress = iQueryDlg->RunLD(); + iQueryDlg = NULL; + + if( !iSystemCancel ) + { // Activate apps key when no external cancellation happens + (void) ((CAknNotifierAppServerAppUi*)iEikEnv->EikAppUi())->SuppressAppSwitching(EFalse); + iAppKeyBlocked = EFalse; + } + + FTRACE(FPrint(_L("[BTNOTIF]\t CBTNotifUIUtil::ShowMessageQueryL keypress %d <<"), keypress ) ); + return keypress; + } + + +TInt CBTNotifUIUtil::ShowTextInputQueryL(TDes& aText, TInt aExecuteResource, + TSecondaryDisplayBTnotifDialogs aDialogId, + CAknQueryDialog::TTone aTone ) + { + return ShowTextInputQueryL(aText, KNullDesC, aExecuteResource, aDialogId, aTone); + } + +TInt CBTNotifUIUtil::ShowTextInputQueryL(TDes& aText, const TDesC& aPrompt, TInt aExecuteResource, + TSecondaryDisplayBTnotifDialogs aDialogId, + CAknQueryDialog::TTone aTone ) + { + FLOG(_L("[BTNOTIF]\t CBTNotifUIUtil::ShowTextInputQueryL >>")); + + __ASSERT_DEBUG( iQueryDlg == NULL, + User::Panic(_L("CBTNotifier iQueryDlg not released!"),KErrAlreadyExists)); + + iQueryDlg = CAknTextQueryDialog::NewL( aText, aTone ); + if( iCoverDisplayEnabled && aDialogId != ECmdBTnotifUnavailable) + { + // initializes cover support + iQueryDlg->PublishDialogL(aDialogId, KUidCoverUiCategoryBTnotif ); + } + if ( aPrompt.Length() ) + { + iQueryDlg->SetPromptL( aPrompt ); + } + + // Deactivate apps key + // we can do nothing if this operation fails + (void) ((CAknNotifierAppServerAppUi*)iEikEnv->EikAppUi())->SuppressAppSwitching(ETrue); + iAppKeyBlocked = ETrue; + TurnLightsOn(); + iQueryDlg->SetFocus( ETrue ); + TInt keypress = iQueryDlg->ExecuteLD( aExecuteResource ); + iQueryDlg = NULL; + + if( !iSystemCancel ) + { // Activate apps key when no external cancellation happens + (void) ((CAknNotifierAppServerAppUi*)iEikEnv->EikAppUi())->SuppressAppSwitching(EFalse); + iAppKeyBlocked = EFalse; + } + + FTRACE(FPrint(_L("[BTNOTIF]\t CBTNotifUIUtil::ShowTextInputQueryL txt '%S' keypress %d <<"), + &aText, keypress ) ); + return keypress; + } + +void CBTNotifUIUtil::ShowInfoNoteL( + TInt aResourceId, TSecondaryDisplayBTnotifDialogs aDialogId ) + { + // Load a string, create and show a note + HBufC* stringHolder = StringLoader::LoadLC( aResourceId ); + ShowInfoNoteL( *stringHolder, aDialogId ); + CleanupStack::PopAndDestroy(); //stringHolder + } + + +void CBTNotifUIUtil::ShowInfoNoteL( + const TDesC& aResource, TSecondaryDisplayBTnotifDialogs aDialogId ) + { + FTRACE(FPrint(_L("[BTNOTIF]\t CBTNotifUIUtil::ShowInfoNoteL '%S' >> "), + &aResource ) ); + CAknInformationNote* note = new (ELeave) CAknInformationNote(); + if(iCoverDisplayEnabled && aDialogId != ECmdBTnotifUnavailable) + { + CleanupStack::PushL( note ); + // initializes cover support + note->PublishDialogL(aDialogId, KUidCoverUiCategoryBTnotif ); + CleanupStack::Pop(note); + } + note->ExecuteLD( aResource ); + FLOG(_L("[BTNOTIF]\t CBTNotifUIUtil::ShowInfoNoteL done <<")); + } + +void CBTNotifUIUtil::ShowConfirmationNoteL( TBool aWaitingDlg, const TDesC& aResource, + TSecondaryDisplayBTnotifDialogs aDialogId, const TBTDeviceName& aDevNameInCoverUi ) + { + FLOG(_L("[BTNOTIF]\t CBTNotifUIUtil::ShowConfirmationNoteL >>")); + CAknConfirmationNote* note = new (ELeave) CAknConfirmationNote( aWaitingDlg ); + + if(iCoverDisplayEnabled && aDialogId != ECmdBTnotifUnavailable) + { + CleanupStack::PushL( note ); + // initializes cover support + note->PublishDialogL(aDialogId, KUidCoverUiCategoryBTnotif ); + CoverUIDisplayL( note, aDevNameInCoverUi ); + CleanupStack::Pop(note); + } + TurnLightsOn(); + note->ExecuteLD( aResource ); + FLOG(_L("[BTNOTIF]\t CBTNotifUIUtil::ShowConfirmationNoteL done <<")); + } + +void CBTNotifUIUtil::ShowErrorNoteL( TBool aWaitingDlg, const TDesC& aResource, + TSecondaryDisplayBTnotifDialogs aDialogId, TBTDeviceName aDevNameInCoverUi ) + { + FLOG(_L("[BTNOTIF]\t CBTNotifUIUtil::ShowErrorNoteL >>")); + CAknErrorNote* note = new (ELeave) CAknErrorNote( aWaitingDlg ); + if(iCoverDisplayEnabled && aDialogId != ECmdBTnotifUnavailable) + { + CleanupStack::PushL( note ); + // initializes cover support + note->PublishDialogL(aDialogId, KUidCoverUiCategoryBTnotif ); + CoverUIDisplayL( note, aDevNameInCoverUi ); + CleanupStack::Pop(note); + } + TurnLightsOn(); + note->ExecuteLD( aResource ); + FLOG(_L("[BTNOTIF]\t CBTNotifUIUtil::ShowErrorNoteL done <<")); + } + +// ---------------------------------------------------------- +// CBTNotifUIUtil::IsQueryReleased +// Check if iQueryDlg is NULL +// ---------------------------------------------------------- +// +TBool CBTNotifUIUtil::IsQueryReleased() + { + return ( iQueryDlg ) ? EFalse : ETrue; + } + +// ---------------------------------------------------------- +// CBTNotifUIUtil::UpdateQueryDlgL +// Update Query with specified info, called by UpdateL() +// ---------------------------------------------------------- +// +void CBTNotifUIUtil::UpdateQueryDlgL( TDesC& aMessage ) + { + __ASSERT_DEBUG( iQueryDlg != NULL, + User::Panic(_L("CBTNotifier iQueryDlg not exist to update!"),KErrNotFound)); + iQueryDlg->SetPromptL( aMessage ); + iQueryDlg->DrawDeferred(); + } + +// ---------------------------------------------------------- +// CBTNotifUIUtil::UpdateMessageQueryDlgL +// Update message query when RNotifier::UpdateL() is called +// ---------------------------------------------------------- +// +void CBTNotifUIUtil::UpdateMessageQueryDlgL( TDesC& aMessage ) + { + __ASSERT_DEBUG( iQueryDlg != NULL, + User::Panic(_L("CBTNotifier CAknTextQueryDialog iQueryDlg not exist to update!"),KErrNotFound)); + static_cast(iQueryDlg)->SetMessageTextL( aMessage ); + iQueryDlg->DrawDeferred(); + FLOG(_L("[BTNOTIF]\t CBTNotifUIUtil::UpdateMessageQueryDlg ")); + } + +// ---------------------------------------------------------- +// CBTNotifUIUtil::UpdateCoverUiL +// Update secondary display +// ---------------------------------------------------------- +// +void CBTNotifUIUtil::UpdateCoverUiL( const TDesC8& aMessage ) + { + FLOG(_L("[BTNOTIF]\t CBTNotifUIUtil::UpdateCoverUiL >>")); + __ASSERT_DEBUG( iQueryDlg != NULL, + User::Panic(_L("CBTNotifier iQueryDlg not exist to update!"),KErrNotFound)); + if(iCoverDisplayEnabled ) + { + CAknMediatorFacade* coverData = AknMediatorFacade(iQueryDlg); + if(coverData) + { + coverData->ResetBuffer(); + coverData->BufStream() << aMessage; // insert your buffer here + coverData->BufStream().CommitL(); + coverData->PostUpdatedDataL(); + } + } + FLOG(_L("[BTNOTIF]\t CBTNotifUIUtil::UpdateCoverUiL done <<")); + } + +void CBTNotifUIUtil::DismissDialog() + { + if( !IsQueryReleased() ) + { + delete iQueryDlg; + iQueryDlg = NULL; + } + } + +void CBTNotifUIUtil::CoverUIDisplayL( const MObjectProvider* aMop, + const TBTDeviceName& aDevNameInCoverUi ) + { + FLOG(_L("[BTNOTIF]\t CBTNotifUIUtil::CoverUIDisplayL() >>")); + + CAknMediatorFacade* covercl = AknMediatorFacade( aMop ); + if( covercl && aDevNameInCoverUi.Length() ) + { + covercl->BufStream() << aDevNameInCoverUi; + covercl->BufStream().CommitL(); // no more data to send so commit buf + } + + FLOG(_L("[BTNOTIF]\t CBTNotifUIUtil::CoverUIDisplayL() <<")); + } + +TInt CBTNotifUIUtil::ShowWaitDlgL( TInt aResourceId ) + { + FLOG(_L("[BTNOTIF]\t CBTNotifUIUtil::ShowWaitDlgL() >>")); + iWaitDlg = new(ELeave) CAknWaitDialog((REINTERPRET_CAST(CEikDialog**,&iWaitDlg)), ETrue ); + TInt ret = iWaitDlg->ExecuteLD(aResourceId); + FLOG(_L("[BTNOTIF]\t CBTNotifUIUtil::ShowWaitDlgL() <<")); + return ret; + } + +void CBTNotifUIUtil::CompleteWaitDlgL() + { + FLOG(_L("[BTNOTIF]\t CBTNotifUIUtil::CompleteWaitDlgL() >>")); + if(iWaitDlg) + { + iWaitDlg->ProcessFinishedL(); + } + FLOG(_L("[BTNOTIF]\t CBTNotifUIUtil::CompleteWaitDlgL() <<")); + }