Committed Simon's splash screen for Issue 130

git-svn-id: https://zxing.googlecode.com/svn/trunk@833 59b500cc-1b3d-0410-9834-0bbf25fbcc57
This commit is contained in:
srowen 2009-01-30 16:04:03 +00:00
parent 4d225d48e1
commit d1cae5a9b2
3 changed files with 143 additions and 4 deletions

View file

@ -14,6 +14,7 @@ Matthew Schulkind (Google)
Matt York (LifeMarks) Matt York (LifeMarks)
Mohamad Fairol Mohamad Fairol
Paul Hackenberger Paul Hackenberger
sanfordsquires (?) Sanford Squires
Sean Owen (Google) Sean Owen (Google)
Simon Flannery (Ericsson)
Vince Francis (LifeMarks) Vince Francis (LifeMarks)

View file

@ -0,0 +1,127 @@
/*
* Copyright 2009 ZXing authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.google.zxing.client.j2me;
import javax.microedition.lcdui.Canvas;
import javax.microedition.lcdui.Font;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;
/**
* <p>Any professional software renders a "splash" screen which not only looks
* great, but also keeps a user entertained (and instantly acknowledging the
* user's request to load the application) while important application
* background initialisation takes place.</p>
*
* @author Simon Flannery (Ericsson)
*/
class SplashThread extends Canvas implements Runnable {
private final ZXingMIDlet zXingMIDlet;
private final long tout;
private final Image image;
/**
* Creates a new Splash Canvas with the given Parent Form and self Time out
* dismissal. The Time out is described in milliseconds. If the Time out is
* assigned Zero, then the Splash Screen will NOT Self dismiss!
*
* When the Splash Screen is dismissed, the splashDone method of the parent form
* is called.
*
* The Splash screen may be dismissed using any of the following procedures:
* (1) The specified timeout has elapsed. (Recommended). If Time out is zero
* however, then the timeout is not taken into consideration and the Splash
* screen simply waits (forever) until notified (see below)!
* (2) By invoking the stop method. (Recommended). This would be used to
* prematurely dismiss the splash screen BEFORE timeout has been reached
* or if a timeout of Zero was given.
*
* @param parent ZXing MIDlet Parent.
* @param timeOut timeout in milliseconds.
* @param splashImage image to display.
*/
SplashThread(ZXingMIDlet parent, long timeOut, Image splashImage) {
zXingMIDlet = parent;
tout = timeOut;
image = splashImage;
setFullScreenMode(true);
new Thread(this).start();
}
/**
* Thread Implementation Required. Invoked via calling start method.
* DO NOT manually call this method!
*/
public void run() {
synchronized (this) {
try {
repaint();
wait(tout); // Let's wake up
} catch (InterruptedException ie) {
// will not occur in MIDP, no thread interrupt method
}
}
zXingMIDlet.splashDone();
}
/**
* Allows Early dismissal of the splash Screen, for example, when all background
* initialisations are complete.
*/
public void stop() {
// Invoke the notify method of the Splash Object ("and the correct thread just
// happens to be arbitrarily chosen as the thread to be awakened"), and thus
// dismiss the Splash Screen. The current implementation only uses a single
// thread, so invoking the notify method should work, however, the
// implementation may change in the future. Thus lets' make use of the
// notifyAll method of the Splash Object.
synchronized (this) {
notifyAll(); // Wake everyone up
}
}
/**
* Must provide this implementation - used to paint the canvas.
*
* @param g Some Canvas Graphics.
*/
public void paint(Graphics g) {
int width = getWidth();
int height = getHeight();
g.setColor(0x00FFFFFF);
g.fillRect(0, 0, width, height);
if (image != null) {
g.drawImage(image, width / 2, height / 2, Graphics.VCENTER | Graphics.HCENTER);
}
Font F = Font.getFont(Font.FACE_SYSTEM, Font.STYLE_BOLD, Font.SIZE_SMALL);
g.setFont(F);
g.setColor(0x00000000);
String vendor = zXingMIDlet.getAppProperty("MIDlet-Description");
if (vendor != null) {
g.drawString(vendor, width / 2, height - (height / 8), Graphics.BOTTOM | Graphics.HCENTER);
}
}
}

View file

@ -26,6 +26,7 @@ import com.google.zxing.client.result.TelParsedResult;
import com.google.zxing.client.result.ProductParsedResult; import com.google.zxing.client.result.ProductParsedResult;
import com.google.zxing.client.result.URIParsedResult; import com.google.zxing.client.result.URIParsedResult;
import javax.microedition.lcdui.Image;
import javax.microedition.io.ConnectionNotFoundException; import javax.microedition.io.ConnectionNotFoundException;
import javax.microedition.lcdui.Alert; import javax.microedition.lcdui.Alert;
import javax.microedition.lcdui.AlertType; import javax.microedition.lcdui.AlertType;
@ -77,6 +78,9 @@ public final class ZXingMIDlet extends MIDlet {
protected void startApp() throws MIDletStateChangeException { protected void startApp() throws MIDletStateChangeException {
try { try {
Image image = Image.createImage("/res/zxing-icon.png");
SplashThread splash = new SplashThread(this, 2000, image);
Display.getDisplay(this).setCurrent(splash);
player = createPlayer(); player = createPlayer();
player.realize(); player.realize();
MultimediaManager multimediaManager = buildMultimediaManager(); MultimediaManager multimediaManager = buildMultimediaManager();
@ -88,9 +92,6 @@ public final class ZXingMIDlet extends MIDlet {
videoControl.initDisplayMode(VideoControl.USE_DIRECT_VIDEO, canvas); videoControl.initDisplayMode(VideoControl.USE_DIRECT_VIDEO, canvas);
videoControl.setDisplayLocation(0, 0); videoControl.setDisplayLocation(0, 0);
videoControl.setDisplaySize(canvas.getWidth(), canvas.getHeight()); videoControl.setDisplaySize(canvas.getWidth(), canvas.getHeight());
videoControl.setVisible(true);
player.start();
Display.getDisplay(this).setCurrent(canvas);
} catch (IOException ioe) { } catch (IOException ioe) {
throw new MIDletStateChangeException(ioe.toString()); throw new MIDletStateChangeException(ioe.toString());
} catch (MediaException me) { } catch (MediaException me) {
@ -109,6 +110,16 @@ public final class ZXingMIDlet extends MIDlet {
alert.setTimeout(ALERT_TIMEOUT_MS); alert.setTimeout(ALERT_TIMEOUT_MS);
} }
void splashDone() {
try {
videoControl.setVisible(true);
player.start();
} catch (MediaException me) {
// continue
}
Display.getDisplay(this).setCurrent(canvas);
}
private static Player createPlayer() throws IOException, MediaException { private static Player createPlayer() throws IOException, MediaException {
// Try a workaround for Nokias, which want to use capture://image in some cases // Try a workaround for Nokias, which want to use capture://image in some cases
Player player = null; Player player = null;