package com.nutiteq.helpers;
import java.util.Vector;
import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.CommandListener;
import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.List;
import com.nutiteq.bluetooth.BluetoothAPIDevice;
import com.nutiteq.bluetooth.BluetoothDevice;
import com.nutiteq.bluetooth.BluetoothHandler;
import com.nutiteq.bluetooth.DiscoveredDevice;
import com.nutiteq.core.MappingCore;
import com.nutiteq.location.LocationSourceWaiter;
import com.nutiteq.location.providers.BluetoothProvider;
import com.nutiteq.location.providers.LocationDataConnectionProvider;
import com.nutiteq.task.LocalTask;
/**
* Generic bluetooth GPS selector implemented using J2ME high level UI elements.
*/
public class BluetoothGpsBrowser extends List implements CommandListener, LocalTask,
BluetoothHandler {
private final LocationSourceWaiter sourceWaiter;
private final Command select;
private final Command back;
private final String searchingMessage;
private BluetoothDevice device;
private DiscoveredDevice[] found;
private final String noDevicesFoundMessage;
/**
* Create new browser that will be shown on screen.
*
* @param title
* form title
* @param sourceWaiter
* calling class waiting for location source
* @param searchingMessage
* message shown while devices search is in progress
* @param noDevicesFoundMessage
* message shown if no devices found
* @param selectCommandLabel
* label on select command
* @param backCommandLabel
* label on back command
*/
public BluetoothGpsBrowser(final String title, final LocationSourceWaiter sourceWaiter,
final String searchingMessage, final String noDevicesFoundMessage,
final String selectCommandLabel, final String backCommandLabel) {
super(title, List.IMPLICIT);
this.sourceWaiter = sourceWaiter;
this.searchingMessage = searchingMessage;
this.noDevicesFoundMessage = noDevicesFoundMessage;
append(searchingMessage, null);
select = new Command(selectCommandLabel, Command.OK, 0);
back = new Command(backCommandLabel, Command.BACK, 0);
addCommand(back);
setCommandListener(this);
MappingCore.getInstance().runAsync(this);
}
public void execute() {
device = new BluetoothAPIDevice(this);
device.findRemoteDevices();
}
public void commandAction(final Command cmd, final Displayable d) {
if (cmd == back) {
sourceWaiter.browsingCanceled();
} else if (cmd == select) {
final int index = getSelectedIndex();
final BluetoothProvider bluetoothProvider = new BluetoothProvider(
(LocationDataConnectionProvider) device, found[index].getUrl());
sourceWaiter.setLocationSource(bluetoothProvider);
}
}
public void remoteDevicesFound(final DiscoveredDevice[] devicesFound) {
final Vector appended = new Vector();
deleteAll();
boolean added = false;
for (int i = 0; i < devicesFound.length; i++) {
final DiscoveredDevice discoveredDevice = devicesFound[i];
if (discoveredDevice.getUrl() == null) {
continue;
}
added = true;
append(discoveredDevice.getName(), null);
appended.addElement(discoveredDevice);
}
found = new DiscoveredDevice[appended.size()];
appended.copyInto(found);
if (added) {
addCommand(select);
setSelectCommand(select);
} else {
append(noDevicesFoundMessage, null);
}
}
}