/*
* Copyright (c) 2002 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: Dialog used for code queries.
*
*
*/
#include <AknQueryDialog.h>
#include "secuicodequerydialog.h"
#include <eikseced.h>
#include "SecUiCodeQueryControl.h"
#include "secui.hrh"
#include <SecUi.rsg>
#include <aknsoundsystem.h>
#include <aknappui.h>
#include <AknIncallBubbleNotify.h>
// ================= MEMBER FUNCTIONS =======================
//
// ----------------------------------------------------------
// CCodeQueryDialog::CCodeQueryDialog()
// C++ constructor
// ----------------------------------------------------------
//
EXPORT_C CCodeQueryDialog::CCodeQueryDialog(TDes& aDataText,TInt aMinLength,TInt aMaxLength,TInt aMode, TBool aIsRemoteLockQuery):
CAknTextQueryDialog(aDataText,ENoTone), iMinLength(aMinLength), iMaxLength(aMaxLength), iMode(aMode), iIsRemoteLockQuery(aIsRemoteLockQuery)
{
}
//
// ----------------------------------------------------------
// CCodeQueryDialog::~CodeQueryDialog()
// Destructor
// ----------------------------------------------------------
//
CCodeQueryDialog::~CCodeQueryDialog()
{
#if defined(_DEBUG)
RDebug::Print(_L("(SECUI)CCodeQueryDialog::~CCodeQueryDialog()"));
#endif
if ( AknLayoutUtils::PenEnabled() )
{
TRAP_IGNORE ( SetIncallBubbleAllowedInUsualL( ETrue ) );
}
if (iFront)
{
// uncapture keys
if (iMode != ESecUiNone)
{
RWindowGroup& groupWin=iCoeEnv->RootWin();
groupWin.CancelCaptureKeyUpAndDowns(iAppKey);
groupWin.CancelCaptureKeyUpAndDowns(iVoiceKey2);
groupWin.CancelCaptureKey(iVoiceKey1);
}
CAknAppUi* aknappui =static_cast<CAknAppUi*>(iEikonEnv->EikAppUi());
if(!iIsRemoteLockQuery)
{
// return normal high-priority in case there are other notifiers active
// and were are not going to lose foregroung right after following call
if (!aknappui->IsFullScreenApp())//check that we are autolock and not a "normal" i.e. full screen application.
iEikonEnv->RootWin().SetOrdinalPosition(0,ECoeWinPriorityAlwaysAtFront);
}
iEikonEnv->BringForwards(EFalse);
iEikonEnv->EikAppUi()->RemoveFromStack(this);
aknappui->KeySounds()->ReleaseContext();
aknappui->KeySounds()->PopContext();
iFront = EFalse;
}
#if defined(_DEBUG)
RDebug::Print(_L("(SECUI)CCodeQueryDialog::~CCodeQueryDialog() END"));
#endif
}
//
// ----------------------------------------------------------
// CCodeQueryDialog::PreLayoutDynInitL()
// Called by framework before dialog is shown
// ----------------------------------------------------------
//
void CCodeQueryDialog::PreLayoutDynInitL()
{
CAknTextQueryDialog::PreLayoutDynInitL();
//disable in call bubble.
if ( AknLayoutUtils::PenEnabled() )
{
SetIncallBubbleAllowedInUsualL( EFalse );
}
SetMaxLength(iMaxLength);
// Add this higher than the environment filter, otherwise
// we cannot capture keys from the EikSrvUi KeyFilter.
// Used because this query might be called from notifier
if (iMode == ESecUiNone)
{
iEikonEnv->EikAppUi()->AddToStackL(this,ECoeStackPriorityEnvironmentFilter+100,ECoeStackFlagRefusesAllKeys);
}
else
{
iEikonEnv->EikAppUi()->AddToStackL(this,ECoeStackPriorityEnvironmentFilter+100,ECoeStackFlagRefusesFocus);
}
// capture app,voice and end keys if necessary
if (iMode != ESecUiNone)
{
RWindowGroup& groupWin=iCoeEnv->RootWin();
// Capture app key
iAppKey = groupWin.CaptureKeyUpAndDowns(EStdKeyApplication0, 0, 0);
// capture voice key
iVoiceKey1 = groupWin.CaptureKey(EKeySide,0,0);
iVoiceKey2 = groupWin.CaptureKeyUpAndDowns(EStdKeyDevice6, 0, 0);
}
if (!iIsRemoteLockQuery)
{
MakeLeftSoftkeyVisible(EFalse);
RWsSession& wsSession = iEikonEnv->WsSession();
TInt myWgId = iEikonEnv->RootWin().Identifier();
TInt wgPrio = wsSession.GetWindowGroupOrdinalPriority(myWgId);
// we are already on forgeround, need to update priority differently
/*
if (wgPrio == ECoeWinPriorityAlwaysAtFront)
{
iEikonEnv->RootWin().SetOrdinalPosition(0,ECoeWinPriorityAlwaysAtFront+1);
}
*/
// this must be done always to keep the reference count in synch
// this does not have any effect if autoforwarding has not been set true (normal application.)
iEikonEnv->BringForwards(ETrue, ECoeWinPriorityAlwaysAtFront + 1);
/// -- Change Window Priority for dialog and CBA
DrawableWindow()->SetOrdinalPosition(0, ECoeWinPriorityAlwaysAtFront); //
ButtonGroupContainer().ButtonGroup()->AsControl()->DrawableWindow()->SetOrdinalPosition(
0, ECoeWinPriorityAlwaysAtFront);
}
//key sounds
static_cast<CAknAppUi*>(iEikonEnv->EikAppUi())->KeySounds()->PushContextL(R_AVKON_DEFAULT_SKEY_LIST);
static_cast<CAknAppUi*>(iEikonEnv->EikAppUi())->KeySounds()->BringToForeground();
static_cast<CAknAppUi*>(iEikonEnv->EikAppUi())->KeySounds()->LockContext();
iFront = ETrue;
}
//
// ---------------------------------------------------------
// CCodeQueryDialog::OfferKeyEventL
// called by framework when any key is pressed
// ---------------------------------------------------------
//
TKeyResponse CCodeQueryDialog::OfferKeyEventL(const TKeyEvent& aKeyEvent, TEventCode aType)
{
#if defined(_DEBUG)
RDebug::Print(_L("(SECUI)CCodeQueryDialog::OfferKeyEventL"));
TInt keycode = aKeyEvent.iCode;
RDebug::Print(_L("(SECUI)CCodeQueryDialog::OfferKeyEventL keycode: %d"), keycode);
TInt scancode = aKeyEvent.iScanCode;
RDebug::Print(_L("(SECUI)CCodeQueryDialog::OfferKeyEventL scancode: %d"), scancode);
#endif
if(!iIsRemoteLockQuery)
{
// '#' key
if( aKeyEvent.iScanCode == EStdKeyHash && aType == EEventKeyUp)
{
TryExitL(EEikBidOk);
return EKeyWasConsumed;
}
// '*' key
if (aKeyEvent.iCode == '*')
{
return EKeyWasConsumed;
}
}
// app key
if (aKeyEvent.iScanCode == EStdKeyApplication0)
{
if (iMode == ESecUiNone)
{
TryExitL(EAknSoftkeyCancel);
return EKeyWasNotConsumed;
}
return EKeyWasConsumed;
}
// end key
if (aKeyEvent.iCode == EKeyPhoneEnd)
{
#if defined(_DEBUG)
RDebug::Print(_L("(SECUI)CCodeQueryDialog::OfferKeyEventL: EKeyPhoneEnd"));
#endif
TryExitL(EAknSoftkeyCancel);
return EKeyWasConsumed;
}
if ((aKeyEvent.iScanCode == EStdKeyYes))
{//Since dialler listens to down/up event,
//have to consume those to prevent it from opening
if(AknLayoutUtils::PenEnabled())
{
CCodeQueryControl* control = STATIC_CAST(CCodeQueryControl*,Control(EGeneralQuery));
if(!control->IsEmergencyCallSupportOn())
{ //Only needed in dialogs where there is no emergency call support
#if defined(_DEBUG)
RDebug::Print(_L("(SECUI)CCodeQueryDialog::OfferKeyEventL: Send down/up event consumed."));
#endif
return EKeyWasConsumed;
}
}
}
if (aKeyEvent.iCode == EKeyPhoneSend)
{
#if defined(_DEBUG)
RDebug::Print(_L("(SECUI)CCodeQueryDialog::OfferKeyEventL: EKeyPhoneSend"));
#endif
if(AknLayoutUtils::PenEnabled())
{
#if defined(_DEBUG)
RDebug::Print(_L("(SECUI)CCodeQueryDialog::OfferKeyEventL: pen enabled"));
#endif
CCodeQueryControl* control = STATIC_CAST(CCodeQueryControl*,Control(EGeneralQuery));
if(control->IsEmergencyCallSupportOn())
{
#if defined(_DEBUG)
RDebug::Print(_L("(SECUI)CCodeQueryDialog::OfferKeyEventL: ECS on"));
#endif
if(!control->IsEmergencyNumber())
{
#if defined(_DEBUG)
RDebug::Print(_L("(SECUI)CCodeQueryDialog::OfferKeyEventL: Not E number!"));
#endif
ShowWarningNoteL();
#if defined(_DEBUG)
RDebug::Print(_L("(SECUI)CCodeQueryDialog::OfferKeyEventL: send key consumed!"));
#endif
return EKeyWasConsumed;
}
}
else //consume the key to prevent dialler from opening
{
#if defined(_DEBUG)
RDebug::Print(_L("(SECUI)CCodeQueryDialog::OfferKeyEventL: No ECS. send key consumed!"));
#endif
return EKeyWasConsumed;
}
}
}
#if defined(_DEBUG)
RDebug::Print(_L("(SECUI)CCodeQueryDialog::OfferKeyEventL: To AVKON"));
#endif
return CAknTextQueryDialog::OfferKeyEventL(aKeyEvent,aType);
}
//
// ---------------------------------------------------------
// CCodeQueryDialog::NeedToDismissQueryL()
// Handles '#' key called by CAknTextQueryDialog::OfferKeyEventL()
// ---------------------------------------------------------
//
TBool CCodeQueryDialog::NeedToDismissQueryL(const TKeyEvent& /*aKeyEvent*/)
{
return EFalse;
}
//
// ---------------------------------------------------------
// CCodeQueryDialog::OkToExitL()
// called by framework when the Softkey is pressed
// ---------------------------------------------------------
//
TBool CCodeQueryDialog::OkToExitL(TInt aButtonId)
{
#if defined(_DEBUG)
RDebug::Print(_L("(SECUI)CCodeQueryDialog::OkToExitL:%d"), aButtonId);
#endif
CCodeQueryControl* control = STATIC_CAST(CCodeQueryControl*,Control(EGeneralQuery));
TInt lenght = 0;
TBool returnvalue;
switch(aButtonId)
{
case EAknSoftkeyOk:
#if defined(_DEBUG)
RDebug::Print(_L("(SECUI)CCodeQueryDialog::OkToExitL:EAknSoftkeyOk"));
#endif
if(control)
{
lenght = control->GetTextLength();
}
if (lenght < iMinLength)
{
#if defined(_DEBUG)
RDebug::Print(_L("(SECUI)CCodeQueryDialog::OkToExitL:length < MIN: %d"), lenght);
#endif
// code was too short -> play error tone & clear editor
if (lenght != 0)
{
#if defined(_DEBUG)
RDebug::Print(_L("(SECUI)CCodeQueryDialog::OkToExitL:length < MIN, Play Sound"));
#endif
if(control)
{
control->PlaySound(EAvkonSIDErrorTone);
#if defined(_DEBUG)
RDebug::Print(_L("(SECUI)CCodeQueryDialog::OkToExitL:length < MIN, Reset Editor"));
#endif
control->ResetEditorL();
}
}
returnvalue = EFalse;
}
else
{
#if defined(_DEBUG)
RDebug::Print(_L("(SECUI)CCodeQueryDialog::OkToExitL:length >= MIN: %d"), lenght);
#endif
returnvalue = CAknTextQueryDialog::OkToExitL(aButtonId);
}
break;
case EEikBidCancel: //Also includes EAknSoftkeyCancel as they have the same numerical value
#if defined(_DEBUG)
RDebug::Print(_L("(SECUI)CCodeQueryDialog::OkToExitL:EEikBidCancel"));
#endif
if(iMode != ESecUiNone) //PUK1 code or PIN1 in boot. Must not exit until code has been input.
{
#if defined(_DEBUG)
RDebug::Print(_L("(SECUI)CCodeQueryDialog::OkToExitL:EEikBidCancel: get length."));
#endif
if(control)
{
lenght = control->GetTextLength();
}
returnvalue = EFalse;
if (lenght > 0) //reset editor
{
#if defined(_DEBUG)
RDebug::Print(_L("(SECUI)CCodeQueryDialog::OkToExitL:EEikBidCancel: length >0."));
#endif
if (control)
{
#if defined(_DEBUG)
RDebug::Print(_L("(SECUI)CCodeQueryDialog::OkToExitL:EEikBidCancel, reset editor"));
#endif
control->ResetEditorL();
}
}
}
else
returnvalue = ETrue;
break;
case ESecUiEmergencyCall: //user has called emergency number from dialog; exit.
#if defined(_DEBUG)
RDebug::Print(_L("(SECUI)CCodeQueryDialog::OkToExitL:Emergency Call"));
#endif
returnvalue = ETrue;
break;
case EAknSoftkeyEmergencyCall:
returnvalue = ETrue;
CAknTextQueryDialog::OkToExitL(aButtonId);
break;
case ESecUiDeviceLocked: //Dialog was left open when Device lock was activated by timer and must be closed.
#if defined(_DEBUG)
RDebug::Print(_L("(SECUI)CCodeQueryDialog::OkToExitL:Phone Locked"));
#endif
if(iMode == ESecUiNone)
returnvalue = ETrue;//Not a PUK1 code query.
else
returnvalue = EFalse;
break;
default:
#if defined(_DEBUG)
RDebug::Print(_L("(SECUI)CCodeQueryDialog::OkToExitL:DEFAULT!"));
#endif
if(iMode == ESecUiNone)
returnvalue = ETrue;
else
returnvalue = EFalse;
break;
}
#if defined(_DEBUG)
RDebug::Print(_L("(SECUI)CCodeQueryDialog::OkToExitL:END: %d"), returnvalue);
#endif
return returnvalue;
}
//
// ---------------------------------------------------------
// CCodeQueryDialog::HandleQueryEditorStateEventL()
// Gets called when editor sends state event
// ---------------------------------------------------------
//
TBool CCodeQueryDialog::HandleQueryEditorStateEventL(CAknQueryControl* aQueryControl,
TQueryControlEvent aEventType,
TQueryValidationStatus aStatus)
{
if (aEventType == MAknQueryControlObserver::EEmergencyCallAttempted)
{
TryExitL(ESecUiEmergencyCall);
return EFalse;
}
else
{
return CAknQueryDialog::HandleQueryEditorStateEventL(aQueryControl, aEventType, aStatus );
}
}
//
// ---------------------------------------------------------
// CCodeQueryDialog::TryCancelQueryL()
// Gets called when a client wishes to cancel the query
// ---------------------------------------------------------
//
void CCodeQueryDialog::TryCancelQueryL(TInt aReason)
{
#if defined(_DEBUG)
RDebug::Print(_L("(SECUI)CCodeQueryDialog::TryCancelQuery BEGIN"));
#endif
TryExitL(aReason);
#if defined(_DEBUG)
RDebug::Print(_L("(SECUI)CCodeQueryDialog::TryCancelQuery END"));
#endif
}
// -----------------------------------------------------------------------------
// CCodeQueryDialog::CheckIfEntryTextOk()
// -----------------------------------------------------------------------------
//
TBool CCodeQueryDialog::CheckIfEntryTextOk() const
{
CCodeQueryControl* control = STATIC_CAST(CCodeQueryControl*,Control(EGeneralQuery));
if (control)
{
control->GetText(iDataText);
}
const TInt textLength = Text().Length();
return (textLength <= iMaxLength && textLength >= iMinLength);
}
// -----------------------------------------------------------------------------
// CCTPinQueryDialog::UpdateLeftSoftKeyL()
// -----------------------------------------------------------------------------
//
void CCodeQueryDialog::UpdateLeftSoftKeyL()
{
CAknTextQueryDialog::UpdateLeftSoftKeyL();
if(iIsRemoteLockQuery)
MakeLeftSoftkeyVisible(CheckIfEntryTextOk());
}
// -----------------------------------------------------------------------------
// CCodeQueryDialog::ShowWarningNoteL()
// -----------------------------------------------------------------------------
//
void CCodeQueryDialog::ShowWarningNoteL()
{
#if defined(_DEBUG)
RDebug::Print(_L("(SECUI)CCodeQueryDialog::ShowWarningNoteL BEGIN"));
#endif
CAknNoteDialog* noteDlg = new (ELeave) CAknNoteDialog();
noteDlg->PrepareLC(R_EMERGENCY_CALLS_ONLY);
noteDlg->SetTimeout(CAknNoteDialog::ELongTimeout);
noteDlg->SetTone(CAknNoteDialog::EErrorTone);
noteDlg->DrawableWindow()->SetOrdinalPosition(0,ECoeWinPriorityAlwaysAtFront+1); //
noteDlg->ButtonGroupContainer().ButtonGroup()->AsControl()->DrawableWindow()->SetOrdinalPosition(0,ECoeWinPriorityAlwaysAtFront+1);
noteDlg->RunLD();
#if defined(_DEBUG)
RDebug::Print(_L("(SECUI)CCodeQueryDialog::ShowWarningNoteL END"));
#endif
}
// -----------------------------------------------------------------------------
// CCodeQueryDialog::SetIncallBubbleAllowedInUsualL()
// -----------------------------------------------------------------------------
//
void CCodeQueryDialog::SetIncallBubbleAllowedInUsualL(TBool aAllowed)
{
CAknIncallBubble *incallBubble = CAknIncallBubble::NewL();
CleanupStack::PushL(incallBubble);
incallBubble->SetIncallBubbleAllowedInUsualL( aAllowed );
CleanupStack::PopAndDestroy();
}
// End of file