javauis/lcdui_akn/lcdui/src/CMIDAppUi.cpp
branchRCL_3
changeset 66 2455ef1f5bbc
child 77 7cee158cb8cd
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/lcdui_akn/lcdui/src/CMIDAppUi.cpp	Wed Sep 01 12:33:18 2010 +0100
@@ -0,0 +1,385 @@
+/*
+* Copyright (c) 1999-2001 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:
+*
+*/
+
+#include <eikenv.h>
+#include <eiksrvc.h>
+#include <eikappui.h>
+#include <Lcdglue.h>
+#include <j2me/jdebug.h>
+// needed for javaregistry
+#include <javaregistryentry.h>
+#include <javaregistry.h>
+#include <javaattribute.h>
+#ifdef RD_JAVA_NGA_ENABLED
+#include <goommonitorsession.h>
+#include <goommonitorplugin.hrh>
+#endif // RD_JAVA_NGA_ENABLED
+#include "CMIDAppUi.h"
+// using CMIDApplication API for iApp
+#include "CMIDApplication.h"
+// needed for creating CMIDComponentFactory
+#include "CMIDComponentFactory.h"
+// CMIDDisplayable class for iCurrentDisplayable
+#include "CMIDDisplayable.h"
+
+#include "LcduiThread.h"
+
+#include "logger.h"
+
+using namespace java::ui;
+using namespace Java;
+
+// class CMIDAppUi
+CMIDAppUi::CMIDAppUi() : iCurrentDisplayable(NULL),
+    iPendingOrientationChange(EFalse), iPauseApp(EFalse)
+{
+    mJavaAppUi = java::ui::CoreUiAvkonLcdui::getInstance().getJavaAknAppUi();
+    mCoreAppUi = java::ui::CoreUiAvkonLcdui::getInstance().getJavaUiAppUi();
+}
+
+void CMIDAppUi::ConstructL()
+{
+    DEBUG("+ CMIDAppUi::ConstructL()");
+    // get uid of the midlet
+    RLcdui::Get()->AttachL(this);
+    DEBUG("- CMIDAppUi::ConstructL()");
+}
+
+CMIDAppUi::~CMIDAppUi()
+{
+    iDisplayables.Close();
+    RLcdui::Get()->Detach();
+}
+
+void CMIDAppUi::SetCurrentDisplayable(CMIDDisplayable* aDisplayable)
+{
+    iCurrentDisplayable = aDisplayable;
+}
+
+void CMIDAppUi::HandleCommandL(TInt aCommand)
+{
+    switch (aCommand)
+    {
+        // Help command received (i.e. after the EStdKeyHelp button was pressed)
+    case EAknCmdHelp:
+        if (iCurrentDisplayable)
+        {
+            // Let the current displayable to process help command
+            iCurrentDisplayable->HandleHelpCommandL();
+        }
+        break;
+    case EEikCmdExit:
+        if (iObserver)
+        {
+            iObserver->HandleExitL();
+        }
+        else
+        {
+            //
+            //
+            //
+        }
+        break;
+    }
+}
+
+void CMIDAppUi::HandleSwitchOnEventL(CCoeControl*)
+{
+    if (iObserver)
+    {
+        iObserver->HandleSwitchOnEventL();
+    }
+    else
+    {
+        //
+        //
+        //
+    }
+}
+
+void CMIDAppUi::HandleForegroundEventL(TBool aForeground)
+{
+    if (iObserver)
+    {
+        iObserver->HandleForegroundL(aForeground);
+    }
+    else
+    {
+        //
+        //
+        //
+    }
+}
+
+void CMIDAppUi::HandleResourceChangeL(TInt aType)
+{
+    if (iObserver)
+    {
+        iObserver->HandleResourceChangeL(aType);
+    }
+    else
+    {
+        if (aType == KEikDynamicLayoutVariantSwitch)
+        {
+            // Observer not set yet. Storing it for use after it is set.
+            iPendingOrientationChange= ETrue;
+        }
+    }
+}
+
+void CMIDAppUi::HandleApplicationSpecificEventL(TInt /*aType*/, const TWsEvent& /*aEvent*/)
+{
+}
+
+TBool CMIDAppUi::HandleWsEventL(const TWsEvent& aEvent,
+                                CCoeControl* /*aDestination*/)
+{
+
+    // Intercept end-key press when the Nokia-MIDlet-no-exit JAD-attribute is defined.
+    // Intercept the WS event in case of red end-key press
+    if (aEvent.Type() == KAknUidValueEndKeyCloseEvent)
+    {
+        // If JAD attribute Nokia-MIDlet-no-exit is defined, it will be used define End-key behavior
+        if (iEnv && iEnv->MidletAttributeIsSetToVal(
+                    LcduiMidletAttributes::KAttribNoExitKey,
+                    LcduiMidletAttributeValues::KTrueValue))
+        {
+            return ETrue;
+        }
+        else
+        {
+            // No JAD attribute. Ask the CoreUi to shutdown the MIDlet.
+            java::ui::CoreUiAvkonLcdui::getInstance().shutDownRequestFromWindowServer();
+        }
+    }
+
+    if (aEvent.Type() == EEventUser)
+    {
+        TApaSystemEvent* eventData = reinterpret_cast<TApaSystemEvent*>(aEvent.EventData());
+        if ((*eventData) == EApaSystemEventShutdown)
+        {
+#ifdef RD_JAVA_NGA_ENABLED
+            // Check the reason
+            eventData++;
+            if ((*eventData) == KGoomMemoryLowEvent)
+            {
+                return HandleGoomMemoryLowEventL();
+            }
+#endif // RD_JAVA_NGA_ENABLED    
+            // Oom or exit from task-list. Ask the CoreUi to shutdown the MIDlet.
+            java::ui::CoreUiAvkonLcdui::getInstance().shutDownRequestFromWindowServer();
+        }
+    }
+
+    // Workaround to send pauseApp with long-press of the Menu key
+    // if no event was send yet
+    if (aEvent.Type() == EEventKey)
+    {
+        if (aEvent.Key()->iScanCode == EStdKeyApplication0
+                && aEvent.Key()->iRepeats == 1 && !iPauseApp)
+        {
+            if (iEnv && iEnv->MidletAttributeIsSetToVal(
+                        LcduiMidletAttributes::KAttribFlipClose,
+                        LcduiMidletAttributeValues::KPauseValue))
+            {
+                iEnv->PostMidletEvent(EPause);
+                SetPauseAppState(ETrue);
+            }
+        }
+    }
+
+    if (aEvent.Type() == EEventKeyUp)
+    {
+
+        if (aEvent.Key()->iScanCode == EStdKeyDeviceA)   // if flip is opened
+        {
+            if (iEnv && iEnv->MidletAttributeIsSetToVal(
+                        LcduiMidletAttributes::KAttribFlipClose,
+                        LcduiMidletAttributeValues::KPauseValue))
+
+            {
+                iEnv->PostMidletEvent(EStart);
+            }
+        }
+
+        if (aEvent.Key()->iScanCode == EStdKeyDeviceB)   // if flip is closed
+        {
+            if (iEnv && iEnv->MidletAttributeIsSetToVal(
+                        LcduiMidletAttributes::KAttribFlipClose,
+                        LcduiMidletAttributeValues::KPauseValue))
+            {
+                iEnv->PostMidletEvent(EPause);
+            }
+        }
+    }
+
+    if (aEvent.Type() == EEventKeyDown)
+    {
+        if (iEnv)
+        {
+            iEnv->SetLastKeyEvent(*aEvent.Key());
+        }
+    }
+
+    // Handle application focus lost and notify current Displayable.
+    if ((aEvent.Type() == KAknFullOrPartialForegroundLost)
+            || (aEvent.Type() == EEventFocusLost))
+    {
+#ifdef RD_JAVA_NGA_ENABLED
+        if (aEvent.Type() == KAknFullOrPartialForegroundLost && iObserver)
+        {
+            iObserver->HandleFullOrPartialForegroundL(EFalse);
+        }
+#endif // RD_JAVA_NGA_ENABLED
+
+        if (iCurrentDisplayable && (iDisplayables.Count() > 0))
+        {
+            iCurrentDisplayable->HandleApplicationBackground();
+        }
+    }
+
+    // Handle input language change and notify current Displayable
+    if (aEvent.Type() == KEikInputLanguageChange)
+    {
+        if (iCurrentDisplayable)
+        {
+            iCurrentDisplayable->HandleResourceChange(aEvent.Type());
+        }
+    }
+
+#ifdef RD_JAVA_NGA_ENABLED
+    if (aEvent.Type() == KAknFullOrPartialForegroundGained && iObserver)
+    {
+        iObserver->HandleFullOrPartialForegroundL(ETrue);
+    }
+#endif // RD_JAVA_NGA_ENABLED
+
+    return EFalse;
+}
+
+// Sets the link to MMIDEnv - used for jad attribute parsing
+void CMIDAppUi::SetEnv(MMIDEnv& aEnv)
+{
+    iEnv = &aEnv;
+}
+
+void CMIDAppUi::UnSetEnv()
+{
+    iEnv = 0;
+}
+
+#ifdef RD_JAVA_NGA_ENABLED
+TBool CMIDAppUi::HandleGoomMemoryLowEventL()
+{
+    if (iObserver)
+    {
+        iObserver->HandleFreeGraphicsMemory();
+        RGOomMonitorSession session;
+        User::LeaveIfError(session.Connect());
+        session.ThisAppIsNotExiting(CCoeEnv::Static()->RootWin().Identifier());
+        session.Close();
+        return ETrue;
+    }
+    return EFalse;
+}
+#endif // RD_JAVA_NGA_ENABLED
+
+//
+// From MLcduiPlugin
+//
+void CMIDAppUi::SetObserverL(MMIDObserver* aObserver)
+{
+    iObserver = aObserver;
+    if (iPendingOrientationChange)
+    {
+        // We have received orientation change during the construction phase.
+        // Resending it again in order to ensure correct layout and
+        // orientation.
+        iObserver->HandleResourceChangeL(KEikDynamicLayoutVariantSwitch);
+        iPendingOrientationChange = EFalse;
+    }
+}
+
+//
+// From MLcduiPlugin
+//
+MMIDComponentFactory* CMIDAppUi::CreateComponentFactoryL()
+{
+    return new(ELeave) CMIDComponentFactory;
+}
+
+//
+// From MLcduiPlugin
+//
+void CMIDAppUi::SetEnv(MMIDEnv* aEnv)
+{
+    iEnv = aEnv;
+}
+
+RPointerArray<CMIDDisplayable>& CMIDAppUi::Displayables()
+{
+    return iDisplayables;
+}
+
+void CMIDAppUi::AddToStackL(CCoeControl *aControl, TInt aPriority, TInt aStackingFlags)
+{
+    JELOG2(EJavaUI);
+    mJavaAppUi->AddToStackL(aControl, aPriority, aStackingFlags);
+}
+
+TRect CMIDAppUi::ApplicationRect() const
+{
+    JELOG2(EJavaUI);
+    return mJavaAppUi->ApplicationRect();
+}
+
+TRect CMIDAppUi::ClientRect() const
+{
+    JELOG2(EJavaUI);
+    return mJavaAppUi->ClientRect();
+}
+
+CAknToolbar* CMIDAppUi::CurrentFixedToolbar() const
+{
+    JELOG2(EJavaUI);
+    return mJavaAppUi->CurrentFixedToolbar();
+}
+
+void CMIDAppUi::RemoveFromStack(CCoeControl *aControl)
+{
+    JELOG2(EJavaUI);
+    mJavaAppUi->RemoveFromStack(aControl);
+}
+
+CEikStatusPane* CMIDAppUi::StatusPane()
+{
+    JELOG2(EJavaUI);
+    return mJavaAppUi->StatusPane();
+}
+
+void CMIDAppUi::SetPauseAppState(TBool aState)
+{
+    JELOG2(EJavaUI);
+    iPauseApp = aState;
+}
+
+TBool CMIDAppUi::GetPauseAppState()
+{
+    JELOG2(EJavaUI);
+    return iPauseApp;
+}
+