package com.rapidftr.controls; import net.rim.device.api.ui.Color; import net.rim.device.api.ui.Field; import net.rim.device.api.ui.Graphics; import net.rim.device.api.ui.component.ButtonField; public class AudioControl extends ButtonField { private static final int WIDTH = 20; private static final int HEIGHT = 20; private State state; private final AudioRecordListener listener; public AudioControl(AudioRecordListener listener) { super(Field.FOCUSABLE | ButtonField.CONSUME_CLICK); this.listener = listener; this.state=State.STOPPED; } protected void layout(int width, int height) { this.setExtent(WIDTH, HEIGHT); } protected boolean navigationClick(int status, int time){ state=state.nextState(listener); this.invalidate(); return true; } protected void paint(Graphics graphics) { state.drawControl(graphics); } private static abstract class State { abstract void drawControl(Graphics graphics); abstract State nextState(AudioRecordListener listener); static final State PLAYING = new State() { public void drawControl(Graphics graphics) { graphics.setColor(Color.RED); graphics.fillRect(0, 0, WIDTH, HEIGHT); } public State nextState(AudioRecordListener listener) { listener.stop(); return State.STOPPED; } }; static final State STOPPED = new State() { public void drawControl(Graphics graphics) { graphics.setColor(Color.GREEN); graphics.fillRoundRect(0, 0, WIDTH, HEIGHT, WIDTH, HEIGHT); } public State nextState(AudioRecordListener listener) { return listener.start() ? PLAYING : STOPPED; } }; } }