package com.nutiteq.ui; import java.util.Timer; import java.util.TimerTask; import javax.microedition.lcdui.Font; import javax.microedition.lcdui.Graphics; import com.nutiteq.net.DownloadCounter; import com.nutiteq.net.NetworkListener; /** * Default overlay for showing network activity. */ public class NutiteqDownloadDisplay implements DownloadDisplay, NetworkListener { private static final int KILO_BYTE = 1024; private static final int MEGA_BYTE = 1024 * 1024; private DownloadCounter downloadCounter; private int lastPainted; private String downloaded = "0kB"; private boolean visible; private static final Font FONT = Font .getFont(Font.FACE_SYSTEM, Font.STYLE_PLAIN, Font.SIZE_SMALL); private static final long HIDE_TIME = 3000; private DisplayUpdater updater; private final Timer timer = new Timer(); private long hideCallTime; public void setDownloadCounter(final DownloadCounter counter) { downloadCounter = counter; downloadCounter.setNetworkListener(this); } public void setDisplayUpdater(final DisplayUpdater updater) { this.updater = updater; } public boolean isVisible() { return visible; } public void paint(final Graphics g, final int displayWidth, final int displayHeight) { if (lastPainted != downloadCounter.getDownloadedBytes()) { downloaded = bytesToHumanReadable(downloadCounter.getDownloadedBytes()); lastPainted = downloadCounter.getDownloadedBytes(); } g.setClip(0, 0, displayWidth, displayHeight); final int stringWidth = FONT.stringWidth(downloaded); g.setColor(0xFFFFFFFF); g.fillRect(displayWidth - stringWidth - 2, 0, stringWidth + 2, FONT.getHeight()); g.setFont(FONT); g.setColor(0xFF000000); g.drawString(downloaded, displayWidth, 0, Graphics.TOP | Graphics.RIGHT); } private String bytesToHumanReadable(final int downloadedBytes) { if (downloadedBytes < KILO_BYTE) { return Integer.toString(downloadedBytes) + " B"; } else if (downloadedBytes < MEGA_BYTE) { return Integer.toString(downloadedBytes / KILO_BYTE) + " kB"; } else { return formatWithPlacesAfterPoint(Float.toString(downloadedBytes / (float) MEGA_BYTE), 2) + " MB"; } } protected String formatWithPlacesAfterPoint(final String floatString, final int places) { final int indexOfP = floatString.indexOf("."); if (indexOfP < 0 || floatString.length() < indexOfP + 1 + places) { return floatString; } return floatString.substring(0, indexOfP + 1 + places); } public void downloadStarted() { if (!visible) { visible = true; if (updater != null) { updater.repaint(); } } } public void dataMoved() { hideCallTime = 0; if (updater != null) { updater.repaint(); } } public void downloadCompleted() { if (updater == null) { return; } hideCallTime = System.currentTimeMillis(); timer.schedule(new TimerTask() { public void run() { if (hideCallTime == 0 || System.currentTimeMillis() - hideCallTime < HIDE_TIME) { return; } visible = false; updater.repaint(); } }, HIDE_TIME); } }