diff -r ae942d28ec0e -r 2455ef1f5bbc javauis/lcdui_akn/lcdui/src/CMIDAppUi.cpp --- /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 +#include +#include +#include +#include +// needed for javaregistry +#include +#include +#include +#ifdef RD_JAVA_NGA_ENABLED +#include +#include +#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(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& 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; +} +