/* * * * Copyright 1990-2009 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License version * 2 only, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License version 2 for more details (a copy is * included at /legal/license.txt). * * You should have received a copy of the GNU General Public License * version 2 along with this work; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA * * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa * Clara, CA 95054 or visit www.sun.com if you need additional * information or have any questions. */ package com.sun.midp.main; import com.sun.midp.events.EventQueue; import com.sun.midp.events.EventTypes; import com.sun.midp.events.Event; import com.sun.midp.events.NativeEvent; import com.sun.midp.events.EventListener; import com.sun.midp.log.Logging; import com.sun.midp.log.LogChannels; import com.sun.midp.configurator.Constants; /** * Provides initial event processing for MIDletProxyList. * This class is a listener that receives events and redirects them to * an appropriate MIDletControllerEventConsumer I/F implementor * (typically it is MIDletProxyList). */ class MIDletControllerEventListener implements EventListener { /** Consumer that will process events */ private MIDletControllerEventConsumer midletControllerEventConsumer; /** * Default package private constructor. * Shall be called by MIDletProxyList. * This object shall be instantiated in MIDletProxyList's constructor. * * @param eventQueue reference to the event queue * @param theMIDletControllerEventConsumer comsumer that will process * events received by this listener */ MIDletControllerEventListener( EventQueue eventQueue, MIDletControllerEventConsumer theMIDletControllerEventConsumer) { midletControllerEventConsumer = theMIDletControllerEventConsumer; eventQueue.registerEventListener( EventTypes.MIDLET_CREATED_NOTIFICATION, this); eventQueue.registerEventListener( EventTypes.MIDLET_ACTIVE_NOTIFICATION, this); eventQueue.registerEventListener( EventTypes.MIDLET_PAUSED_NOTIFICATION, this); eventQueue.registerEventListener( EventTypes.MIDLET_DESTROYED_NOTIFICATION, this); eventQueue.registerEventListener( EventTypes.MIDLET_RS_PAUSED_NOTIFICATION, this); eventQueue.registerEventListener( EventTypes.MIDLET_RESUME_REQUEST, this); eventQueue.registerEventListener( EventTypes.DISPLAY_CREATED_NOTIFICATION, this); eventQueue.registerEventListener( EventTypes.FOREGROUND_REQUEST_EVENT, this); eventQueue.registerEventListener( EventTypes.BACKGROUND_REQUEST_EVENT, this); eventQueue.registerEventListener( EventTypes.SHUTDOWN_EVENT, this); eventQueue.registerEventListener( EventTypes.SELECT_FOREGROUND_EVENT, this); eventQueue.registerEventListener( EventTypes.FOREGROUND_TRANSFER_EVENT, this); eventQueue.registerEventListener( EventTypes.SET_FOREGROUND_BY_NAME_REQUEST, this); eventQueue.registerEventListener( EventTypes.PREEMPT_EVENT, this); eventQueue.registerEventListener( EventTypes.MIDLET_START_ERROR_EVENT, this); eventQueue.registerEventListener( EventTypes.MIDLET_DESTROY_REQUEST_EVENT, this); eventQueue.registerEventListener( EventTypes.ACTIVATE_ALL_EVENT, this); eventQueue.registerEventListener( EventTypes.PAUSE_ALL_EVENT, this); eventQueue.registerEventListener( EventTypes.FATAL_ERROR_NOTIFICATION, this); } /** * Preprocess an event that is being posted to the event queue. * * @param event event being posted * * @param waitingEvent previous event of this type waiting in the * queue to be processed * * @return true to allow the post to continue, false to not post the * event to the queue */ public boolean preprocess(Event event, Event waitingEvent) { return true; } /** * Processes events. * <p> * Upon receiving a MIDlet created event a new MIDlet proxy will be * added to the list and the midletAdded method of all listeners will be * called with the new proxy. * <p> * Upon receiving a MIDlet destroyed event the MIDlet proxy corresponding * to the destroyed MIDlet will be removed from the list and the * midletRemoved method of all listeners * will be called with the removed proxy. * <p> * Upon receiving a MIDlet paused event the MIDlet proxy corresponding * to the paused MIDlet will have its midletState field set to * PAUSED and the midletUpdated method of all listeners * will be called with the updated proxy. * <p> * Upon receiving a foreground request event the MIDlet proxy corresponding * to the MIDlet requesting to be moved to the foreground will have its * wantsForeground field set to true and the midletUpdated method of all * listeners will be called with the updated proxy. * <p> * Upon receiving a background request event the MIDlet proxy corresponding * to the MIDlet requesting to be moved to the background will have its * wantsForeground field set to false and the midletUpdated method of all * listeners will be called with the updated proxy. * * @param event event to process */ public void process(Event event) { try { NativeEvent nativeEvent = (NativeEvent)event; switch (nativeEvent.getType()) { case EventTypes.SHUTDOWN_EVENT: midletControllerEventConsumer.handleDestroyAllEvent(); return; case EventTypes.SELECT_FOREGROUND_EVENT: if (Constants.MEASURE_STARTUP) { // IMPL_NOTE: Usually MIDlet is explicitly switched to // background on a native event, e.g. HOME key pressing. // The native event handling is correct place to count // the time of background switching from. However, native // events handling is platform dependent, and in this way // we have to instrument lot of platform code. That's why // we selected this place as the the first shared place // to start the measuring from. The measured time is // less than the time experienced by user by the time to // map native event to MIDP SELECT_FOREGROUND_EVENT System.err.println("Switch To Background Time: Begin at " + System.currentTimeMillis()); } midletControllerEventConsumer. handleMIDletForegroundSelectEvent(nativeEvent.intParam1); return; case EventTypes.FOREGROUND_TRANSFER_EVENT: midletControllerEventConsumer. handleMIDletForegroundTransferEvent( nativeEvent.intParam1, nativeEvent.stringParam1, nativeEvent.intParam2, nativeEvent.stringParam2); return; case EventTypes.SET_FOREGROUND_BY_NAME_REQUEST: midletControllerEventConsumer. handleSetForegroundByNameRequestEvent( nativeEvent.intParam1, nativeEvent.stringParam1); return; case EventTypes.PREEMPT_EVENT: if (nativeEvent.intParam2 != 0) { midletControllerEventConsumer. handleDisplayPreemptStartEvent( nativeEvent.intParam1, nativeEvent.intParam4); } else { midletControllerEventConsumer. handleDisplayPreemptStopEvent( nativeEvent.intParam1, nativeEvent.intParam4); } return; case EventTypes.MIDLET_CREATED_NOTIFICATION: midletControllerEventConsumer.handleMIDletCreateNotifyEvent( nativeEvent.intParam1, nativeEvent.stringParam1, nativeEvent.intParam2, nativeEvent.intParam3, nativeEvent.stringParam2); return; case EventTypes.MIDLET_ACTIVE_NOTIFICATION: midletControllerEventConsumer.handleMIDletActiveNotifyEvent( nativeEvent.intParam1, nativeEvent.stringParam1); return; case EventTypes.MIDLET_PAUSED_NOTIFICATION: midletControllerEventConsumer.handleMIDletPauseNotifyEvent( nativeEvent.intParam1, nativeEvent.stringParam1); return; case EventTypes.MIDLET_DESTROYED_NOTIFICATION: midletControllerEventConsumer.handleMIDletDestroyNotifyEvent( nativeEvent.intParam1, nativeEvent.stringParam1); return; case EventTypes.MIDLET_RESUME_REQUEST: midletControllerEventConsumer.handleMIDletResumeRequestEvent( nativeEvent.intParam1, nativeEvent.stringParam1); return; case EventTypes.MIDLET_RS_PAUSED_NOTIFICATION: midletControllerEventConsumer.handleMIDletRsPauseNotifyEvent( nativeEvent.intParam1, nativeEvent.stringParam1); return; case EventTypes.DISPLAY_CREATED_NOTIFICATION: midletControllerEventConsumer.handleDisplayCreateNotifyEvent( nativeEvent.intParam1, nativeEvent.intParam2, nativeEvent.stringParam1); return; case EventTypes.FOREGROUND_REQUEST_EVENT: midletControllerEventConsumer. handleDisplayForegroundRequestEvent( nativeEvent.intParam1, nativeEvent.intParam4, (nativeEvent.intParam2 != 0)); return; case EventTypes.BACKGROUND_REQUEST_EVENT: midletControllerEventConsumer. handleDisplayBackgroundRequestEvent( nativeEvent.intParam1, nativeEvent.intParam4); return; case EventTypes.MIDLET_START_ERROR_EVENT: midletControllerEventConsumer.handleMIDletStartErrorEvent( nativeEvent.intParam1, nativeEvent.stringParam1, nativeEvent.intParam2, nativeEvent.intParam3, nativeEvent.stringParam2); return; case EventTypes.MIDLET_DESTROY_REQUEST_EVENT: midletControllerEventConsumer.handleMIDletDestroyRequestEvent( nativeEvent.intParam1, nativeEvent.intParam4); return; case EventTypes.ACTIVATE_ALL_EVENT: midletControllerEventConsumer.handleActivateAllEvent(); return; case EventTypes.PAUSE_ALL_EVENT: midletControllerEventConsumer.handlePauseAllEvent(); return; case EventTypes.FATAL_ERROR_NOTIFICATION: midletControllerEventConsumer.handleFatalErrorNotifyEvent( nativeEvent.intParam1, nativeEvent.intParam4); return; default: if (Logging.REPORT_LEVEL <= Logging.WARNING) { Logging.report(Logging.WARNING, LogChannels.LC_CORE, "unknown event (" + event.getType() + ")"); } return; } } catch (Throwable t) { if (Logging.TRACE_ENABLED) { Logging.trace(t, "Error occurred processing MIDlet event " + event.getType()); } } } }