001: /*
002: *
003: *
004: * Copyright 1990-2007 Sun Microsystems, Inc. All Rights Reserved.
005: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
006: *
007: * This program is free software; you can redistribute it and/or
008: * modify it under the terms of the GNU General Public License version
009: * 2 only, as published by the Free Software Foundation.
010: *
011: * This program is distributed in the hope that it will be useful, but
012: * WITHOUT ANY WARRANTY; without even the implied warranty of
013: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
014: * General Public License version 2 for more details (a copy is
015: * included at /legal/license.txt).
016: *
017: * You should have received a copy of the GNU General Public License
018: * version 2 along with this work; if not, write to the Free Software
019: * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
020: * 02110-1301 USA
021: *
022: * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
023: * Clara, CA 95054 or visit www.sun.com if you need additional
024: * information or have any questions.
025: */
026: package com.sun.midp.main;
027:
028: import java.util.*;
029:
030: /**
031: * This class controls which MIDlet's display is in the foreground.
032: * Running only in the AMS Isolate (0) the controller consulted by the MIDlet
033: * proxy list for any foreground when various state changes occur in a MIDlet.
034: * The display controller automatically selects the next foreground if
035: * needed.
036: * <p>
037: * From the user perspective when the last MIDlet the user launched is created,
038: * that MIDlet should automatically get the foreground (see the midletCreated
039: * and foregroundRequest methods).
040: * <p>
041: * A MIDlet that is paused or destroyed is treated as if it has requested the
042: * background as described above.
043: */
044: public class SMMDisplayController extends DisplayController {
045: /** Suite ID of the last MIDlet in foreground. */
046: private int lastMidletSuiteId;
047:
048: /** Class name of the last MIDlet in foreground. */
049: private String lastMidletClassName;
050:
051: /** This MIDlet should only get the foreground if it is the last MIDlet. */
052: private MIDletProxy lastMidletInForeground;
053:
054: /**
055: * Construct a DisplayController with a reference to the ProxyList.
056: *
057: * @param theMIDletProxyList reference to the MIDlet proxy list
058: * @param suiteId the suiteId of the last MIDlet in the foreground
059: * @param classname classname of the last MIDlet in the foreground
060: */
061: public SMMDisplayController(MIDletProxyList theMIDletProxyList,
062: int suiteId, String classname) {
063: super (theMIDletProxyList);
064: midletProxyList = theMIDletProxyList;
065: lastMidletSuiteId = suiteId;
066: lastMidletClassName = classname;
067: }
068:
069: /**
070: * Handles MIDlet background requests.
071: * <p>
072: * If the MIDlet requesting to be put in the background is the foreground
073: * MIDlet, then find a MIDlet to bring to the foreground (see the
074: * findNextForeground method).
075: *
076: * @param midlet The proxy of the MIDlet that was updated
077: *
078: * @return Proxy of the next foreground MIDlet, may be the foreground
079: * MIDlet if the foreground should not change
080: */
081: MIDletProxy backgroundRequest(MIDletProxy midlet) {
082: MIDletProxy foreground = midletProxyList.getForegroundMIDlet();
083:
084: if (midlet != foreground) {
085: // not in the foreground, so don't change the foreground
086: return foreground;
087: }
088:
089: return findNextForegroundMIDlet();
090: }
091:
092: /**
093: * Find a MIDlet that wants the foreground. If none wants the foreground
094: * then find one that is not paused, if no find one that is paused
095: * and wants the foreground, then find one that is paused. Only return the
096: * "last MIDlet to have the foreground" if there are not other MIDlets.
097: *
098: * @return new foreground task or null
099: */
100: private MIDletProxy findNextForegroundMIDlet() {
101: Enumeration midlets;
102:
103: // find the first task that is active and wants foreground
104: midlets = midletProxyList.getMIDlets();
105: while (midlets.hasMoreElements()) {
106: MIDletProxy current = (MIDletProxy) midlets.nextElement();
107:
108: if (current.getMidletState() != MIDletProxy.MIDLET_ACTIVE) {
109: continue;
110: }
111:
112: if (current.wantsForeground()
113: && current != getLastMidletInForeground()) {
114: return current;
115: }
116: }
117:
118: // find the first task that is active
119: midlets = midletProxyList.getMIDlets();
120: while (midlets.hasMoreElements()) {
121: MIDletProxy current = (MIDletProxy) midlets.nextElement();
122:
123: if (current.getMidletState() != MIDletProxy.MIDLET_ACTIVE
124: && current != getLastMidletInForeground()) {
125: return current;
126: }
127: }
128:
129: // find the first task that is paused and wants the foreground
130: midlets = midletProxyList.getMIDlets();
131: while (midlets.hasMoreElements()) {
132: MIDletProxy current = (MIDletProxy) midlets.nextElement();
133:
134: if (current.getMidletState() != MIDletProxy.MIDLET_PAUSED
135: && current != getLastMidletInForeground()) {
136: continue;
137: }
138:
139: if (current.wantsForeground()
140: && current != getLastMidletInForeground()) {
141: return current;
142: }
143: }
144:
145: // find the first task that is paused
146: midlets = midletProxyList.getMIDlets();
147: while (midlets.hasMoreElements()) {
148: MIDletProxy current = (MIDletProxy) midlets.nextElement();
149:
150: if (current.getMidletState() != MIDletProxy.MIDLET_PAUSED
151: && current != getLastMidletInForeground()) {
152: return current;
153: }
154: }
155:
156: return getLastMidletInForeground();
157: }
158:
159: /**
160: * Returns the last MIDlet to that should get the foreground.
161: *
162: * @return last MIDlet in foreground
163: */
164: private MIDletProxy getLastMidletInForeground() {
165: if (lastMidletInForeground == null) {
166: lastMidletInForeground = midletProxyList.findMIDletProxy(
167: lastMidletSuiteId, lastMidletClassName);
168: }
169:
170: return lastMidletInForeground;
171: }
172: }
|