/* * 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); } } }