SplashScreen.java

/*
 * Copyright © 2012 Nokia Corporation. All rights reserved.
 * Nokia and Nokia Connecting People are registered trademarks of Nokia Corporation.
 * Oracle and Java are trademarks or registered trademarks of Oracle and/or its
 * affiliates. Other product and company names mentioned herein may be trademarks
 * or trade names of their respective owners.
 * See LICENSE.TXT for license information.
 */

package com.nokia.example.amaze;

import java.io.IOException;

import javax.microedition.lcdui.Canvas;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;

/**
 * The splash screen. 
 */
public class SplashScreen extends Canvas {
	// Members
	private final Listener _listener;
	private Image _image;
	private final int _backgroundColor;
	private int _centerX;
	private int _centerY;
	
	/**
	 * Creates a splash screen to display the specified image and fills the
	 * background with the specified color.
	 * 
	 * @param backgroundColor The background color.
	 */
	public SplashScreen(Listener listener, final int backgroundColor) {
		setFullScreenMode(true);
		_listener = listener;
		_backgroundColor = backgroundColor;
	}

	/**
	 * From Canvas.
	 */
	protected void paint(Graphics graphics) {
		graphics.setColor(_backgroundColor);
		graphics.fillRect(0x00, 0x00, getWidth(), getHeight());

		if (_image != null) {
			graphics.drawImage(_image, _centerX, _centerY, 0x00);
		}
	}

	/**
	 * Loads the splash screen image.
	 * @param image The path of the image to load.
	 */
	public void loadImage(String image) {
		try {
			_image = Image.createImage(image);
			
			// Calculate the center position
			_centerX = (getWidth() - _image.getWidth()) / 2;
			_centerY = (getHeight() - _image.getHeight()) / 2;
		}
		catch (IOException e) {}
	}
	
	/**
	 * Shows the splash and changes to the specified displayable after the
	 * specified number of milliseconds.
	 * 
	 * @param display Current Display.
	 * @param next new Displayable.
	 * @param millis splash time in milliseconds.
	 */
	public void show(final Display display,
					 final Displayable next,
					 final long millis)
	{
		display.setCurrent(this);

		// Schedule next Displayable
		Thread t = new Thread(new Runnable() {
			public void run() {
				try {
					Thread.sleep(millis);
				} catch (InterruptedException e) {
					e.printStackTrace();
				} finally {
					display.setCurrent(next);
					
					if (_listener != null) {
						_listener.onFinished();
					}
				}
			}
		});
		t.start();
	}
	
	/**
	 * Interface for MIDlet so that it can know when the splash screen can be
	 * released for garbage collection.
	 */
	public interface Listener {
		void onFinished();
	}
}