securitydialogs/lockapp/src/lockappecsdetector.cpp
changeset 0 164170e6151a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/securitydialogs/lockapp/src/lockappecsdetector.cpp	Tue Jan 26 15:20:08 2010 +0200
@@ -0,0 +1,159 @@
+/*
+* Copyright (c) 2007 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:  Provides emergency call support for keyguard/devicelock
+ *
+*/
+
+
+#include "lockappecsdetector.h"
+#include "lockappecsnote.h"
+#include "lockapputils.h"
+#include <aknappui.h>
+#include <avkon.rsg>
+
+// ---------------------------------------------------------------------------
+// Standard Symbian OS construction sequence
+// ---------------------------------------------------------------------------
+CLockAppEcsDetector* CLockAppEcsDetector::NewL( )
+    {
+    CLockAppEcsDetector* self = new (ELeave) CLockAppEcsDetector();
+    CleanupStack::PushL( self );
+    self->ConstructL( );
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+// ---------------------------------------------------------------------------
+// Standard C++ constructor
+// ---------------------------------------------------------------------------
+CLockAppEcsDetector::CLockAppEcsDetector( )
+    {
+    }
+
+// ---------------------------------------------------------------------------
+// Constructs the emergency detector and the note.
+// ---------------------------------------------------------------------------
+void CLockAppEcsDetector::ConstructL( )
+    {
+    // emergency call support
+    iEcsDetector = CAknEcsDetector::NewL( );
+    iEcsDetector->SetObserver( this );
+
+    // emergency call note
+    iEcsNote = new (ELeave) CLockAppEcsNote();
+    iEcsNote->ConstructSleepingNoteL( R_AVKON_EMERGENCY_CALL_NOTE );
+    iEcsNote->ButtonGroupContainer().ButtonGroup()->AsControl()->DrawableWindow()->SetOrdinalPosition( 0, 2 );
+
+    // needs to be called for ecs detector to work/receive events.
+    iAvkonAppUi->EventMonitor()->Enable( ETrue );
+    }
+
+// ---------------------------------------------------------------------------
+// Destructor.
+// ---------------------------------------------------------------------------
+CLockAppEcsDetector::~CLockAppEcsDetector( )
+    {
+    delete iEcsDetector;
+    delete iEcsNote;
+    }
+
+// ---------------------------------------------------------------------------
+// Detector starts/stops listening to key events if keys are locked/unlocked.
+// The detector key event queue is always reseted when lock status is changed.
+// ---------------------------------------------------------------------------
+void CLockAppEcsDetector::HandleLockStatusChangedL( TLockStatus aLockStatus )
+    {
+    iEcsDetector->Reset( );
+    switch ( aLockStatus )
+        {
+        case ELockNotActive:
+            {
+            iEcsDetector->CloseEventSource( );
+            }
+            break;
+        case EKeyguardActive:
+        case EDevicelockActive:
+            {
+            iEcsDetector->ConnectToEventSource( );
+            }
+            break;
+        default:
+            DoPanic( ELockUnknownValue );
+            break;
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// The main state controller needs to know if emergency call note is
+// on the screen.
+// ---------------------------------------------------------------------------
+TBool CLockAppEcsDetector::EcsNoteOnScreen( ) const
+    {
+    return iEcsNote->iNoteOnScreen;
+    }
+
+// ---------------------------------------------------------------------------
+// From @c MAknEcsObserver.. Handles changes in emergency the emergency number
+// queue (i.e. if the user has dialed emergency numbers or not).
+// ---------------------------------------------------------------------------
+void CLockAppEcsDetector::HandleEcsEvent( CAknEcsDetector* aEcsDetector,
+        CAknEcsDetector::TState aState )
+    {
+    switch ( aState )
+        {
+        case CAknEcsDetector::ECompleteMatchThenSendKey:
+            // Do nothing since note will be removed on ECallAttempted event
+            break;
+            // user has successfully dialed emergency numbers
+        case CAknEcsDetector::ECompleteMatch:
+            iEcsNote->SetEmergencyNumber( aEcsDetector->CurrentMatch( ) );
+            // Tell sysAp to switch lights on
+            SendMessageToSysAp( EEikEcsQueryLights );
+            iEcsNote->ShowNote( );
+            break;
+        case CAknEcsDetector::EPartialMatch:
+            iEcsNote->SleepNote( );
+            break;
+        case CAknEcsDetector::ECallAttempted:
+            iEcsNote->SleepNote( );
+            break;
+        case CAknEcsDetector::EEmpty:
+            iEcsNote->SleepNote( );
+            break;
+        case CAknEcsDetector::ENoMatch:
+            iEcsNote->SleepNote( );
+            break;
+        default:
+            break;
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// Tests the emergency note ui. Only used for testing purposes,
+// Created, because emergency detector does not work in emulator.
+// ---------------------------------------------------------------------------
+TInt CLockAppEcsDetector::TestEcsNote( )
+    {
+#ifdef _DEBUG
+    HandleEcsEvent( iEcsDetector, CAknEcsDetector::EEmpty );
+    HandleEcsEvent( iEcsDetector, CAknEcsDetector::ENoMatch );
+    HandleEcsEvent( iEcsDetector, CAknEcsDetector::EPartialMatch );
+    HandleEcsEvent( iEcsDetector, CAknEcsDetector::ECompleteMatch );
+    _LIT( NText, "112Test");
+    iEcsNote->SetEmergencyNumber( NText );
+    SendMessageToSysAp( EEikEcsQueryLights );
+    iEcsNote->ShowNote( );
+#endif
+    return KErrNone;
+    }