SplashCanvas.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.attractions;

import com.nokia.example.attractions.utils.ImageLoader;
import java.io.IOException;
import java.util.Timer;
import java.util.TimerTask;
import javax.microedition.lcdui.Font;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;
import javax.microedition.lcdui.game.GameCanvas;
import javax.microedition.lcdui.game.Sprite;

/**
 * Splash view. Shows application name and loading animation while
 * initializing resources.
 */
public final class SplashCanvas
    extends GameCanvas {

    private static SplashCanvas self = null;
    private Image image;
    private static final String UPPER_TITLE = "Tourist";
    private static final String LOWER_TITLE = "Attractions";
    private static final int LOADER_HEIGHT = 28;
    private Sprite loaderSprite;
    private Timer animationTimer;
    private int width;
    private int height;
    private Graphics g;
    private final Font upperTitleFont = Visual.TITLE_FONT;
    private final Font lowerTitleFont = Visual.MEDIUM_BOLD_FONT;
    private final int upperTitleHeight = upperTitleFont.getHeight();
    private final int lowerTitleHeight = lowerTitleFont.getHeight();
    private int textAreaPadding;
    private int textAreaHeight;
    private int backgroundHeight;
    private volatile boolean hidden = true;

    private SplashCanvas() {
        super(false);
        setFullScreenMode(true);
    }

    public boolean isHidden() {
        return hidden;
    }

    /**
     * @return SplashCanvas singleton
     */
    public static SplashCanvas getInstance() {
        if (self == null) {
            self = new SplashCanvas();
        }
        return self;
    }

    /**
     * @see GameCanvas#showNotify()
     */
    protected final void showNotify() {
        hidden = false;
        g = getGraphics();

        // S60 doesn't call sizeChanged on start-up so it has to be called here.
        sizeChanged(getWidth(), getHeight());

        draw();
        animationTimer = new Timer();
        animationTimer.schedule(new TimerTask() {

            public void run() {
                draw();
            }
        }, 50, 50);
    }

    /**
     * @see GameCanvas#hideNotify()
     */
    protected final void hideNotify() {
        hidden = true;
        animationTimer.cancel();
        animationTimer = null;
        image = null;
        loaderSprite = null;
        System.gc();
    }

    /**
     * @see GameCanvas#sizeChanged(int, int)
     */
    protected final void sizeChanged(int w, int h) {
        width = w;
        height = h;
        textAreaPadding = 8;
        textAreaHeight = textAreaPadding + upperTitleHeight + 2
            + lowerTitleHeight + textAreaPadding + 4 + LOADER_HEIGHT;
        if (textAreaHeight < height / 3) {
            textAreaPadding += (height / 3 - textAreaHeight) / 2;
            textAreaHeight = height / 3;
        }
        backgroundHeight = (height - textAreaHeight) / 2;
    }

    private void draw() {
        //Draw background
        g.setColor(Visual.SPLASH_BACKGROUND_COLOR);
        g.fillRect(0, 0, width, height);

        if (image == null) {
            try {
                image = ImageLoader.getInstance().loadImage(
                    "/attractions_2.0.png", null);
            }
            catch (IOException e) {
            }
        }

        //Draw the image
        if (image != null) {
            if (image.getWidth() != width || image.getHeight() != backgroundHeight
                + 2) {
                image = ImageLoader.scaleImage(image, width, backgroundHeight
                    + 2);
            }
            g.drawImage(image, 0, height, Graphics.BOTTOM | Graphics.LEFT);
        }

        //Draw text background
        int y = backgroundHeight;
        g.setColor(Visual.DARK_BACKGROUND_COLOR);
        g.fillRect(0, y, width, textAreaHeight);

        //Draw text
        g.setColor(Visual.SPLASH_TEXT_COLOR);
        y += textAreaPadding;
        g.setFont(upperTitleFont);
        g.drawString(UPPER_TITLE, width / 2, y, Graphics.TOP | Graphics.HCENTER);
        y += upperTitleHeight + 2;
        g.setFont(lowerTitleFont);
        g.drawString(LOWER_TITLE, width / 2, y, Graphics.TOP | Graphics.HCENTER);
        y += lowerTitleHeight + 4;

        if (loaderSprite == null) {
            try {
                Image i =
                    ImageLoader.getInstance().loadImage("/loader_main.png", null);
                loaderSprite = new Sprite(i, i.getWidth() / 24, i.getHeight());
            }
            catch (IOException e) {
            }
        }

        if (loaderSprite != null) {
            loaderSprite.nextFrame();
            loaderSprite.setPosition((width - loaderSprite.getWidth()) / 2, y);
            loaderSprite.paint(g);
        }

        flushGraphics();
    }

    /**
     * @see GameCanvas#pointerPressed(int, int)
     */
    protected final void pointerPressed(int x, int y) {
    }
}