Anexo 3 - Universidad de Sevilla

Anuncio
Implementación de aplicación BlackBerry para toma de datos de red
Sevilla, Febrero de 2009
Anexo 3: Código de la aplicación BlackBerry
Paquete org.us.fpl
Clase ClienteLocalizadorDatosRed
/*
* ClienteLocalizadorDatosRed.java
*
* Proyecto Fin de Carrera de Fernando Plaza López.
* Implementación de una aplicación BlackBerry para la lectura
* y geoposicionamiento de datos de red.
*
* Universidad de Sevilla, 2009
*/
package org.us.fpl;
import net.rim.device.api.ui.UiApplication;
import org.us.fpl.pantallas.PantallaConfiguracion;
import org.us.fpl.pantallas.PantallaPrincipal;
public class ClienteLocalizadorDatosRed extends UiApplication{
// Declaración de los objetos pantallas que se utilziarán en la aplicación
public PantallaPrincipal pantallaPrincipal = null;
public PantallaConfiguracion pantallaConfiguracion = null;
/**
* Constructor por defecto
*/
public ClienteLocalizadorDatosRed() {
}
/**
* Método main. En este método instanciaremos las pantallas a utlizar en la aplicación, pondremos la
* pantalla principal (que es la primera) en lo alto de la pila, y cederemos el control de la
* aplicación al usuario.
*/
public static void main(String[] args) {
try{
ClienteLocalizadorDatosRed theApp = new ClienteLocalizadorDatosRed();
theApp.lanza_pantalla();
// Con la llamada al método enterEventDispatcher cedemos el control al usuario
theApp.enterEventDispatcher();
}catch(Exception e){
System.err.println("Excepción en clase ppal, método main: " + e.toString());
}
}
/**
* Método para instanciar las pantallas que se utlizarán el la aplicación. Una vez instanciasdas, se pone
* en lo alto de la pila la primera que se vaya a utilizar.
*/
public void lanza_pantalla(){
Fernando Plaza López
Página 117
Implementación de aplicación BlackBerry para toma de datos de red
Sevilla, Febrero de 2009
pantallaPrincipal = new PantallaPrincipal(this);
pantallaConfiguracion = new PantallaConfiguracion(this);
try{
// Inicailizamos los componentes de la pantalla principal
pantallaPrincipal.inicializaPantalla();
// La pnemos en lo alto de la pila de pantallas
pushScreen(this.pantallaPrincipal);
}catch(Exception e){
System.err.println("Error al lanza_pantallas: " + e);
}
}
}
Paquete org.us.fpl.localizadorGPS
Clase Gps
/*
* Gps.java
*
* Proyecto Fin de Carrera de Fernando Plaza López.
* Implementación de una aplicación BlackBerry para la lectura
* y geoposicionamiento de datos de red.
*
* Universidad de Sevilla, 2009
*/
package org.us.fpl.localizadorGPS;
import java.util.Vector;
import javax.microedition.location.Location;
import javax.microedition.location.LocationException;
import javax.microedition.location.LocationListener;
import javax.microedition.location.LocationProvider;
import net.rim.device.api.system.GPRSInfo;
import net.rim.device.api.system.GPRSInfo.GPRSCellInfo;
import org.us.fpl.modeloDatos.ElementoLocalizacion;
public class Gps implements LocationListener {
// Declaración de un objeto estático del mismo tipo de la clase
// Se emplea para hacer un objeto de tipo singleton.
private static Gps gps;
private LocationProvider locationProvider;
// Datos realitivos a la periodicidad del GPS y a los intentos de arranque
private int periodoGPS = 10;
private int periodoReintentosArranque = 5000;
private int numReintentosArranque = 10000;
private int estado;
public static int ESTADO_PARADO = 0;
public static int ESTADO_ARRANCANDO = 1;
public static int ESTADO_EN_MARCHA = 2;
private Vector vectorLocalizaciones;
private Location ultimaLocalizacionLeida;
/**
Fernando Plaza López
Página 118
Implementación de aplicación BlackBerry para toma de datos de red
Sevilla, Febrero de 2009
* Se implementa el constructor por defecto para evitar su contrucción (es un singleton)
*/
private Gps() {
}
/**
* Recogemos el valor del periodo de GPS
*/
public int getPeriodoGPS() {
return periodoGPS;
}
/**
* Establecemos el valor del periodo de GPS
*/
public void setPeriodoGPS(int periodoGPS) {
this.periodoGPS = periodoGPS;
}
/**
* Recogemos la última localización leída
*/
public Location getUltimaLocalizacionLeida() {
return ultimaLocalizacionLeida;
}
/**
* Establecemos la última localización leída
*/
public void setUltimaLocalizacionLeida(Location ultimaLocalizacionLeida) {
this.ultimaLocalizacionLeida = ultimaLocalizacionLeida;
}
/**
* Recogemos el estado del GPS
*/
public int getEstado() {
return estado;
}
/**
* Establecemos el estado del GPS
*/
public void setEstado(int estado) {
this.estado = estado;
}
/**
* Recogemos el vector que contiene todas las posiciones alamacenadas
*/
public Vector getVectorLocalizaciones() {
return vectorLocalizaciones;
}
/**
* Establecemos el vector que contiene todas las posiciones alamacenadas
*/
public void setVectorLocalizaciones(Vector vectorLocalizaciones) {
this.vectorLocalizaciones = vectorLocalizaciones;
}
/**
* Guardamos en el vector de posiciones la nueva posición devuelta por el listener.
* Es aquí donde recogemos los datos de red y lo asociamos la posición que viene
* como parámetro
*/
private void añadeNuevaLocalizacion(Location elementoLocalizado) {
// Instanciamos un objeto de tipo GPRSCellInfo para recoger los datos de red
GPRSCellInfo celdaActual = GPRSInfo.getCellInfo();
ElementoLocalizacion nuevo = new ElementoLocalizacion(
elementoLocalizado);
// Guardaré los datos de red sólo sin no es null, ya que puede ocurrir
// que no tenga cobertura, etc..
if (celdaActual != null) {
nuevo.setCellId("" + celdaActual.getCellId());
Fernando Plaza López
Página 119
Implementación de aplicación BlackBerry para toma de datos de red
Sevilla, Febrero de 2009
nuevo.setBsic("" + celdaActual.getBSIC());
nuevo.setLac("" + celdaActual.getLAC());
nuevo.setRac("" + celdaActual.getRAC());
nuevo.setMnc("" + net.rim.device.api.system.GPRSInfo.getHomeMNC());
nuevo.setMcc("" + net.rim.device.api.system.GPRSInfo.getHomeMCC());
nuevo.setRssi(""+ net.rim.device.api.system.RadioInfo.getSignalLevel());
}
if (vectorLocalizaciones != null) {
System.out.println("Nueva posición añadida!");
this.vectorLocalizaciones.addElement(nuevo);
} else {
System.out.println("Nueva posición añadida!");
vectorLocalizaciones = new Vector();
this.vectorLocalizaciones.addElement(nuevo);
}
}
/**
* Asociamos el comentario introducido por el usuario a la última posición recogida
* por el listener del GPS
*/
public boolean insertaComentario(String comentario) {
boolean resultado;
ElementoLocalizacion ultimoElementoLocalizacion = null;
if (vectorLocalizaciones != null && !vectorLocalizaciones.isEmpty()) {
ultimoElementoLocalizacion = (ElementoLocalizacion) vectorLocalizaciones
.elementAt(vectorLocalizaciones.size() - 1);
ElementoLocalizacion nuevo = ultimoElementoLocalizacion
.clon(ultimoElementoLocalizacion);
nuevo.setComentario(comentario);
vectorLocalizaciones
.removeElementAt(vectorLocalizaciones.size() - 1);
vectorLocalizaciones.addElement(nuevo);
resultado = true;
} else {
resultado = false;
}
return resultado;
}
/**
* Devuelve una instancia de objeto GPS
*/
public synchronized static Gps getInstancia() {
if (gps == null) {
gps = new Gps();
}
return gps;
}
/**
* Inicia el GPS del dispositivo. Para ello, inicia un bucle donde se comprueba en cada
* iteración si el GPS ha arracado o tiene que intentarlo de nuevo, ya que el inicio
* del GPS no es inmediato.
*/
public void arrancar() {
if (estado != ESTADO_PARADO && estado != ESTADO_ARRANCANDO)
return;
estado = ESTADO_ARRANCANDO;
Fernando Plaza López
Página 120
Implementación de aplicación BlackBerry para toma de datos de red
Sevilla, Febrero de 2009
new Thread() {
public void run() {
int reintentos = 0;
while (inicializaLocationProvider() == false
&& (reintentos++ < numReintentosArranque)) {
try {
Thread.sleep(periodoReintentosArranque);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
if (reintentos >= numReintentosArranque) {
System.err.println("Se agotaron los reintentos de arranque del
GPS");
}
}
}.start();
}
/**
* Detiene el GPS del dispositivo. Para ello, establece todos los valores del listener
* que tenía asociado a null
*/
public void detener() {
if (locationProvider != null) {
try {
// Para detener el GPS hay que researlo primero, y establecer
// los valores del listener a -1 despues.
locationProvider.reset();
locationProvider.setLocationListener(null, -1, -1, -1);
locationProvider = null;
estado = ESTADO_PARADO;
} catch (Exception ex) {
System.err.println("Error general al conectar al provider: " + ex);
}
}
}
/**
* Intenta detectar si existe un objeto de tipo LocationProvider, que porporcione
* coberuraq GPS.
*/
private boolean inicializaLocationProvider() {
boolean retval = false;
try {
locationProvider = LocationProvider.getInstance(null);
if (locationProvider == null) {
// Si no encontramos proveedor de localización, nos salimos
} else {
// Hemos encontrado proveedor de localización
locationProvider.setLocationListener(this, periodoGPS,
periodoGPS, periodoGPS);
estado = ESTADO_EN_MARCHA;
retval = true;
}
} catch (LocationException le) {
System.err.println("Failed to instantiate the LocationProvider object, exiting...: "
+ le);
} catch (Exception ex) {
System.err.println("Error general al conectar al provider : " + ex);
}
return retval;
}
/**
* Método que recibe una locazación cada cierto tiempo. Ese tiempo es precisamente la
Fernando Plaza López
Página 121
Implementación de aplicación BlackBerry para toma de datos de red
Sevilla, Febrero de 2009
* periodicidad del GPS configurada desde la pantalla de configuración. De obligada implementación
* por extender la clase Gps a la interfaz LocationListener.
*/
public void locationUpdated(LocationProvider provider, Location location) {
// Si la localización no es válida, la ignoramos.
if (location.isValid()) {
ultimaLocalizacionLeida = location;
añadeNuevaLocalizacion(location);
}
}
/**
* Método que recibe notificaciones sobre el estado de cobertura del Gps. Puede
* ser que entremos en una zona de cobertura y necesitemos saber de ese evento
* De obligada implementación por extender la clase Gps a la interfaz LocationListener.
*/
public void providerStateChanged(LocationProvider provider, int newState) {
switch (newState) {
case LocationProvider.AVAILABLE:
System.out.println("El estado del LocationProvider cambió a AVAILABLE");
break;
case LocationProvider.OUT_OF_SERVICE:
System.out.println("El estado del LocationProvider cambió a OUT_OF_SERVICE");
break;
case LocationProvider.TEMPORARILY_UNAVAILABLE:
System.out.println("El estado del LocationProvider cambió a
TEMPORARILY_UNAVAILABLE");
break;
}
}
}
Paquete org.us.fpl.modeloDatos
Clase BotonPersonalizado
/*
* BotonPersonalizado.java
*
* Proyecto Fin de Carrera de Fernando Plaza López.
* Implementación de una aplicación BlackBerry para la lectura
* y geoposicionamiento de datos de red.
*
* Universidad de Sevilla, 2009
*/
package org.us.fpl.modeloDatos;
import net.rim.device.api.ui.Color;
import net.rim.device.api.ui.Field;
import net.rim.device.api.ui.Font;
import net.rim.device.api.ui.Graphics;
import net.rim.device.api.system.Bitmap;
public class BotonPersonalizado extends Field {
private Bitmap bitmapConFoco;
private Bitmap bitmapSinFoco;
private int tipoBoton = -1;
private int backgroundColour = Color.WHITE;
private int highlightColour;
private int fieldWidth;
private int fieldHeight;
Fernando Plaza López
Página 122
Implementación de aplicación BlackBerry para toma de datos de red
Sevilla, Febrero de 2009
private String text;
private int padding = 2;
private boolean foco = false;
// Tendremos tres posibles tipos de botones personalizados.
public static final int BOTON_STANDARD_COLOR_PERSONALIZADO = 0;
public static final int BOTON_ICONO_IMAGEN = 1;
public static final int BOTON_ICONO_IMAGEN_SIN_MARCO = 2;
/**
* Método constructor para un botón clásico, sin imagen.
* Establecemos el texto del botón y le color que tendrá.
*/
public BotonPersonalizado(String texto, int colorBoton) {
super(Field.FOCUSABLE);
this.tipoBoton = BOTON_STANDARD_COLOR_PERSONALIZADO;
this.text = texto;
this.highlightColour = colorBoton;
Font defaultFont = Font.getDefault();
fieldHeight = defaultFont.getHeight() + padding;
fieldWidth = defaultFont.getAdvance(text) + (padding * 2);
this.setPadding(2, 2, 2, 2);
}
/**
* Método constructor para un botón con imagen.
* Para especificar que el foco está sobre el botón, se dibuja un borde
* del color que establece el segundo parámetro
*/
public BotonPersonalizado(Bitmap imagenBoton, int colorBorde) {
super(Field.FOCUSABLE);
this.tipoBoton = BOTON_ICONO_IMAGEN;
this.bitmapConFoco = imagenBoton;
this.bitmapSinFoco = imagenBoton;
this.highlightColour = colorBorde;
fieldHeight = bitmapConFoco.getHeight() + padding*2;
fieldWidth = bitmapConFoco.getWidth() + padding*2;
this.setPadding(2, 2, 2, 2);
}
/**
* Método constructor para un botón con imagen.
* El primer parámetro es la imagen a mostrar cuando el foco de la pantalla
* no esté sobre el botón. El segundo parámetro, para cuando sí lo esté.
* Finalemente, dibujar un contorno con el tercer parámetro.
*/
public BotonPersonalizado(Bitmap imagenBotonSinFoco,Bitmap imagenBotonConFoco, int colorBorde) {
super(Field.FOCUSABLE);
this.tipoBoton = BOTON_ICONO_IMAGEN;
this.bitmapConFoco = imagenBotonConFoco;
this.bitmapSinFoco = imagenBotonSinFoco;
this.highlightColour = colorBorde;
fieldHeight = bitmapConFoco.getHeight() + padding*2;
fieldWidth = bitmapConFoco.getWidth() + padding*2;
this.setPadding(2, 2, 2, 2);
}
/**
* Método constructor para un botón con imagen.
* El primer parámetro es la imagen a mostrar cuando el foco de la pantalla
* no esté sobre el botón. El segundo parámetro, para cuando sí lo esté.
*/
public BotonPersonalizado(Bitmap imagenBotonSinFoco,Bitmap imagenBotonConFoco) {
super(Field.FOCUSABLE);
this.tipoBoton = BOTON_ICONO_IMAGEN_SIN_MARCO;
this.bitmapConFoco = imagenBotonConFoco;
this.bitmapSinFoco = imagenBotonSinFoco;
Fernando Plaza López
Página 123
Implementación de aplicación BlackBerry para toma de datos de red
Sevilla, Febrero de 2009
fieldHeight = bitmapConFoco.getHeight();
fieldWidth = bitmapConFoco.getWidth();
this.setPadding(2, 2, 2, 2);
}
protected boolean navigationClick(int status, int time)
{
fieldChangeNotify(1);
return true;
}
/**
* Método para notificar que el foco de la pantalla se ha situado sobre el botón
*/
protected void onFocus(int direction) {
backgroundColour = highlightColour;
foco = true;
invalidate();
}
/**
* Método para notificar que el foco de la pantalla ya no está situado sobre el botón
*/
protected void onUnfocus()
{
//backgroundColour = Color.GRAY;
backgroundColour = Color.WHITE;
foco = false;
invalidate();
}
public int getPreferredWidth()
{
return fieldWidth;
}
public int getPreferredHeight()
{
return fieldHeight;
}
protected void layout(int arg0, int arg1)
{
setExtent(getPreferredWidth(), getPreferredHeight());
}
protected void drawFocus(Graphics graphics, boolean on)
{
}
protected void fieldChangeNotify(int context)
{
try
{
this.getChangeListener().fieldChanged(this, context);
}
catch (Exception e)
{}
}
/**
* Sobreescribimos este método para pintar las imágenes deseadas.
*/
protected void paint(Graphics graphics) {
switch (tipoBoton) {
case BOTON_STANDARD_COLOR_PERSONALIZADO:
Fernando Plaza López
Página 124
Implementación de aplicación BlackBerry para toma de datos de red
Sevilla, Febrero de 2009
graphics.setColor(backgroundColour);
graphics.fillRoundRect(0, 0, fieldWidth, fieldHeight, 8, 8);
graphics.setColor(Color.GRAY);
graphics.drawRoundRect(0, 0, fieldWidth, fieldHeight, 8, 8);
graphics.setColor(Color.WHITE);
graphics.drawText(text, padding - 1, padding / 2 + 1);
break;
case BOTON_ICONO_IMAGEN:
graphics.setColor(backgroundColour);
graphics.fillRoundRect(0, 0, fieldWidth, fieldHeight, padding, padding);
if(foco){
graphics.drawBitmap(padding,padding, bitmapConFoco.getWidth(), bitmapConFoco.getHeight(),
this.bitmapConFoco, 0, 0);
}else{
graphics.drawBitmap(padding,padding, bitmapSinFoco.getWidth(), bitmapSinFoco.getHeight(),
this.bitmapSinFoco, 0, 0);
}
break;
case BOTON_ICONO_IMAGEN_SIN_MARCO:
if(foco){
graphics.drawBitmap(0,0, bitmapConFoco.getWidth(), bitmapConFoco.getHeight(),
this.bitmapConFoco, 0, 0);
}else{
graphics.drawBitmap(0,0, bitmapSinFoco.getWidth(), bitmapSinFoco.getHeight(), this.bitmapSinFoco,
0, 0);
}
break;
}
}
}
Clase Configuracion
/*
* Configuracion.java
*
* Proyecto Fin de Carrera de Fernando Plaza López.
* Implementación de una aplicación BlackBerry para la lectura
* y geoposicionamiento de datos de red.
*
* Universidad de Sevilla, 2009
*/
package org.us.fpl.modeloDatos;
import net.rim.device.api.system.PersistentObject;
import net.rim.device.api.system.PersistentStore;
import net.rim.device.api.util.Persistable;
public class Configuracion implements Persistable{
private static final long ID = 0xcb7ab2991bededccL;
private int periodoGPS; // Periodo de Gps establecido por el usuario
private String destinatarioEmail; // Destinatario email establecido por el usuario
/**
* Constructor por defecto
*/
public Configuracion() {
}
/**
* Recogemos el valor del periodo de GPS almacenado en la memoria persistente
*/
public int getPeriodoGPS() {
Fernando Plaza López
Página 125
Implementación de aplicación BlackBerry para toma de datos de red
Sevilla, Febrero de 2009
return periodoGPS;
}
/**
* Establecemos el valor del periodo de GPS almacenado en la memoria persistente
*/
public void setPeriodoGPS(int periodoGPS) {
this.periodoGPS = periodoGPS;
}
/**
* Recogemos la dirección email del destinatario almacenada en la memoria persistente
*/
public String getDestinatarioEmail() {
return destinatarioEmail;
}
/**
* Establecemos la dirección email del destinatario almacenada en la memoria persistente
*/
public void setDestinatarioEmail(String destinatarioEmail) {
this.destinatarioEmail = destinatarioEmail;
}
/**
* Método para confirmar el guardado de la información en memoria persistente
* De obligada implementación por extender la clase Configuracion a la interfaz Persistable.
*/
public void commit() {
PersistentObject.commit(this);
}
/**
* Método para recuperar la información de la memoria persistente.
* De obligada implementación por extender la clase Configuracion a la interfaz Persistable.
*/
public static Configuracion load() {
PersistentObject persist = PersistentStore.getPersistentObject(Configuracion.ID);
Configuracion contents = (Configuracion)persist.getContents();
synchronized( persist ) {
if( contents == null ) {
contents = new Configuracion();
contents.setPeriodoGPS(10); // Periodo de GPS. Especificar en segundos
contents.setDestinatarioEmail("");
persist.setContents(contents);
persist.commit();
}
}
return contents;
}
}
Clase ElementoLocalizacion
/*
* ElementoLocalizacion.java
*
* Proyecto Fin de Carrera de Fernando Plaza López.
* Implementación de una aplicación BlackBerry para la lectura
* y geoposicionamiento de datos de red.
*
* Universidad de Sevilla, 2009
*/
package org.us.fpl.modeloDatos;
Fernando Plaza López
Página 126
Implementación de aplicación BlackBerry para toma de datos de red
Sevilla, Febrero de 2009
import javax.microedition.location.*;
public class ElementoLocalizacion {
private String comentario = "";
private long timeStamp;
private float velocidad;
private float rumbo;
private double latitud;
private double longitud;
private float altitud;
private float horizontalAccuracy;
private float verticalAccuracy;
private String extraInfo;
private String cellId;
private String bsic;
private String lac;
private String rac;
private String mnc;
private String mcc;
private String rssi;
/**
* Constructor por defecto
*/
public ElementoLocalizacion() {
}
/**
* Constructor pasándole el objeto Location que hemos recibido por el listener de GPS
*/
public ElementoLocalizacion(Location location) {
this.latitud = location.getQualifiedCoordinates().getLatitude();
this.longitud = location.getQualifiedCoordinates().getLongitude();
this.altitud = location.getQualifiedCoordinates().getAltitude();
this.horizontalAccuracy = location.getQualifiedCoordinates().getHorizontalAccuracy();
this.verticalAccuracy = location.getQualifiedCoordinates().getVerticalAccuracy();
this.timeStamp = location.getTimestamp();
this.velocidad = location.getSpeed();
this.rumbo = location.getCourse();
this.extraInfo = location.getExtraInfo("application/X-jsr179-location-nmea");
this.comentario = "";
}
/**
* Constructor pasándole el objeto Location que hemos recibido por el listener de GPS
* y el comentario introducido por el usuario
*/
public ElementoLocalizacion(Location location, String comentario) {
this.latitud = location.getQualifiedCoordinates().getLatitude();
this.longitud = location.getQualifiedCoordinates().getLongitude();
this.altitud = location.getQualifiedCoordinates().getAltitude();
this.horizontalAccuracy = location.getQualifiedCoordinates().getHorizontalAccuracy();
this.verticalAccuracy = location.getQualifiedCoordinates().getVerticalAccuracy();
this.timeStamp = location.getTimestamp();
this.velocidad = location.getSpeed();
this.rumbo = location.getCourse();
this.extraInfo = location.getExtraInfo("application/X-jsr179-location-nmea");
this.comentario = comentario;
}
public String getComentario() {
return comentario;
}
public void setComentario(String comentario) {
Fernando Plaza López
Página 127
Implementación de aplicación BlackBerry para toma de datos de red
Sevilla, Febrero de 2009
this.comentario = comentario;
}
public long getTimeStamp() {
return timeStamp;
}
public void setTimeStamp(long timeStamp) {
this.timeStamp = timeStamp;
}
public float getVelocidad() {
return velocidad;
}
public void setVelocidad(float velocidad) {
this.velocidad = velocidad;
}
public float getRumbo() {
return rumbo;
}
public void setRumbo(float rumbo) {
this.rumbo = rumbo;
}
public double getLatitud() {
return latitud;
}
public void setLatitud(double latitud) {
this.latitud = latitud;
}
public double getLongitud() {
return longitud;
}
public void setLongitud(double longitud) {
this.longitud = longitud;
}
public float getAltitud() {
return altitud;
}
public void setAltitud(float altitud) {
this.altitud = altitud;
}
public float getHorizontalAccuracy() {
return horizontalAccuracy;
}
public void setHorizontalAccuracy(float horizontalAccuracy) {
this.horizontalAccuracy = horizontalAccuracy;
}
public float getVerticalAccuracy() {
return verticalAccuracy;
}
public void setVerticalAccuracy(float verticalAccuracy) {
this.verticalAccuracy = verticalAccuracy;
}
Fernando Plaza López
Página 128
Implementación de aplicación BlackBerry para toma de datos de red
Sevilla, Febrero de 2009
public String getExtraInfo() {
return extraInfo;
}
public void setExtraInfo(String extraInfo) {
this.extraInfo = extraInfo;
}
public String getCellId() {
return cellId;
}
public void setCellId(String cellId) {
this.cellId = cellId;
}
public String getBsic() {
return bsic;
}
public void setBsic(String bsic) {
this.bsic = bsic;
}
public String getLac() {
return lac;
}
public void setLac(String lac) {
this.lac = lac;
}
public String getRac() {
return rac;
}
public void setRac(String rac) {
this.rac = rac;
}
public String getMnc() {
return mnc;
}
public void setMnc(String mnc) {
this.mnc = mnc;
}
public String getMcc() {
return mcc;
}
public void setMcc(String mcc) {
this.mcc = mcc;
}
public String getRssi() {
return rssi;
}
public void setRssi(String rssi) {
this.rssi = rssi;
}
public ElementoLocalizacion clon(ElementoLocalizacion clonado){
ElementoLocalizacion nuevo = new ElementoLocalizacion();
Fernando Plaza López
Página 129
Implementación de aplicación BlackBerry para toma de datos de red
Sevilla, Febrero de 2009
nuevo.setComentario(clonado.getComentario());
nuevo.setTimeStamp(clonado.getTimeStamp());
nuevo.setVelocidad(clonado.getVelocidad());
nuevo.setRumbo(clonado.getRumbo());
nuevo.setLatitud(clonado.getLatitud());
nuevo.setLongitud(clonado.getLongitud());
nuevo.setAltitud(clonado.getAltitud());
nuevo.setHorizontalAccuracy(clonado.getHorizontalAccuracy());
nuevo.setVerticalAccuracy(clonado.getVerticalAccuracy());
nuevo.setExtraInfo(clonado.getExtraInfo());
nuevo.setCellId(clonado.getCellId());
nuevo.setBsic(clonado.getBsic());
nuevo.setLac(clonado.getLac());
nuevo.setRac(clonado.getRac());
nuevo.setMnc(clonado.getMnc());
nuevo.setMcc(clonado.getMcc());
nuevo.setRssi(clonado.getRssi());
return nuevo;
}
}
Clase GestorElementos
/*
* GestorElementos.java
*
* Proyecto Fin de Carrera de Fernando Plaza López.
* Implementación de una aplicación BlackBerry para la lectura
* y geoposicionamiento de datos de red.
*
* Universidad de Sevilla, 2009
*/
package org.us.fpl.modeloDatos;
import net.rim.device.api.ui.Field;
import net.rim.device.api.ui.Graphics;
import net.rim.device.api.ui.Manager;
public class GestorElementos extends Manager
{
public int n_cols;
public long anchos[];
public long anchos_px[];
private int tipo = -1;
public static final int NORMAL = 0; // el por defecto de BlackBerry (no añade procesamiento extra)
public static final int CENTRADO = 1;
public static final int ALTOS_COMIENZAN_MISMA_LINEA = 2;
/**
* Constructor. Establecemos el estilo del gestor
*/
public GestorElementos(long style){
super(style);
tipo = NORMAL;
}
/**
* Constructor. Establecemos el estiloy el tipo del gestor
Fernando Plaza López
Página 130
Implementación de aplicación BlackBerry para toma de datos de red
Sevilla, Febrero de 2009
*/
public GestorElementos(long style, int tipo){
super(style);
this.tipo = tipo;
}
/**
* Método para asignar los pixeles a cada elemento que vaya a ir dentro del gestor.
* El criterio para asignarlos debe haber sidio establecido previamente mediante porcentajes
* que sumen un total de 100.
*/
public void asignaAnchosPixeles(){
int ancho = Graphics.getScreenWidth();
int i;
anchos_px = new long[n_cols];
int tamanio = anchos_px.length;
for (i=0;i<tamanio;i++){
anchos_px[i] = (((long)ancho)* anchos[i])/((long)100.0);
}
}
public int getPreferredWidth(){
return(Graphics.getScreenWidth());
}
public int getPreferredHeight(){
int height = 0;
int fc = getFieldCount();
int i;
if(tipo != ALTOS_COMIENZAN_MISMA_LINEA){
for (i=0;i<fc;i++){
if(getField(i).getHeight() > height){
height = getField(i).getHeight();
}
}
}else{
for (i=0;i<fc;i++){
if(getField(i).getPreferredHeight() > height){
height = getField(i).getPreferredHeight();
}
}
}
return (height);
}
protected void sublayout(int w, int h){
int x = 0;
int y = 0;
Field field;
int numberoffields = getFieldCount();
int i;
for (i=0;i<numberoffields;i++){
field = getField(i);
layoutChild(field,(int)anchos_px[i],h);
if(this.tipo == NORMAL){
setPositionChild(field,x,y);
x += anchos_px[i];
}else if(this.tipo == CENTRADO){
setPositionChild(field,x+(int)anchos_px[i]/2-field.getPreferredWidth()/2,y);
x += anchos_px[i];
}
}
setExtent(w,this.getPreferredHeight());
Fernando Plaza López
Página 131
Implementación de aplicación BlackBerry para toma de datos de red
Sevilla, Febrero de 2009
}
}
Clase ManejadorCorreos
/*
* ManejadorCorreos.java
*
* Proyecto Fin de Carrera de Fernando Plaza López.
* Implementación de una aplicación BlackBerry para la lectura
* y geoposicionamiento de datos de red.
*
* Universidad de Sevilla, 2009
*/
package org.us.fpl.modeloDatos;
import java.io.ByteArrayOutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.Date;
import java.util.Vector;
import net.rim.blackberry.api.mail.Address;
import net.rim.blackberry.api.mail.Folder;
import net.rim.blackberry.api.mail.Message;
import net.rim.blackberry.api.mail.MessagingException;
import net.rim.blackberry.api.mail.Multipart;
import net.rim.blackberry.api.mail.Session;
import net.rim.blackberry.api.mail.Store;
import net.rim.blackberry.api.mail.SupportedAttachmentPart;
import net.rim.device.api.i18n.SimpleDateFormat;
import net.rim.device.api.servicebook.Transport;
import net.rim.device.api.system.Application;
import net.rim.device.api.util.Persistable;
import org.us.fpl.localizadorGPS.Gps;
import org.us.fpl.modeloDatos.Kxml.io.XmlWriter;
/**
*
*/
public class ManejadorCorreos {
private Store store;
private static String ASUNTO_MAIL = "Datos de red de ";
private static String DOCUMENT = "Document";
private static String FOLDER = "Folder";
private static String NAME = "name";
private static String DESCRIPTION = "description";
private static String ICON = "Icon";
private static String OPEN = "open";
private static String VISIBILITY = "visibility";
private static String SELECTED = "selected";
private static String PLACEMARKT = "Placemark";
private static String POINT = "Point";
private static String COORDINATES = "coordinates";
private static String LINESTRING = "LineString";
private static String EXTRUDE = "extrude";
private static String TESSELLATE = "tessellate";
private static String ALTITUDEMODE = "altitudeMode";
private static String NETWORK_DATA = "Datos de red";
Fernando Plaza López
Página 132
Implementación de aplicación BlackBerry para toma de datos de red
Sevilla, Febrero de 2009
/**
* Método estático para el envío del correo electrónico.
* No se le pasa ningún parámetro, porque tiene acceso a los datos desde la clase ManejadorCorreo
*/
public static void enviarEmail(){
// En primer lugar recuperamos de la memoria persisntente el destinatario del correo.
String origenMensaje = Configuracion.load().getDestinatarioEmail();
// Ahora, recuperamos de la clase Gps las coordeanadas alamcendas y construimos la cadena kml
// que será incluida como fichero adjunto
byte[] datosEnviar = construyeKML(origenMensaje);
Store store = null;
if(datosEnviar.length > 0){
//Log.debug("Email buffer with locations has " + data.length + " length");
store = Session.getDefaultInstance().getStore();
Folder[] folders = store.list(Folder.SENT);
Folder sentfolder = folders[0];
// Creación del mensaje
net.rim.blackberry.api.mail.Message msg = new Message(sentfolder);
// Añadir destinatarios
Address toList[] = new Address[1];
try {
toList[0] = new Address(origenMensaje, "");
} catch (MessagingException e) {
System.err.println("Exception al añadir destinatarios al correo 1: " + e.toString());
}
try {
msg.addRecipients(Message.RecipientType.TO, toList);
} catch (MessagingException e) {
System.err.println("Exception al añadir destinatarios al correo 2: " + e.toString());
}
// Añadir asunto
try {
msg.setSubject("Informe de red de " + origenMensaje);
}catch(Exception ex){
System.err.println("Exception establecer el asunto :" + ex);
}
// Añadir el adjunto
String nombre_fichero_kml = "Informe_" + origenMensaje +"_" +
dameFechaDDMMYYY(System.currentTimeMillis()) + ".kml";
Multipart multipart = new Multipart(); // Default type of multipart/mixed.
SupportedAttachmentPart attach = null;
try {
attach = new SupportedAttachmentPart( multipart, "text/plain", nombre_fichero_kml, datosEnviar);
}catch(Exception ex){
System.err.println("Exception creating attachment for email :" + ex);
}
try {
multipart.addBodyPart(attach); // Add the attachment to the multipart.
} catch(Exception ex){
System.err.println("Exception adding attachment to email :" + ex);
Fernando Plaza López
Página 133
Implementación de aplicación BlackBerry para toma de datos de red
Sevilla, Febrero de 2009
}
// Añadir el mensaje
try {
msg.setContent(multipart);
} catch(MessagingException e) {
System.err.println("MessagingException al establecer el texto del correo " + e.toString());
}
// Enviar el mensaje
try {
synchronized (Application.getEventLock()) {
net.rim.blackberry.api.mail.Transport.send(msg);
}
} catch(MessagingException e) {
System.err.println("Exception sending mail: " + e.getMessage());
}
}else{
System.err.println("Buffer with locations was empty. Email won´t be sent");
}
}
/**
* Método estático para la construcción del fichero kml, construido a partir del vector
* de coordenadas del objeto Gps
*/
public static byte[] construyeKML(String origenMensaje){
try {
ByteArrayOutputStream byteout = new ByteArrayOutputStream ();
OutputStreamWriter outWriter = new OutputStreamWriter (byteout);
XmlWriter xw = new XmlWriter((Writer) outWriter);
xw.writeRaw("<?xml version=\"1.0\" encoding=\"UTF-8\" ?>");
// Escribimos <kml>
xw.startTag("kml");
xw.attributeWithoutEqual("xmlns=\"http://earth.google.com/kml/2.1\"");
// Escribimos <document>
xw.startTag(DOCUMENT);
// Escribimos <folder>
xw.startTag(FOLDER);
// Escribimos <name>
xw.startTag(NAME);
xw.write( origenMensaje );
xw.endTag();
// Escribimos <folder>
xw.startTag(FOLDER);
// Escribimos <name>
xw.startTag(NAME);
xw.write( "Points" );
xw.endTag();
// Escribimos los 3 tags de visualización
dameCadenaOpen(xw);
dameCadenaVisibilityOff(xw);
dameCadenaSelected(xw);
// Placemarkt
Vector cola = Gps.getInstancia().getVectorLocalizaciones();
synchronized (cola) {
Fernando Plaza López
Página 134
Implementación de aplicación BlackBerry para toma de datos de red
Sevilla, Febrero de 2009
int total = cola.size();
ElementoLocalizacion localizacion;
for (int i = 0; i < total; i++) {
localizacion = (ElementoLocalizacion) cola.elementAt(i);
try{
añadeLocalizacionXMLPuntos(xw, localizacion);
} catch (Exception e) {
System.err.println("Excepción al recoger las coordenadas de memoria");
}
}
}
// Escribimos </folder>
xw.endTag();
// Escribimos <folder>
xw.startTag(FOLDER);
// Escribimos <name>
xw.startTag(NAME);
xw.write( "Interval" );
xw.endTag();
// Escribimos los 3 tags de visualización
dameCadenaOpen(xw);
dameCadenaVisibilityOff(xw);
dameCadenaSelected(xw);
// Placemarkt
xw.startTag(PLACEMARKT);
xw.startTag(LINESTRING);
xw.startTag(EXTRUDE);
xw.write( "0" );
xw.endTag();
xw.startTag(TESSELLATE);
xw.write( "1" );
xw.endTag();
xw.startTag(ALTITUDEMODE);
xw.write( "clampToGround" );
xw.endTag();
xw.startTag(COORDINATES);
xw.write(añadeLocalizacionXMLTramos());
xw.endTag();
// Escribimos </LineString>
xw.endTag();
// Escribimos </Placemark>
xw.endTag();
// Escribimos </folder>
xw.endTag();
// Escribimos </folder>
xw.endTag();
// Escribimos </document>
xw.endTag();
// Escribimos </kml>
xw.endTag();
xw.close();
System.out.println("Se va a enviar el KML: " + byteout.toString());
return byteout.toByteArray();
} catch (Throwable e) {
Fernando Plaza López
Página 135
Implementación de aplicación BlackBerry para toma de datos de red
Sevilla, Febrero de 2009
e.printStackTrace();
// Log.error("Excepcion en representacion_xml: " + e);
return null;
}
}
/**
* Método estático para construir la cadena de etiqueta Open, necesaria para configurar
* los elementos puntos y tramos del kml
*/
private static void dameCadenaOpen(XmlWriter xw){
try {
// Escribimos <open>
xw.startTag(OPEN);
xw.write("1");
xw.endTag();
}catch (Throwable e) {
e.printStackTrace();
//Log.error("Excepcion en escribe_xml_caso_2: " + e);
}
}
/**
* Método estático para construir la cadena de etiqueta Visibility, necesaria para configurar
* los elementos puntos y tramos del kml
*/
private static void dameCadenaVisibilityOn(XmlWriter xw){
try {
// Escribimos <open>
xw.startTag(VISIBILITY);
xw.write("1");
xw.endTag();
}catch (Throwable e) {
e.printStackTrace();
// Log.error("Excepcion en escribe_xml_caso_2: " + e);
}
}
/**
* Método estático para construir la cadena de etiqueta VisibilityOff, necesaria para configurar
* los elementos puntos y tramos del kml
*/
private static void dameCadenaVisibilityOff(XmlWriter xw){
try {
// Escribimos <open>
xw.startTag(VISIBILITY);
xw.write("0");
xw.endTag();
}catch (Throwable e) {
e.printStackTrace();
// Log.error("Excepcion en escribe_xml_caso_2: " + e);
}
}
/**
* Método estático para construir la cadena de etiqueta Selected, necesaria para configurar
* los elementos puntos y tramos del kml
*/
private static void dameCadenaSelected(XmlWriter xw){
try {
// Escribimos <open>
Fernando Plaza López
Página 136
Implementación de aplicación BlackBerry para toma de datos de red
Sevilla, Febrero de 2009
xw.startTag(SELECTED);
xw.write("1");
xw.endTag();
}catch (Throwable e) {
e.printStackTrace();
// Log.error("Excepcion en escribe_xml_caso_2: " + e);
}
}
/**
* Método estático para añadir la lista de puntos a la estructura kml
*/
private static void añadeLocalizacionXMLPuntos(XmlWriter xw, ElementoLocalizacion localizacion) throws
Exception {
// Escribimos <Placemarkt>
xw.startTag(PLACEMARKT);
xw.startTag(NAME);
if(!localizacion.getComentario().equals("")){
String comentario = localizacion.getComentario();
if(comentario.length() > 30){
comentario = comentario.substring(0,29);
}
xw.write(comentario + " - " + dameFechaParaDescripcion(localizacion.getTimeStamp()));
}else{
xw.write(dameFechaParaDescripcion(localizacion.getTimeStamp()));
}
xw.endTag();
dameCadenaOpen(xw);
if(!localizacion.getComentario().equals("")){
dameCadenaVisibilityOn(xw);
}else{
dameCadenaVisibilityOff(xw);
}
xw.startTag(DESCRIPTION);
if(!localizacion.getComentario().equals("")){
xw.write("BBTrip : " + localizacion.getComentario());
xw.write('\n');
}
xw.write("Cell Id: " + localizacion.getCellId());
xw.write('\n');
xw.write("BSIC: " + localizacion.getBsic());
xw.write('\n');
xw.write("LAC: " + localizacion.getLac());
xw.write('\n');
xw.write("MCC: " + localizacion.getMcc());
xw.write('\n');
xw.write("MNC: " + localizacion.getMnc());
xw.write('\n');
xw.write("RAC: " + localizacion.getRac());
xw.write('\n');
xw.write("RSSI: " + localizacion.getRssi());
xw.endTag();
xw.startTag(POINT);
xw.startTag(COORDINATES);
xw.write(localizacion.getLongitud() + "," + localizacion.getLatitud());
xw.endTag();
xw.endTag();
xw.endTag();
Fernando Plaza López
Página 137
Implementación de aplicación BlackBerry para toma de datos de red
Sevilla, Febrero de 2009
}
/**
* Método estático para añadir los tramos a la estructura kml
*/
private static String añadeLocalizacionXMLTramos() {
String cadena = "";
Vector cola = Gps.getInstancia().getVectorLocalizaciones();
int total = cola.size();
ElementoLocalizacion localizacion;
for (int i = 0; i < total; i++) {
localizacion = (ElementoLocalizacion) cola.elementAt(i);
cadena+=localizacion.getLongitud();
cadena+=",";
cadena+=localizacion.getLatitud();
cadena+=",0 ";
}
return cadena;
}
/**
* Método estático para construir una cadena de texto que indique la velocidad a la que
* iba el dispositivo en el momento de la toma de coordenada
*/
private static String dameCadenaVelocidad(String velocidad){
String resultado = "";
String entero = "";
String decimales = "";
try{
if(velocidad.indexOf(".") != -1){
entero = velocidad.substring(0,velocidad.indexOf("."));
decimales = velocidad.substring(velocidad.indexOf(".")+1,velocidad.length());
if(decimales.length() >= 2){
resultado = entero + "." + decimales.substring(0,2);
}else if(decimales.length() == 1){
resultado = entero + "." + decimales;
}else{
resultado = entero;
}
}else{
resultado = velocidad;
}
}catch (Exception ex){
System.err.println("Exception setting speed string: " + ex);
resultado = velocidad;
}
return resultado;
}
/**
* Método estático para construir una cadena de texto que indique la fecha y hora
* en el momento de la toma de coordenada en formato dd/MM/yyyy HH:mm
*/
private static String dameFechaParaDescripcion(long date){
SimpleDateFormat sdf=new SimpleDateFormat("dd/MM/yyyy HH:mm");
String fecha=sdf.format(new Date(date));
return fecha;
}
/**
* Método estático para construir una cadena de texto que indique la fecha y hora
* en el momento de la toma de coordenada en formato dd_MM_yyyy
*/
public static String dameFechaDDMMYYY(long date){
SimpleDateFormat sdf=new SimpleDateFormat("dd_MM_yyyy");
Fernando Plaza López
Página 138
Implementación de aplicación BlackBerry para toma de datos de red
Sevilla, Febrero de 2009
String fecha=sdf.format(new Date(date));
return fecha;
}
}
Paquete org.us.fpl.modeloDatos.Kxml
Clase PrefixMap
/*
* PrefixMap.java
*
* Proyecto Fin de Carrera de Fernando Plaza López.
* Implementación de una aplicación BlackBerry para la lectura
* y geoposicionamiento de datos de red.
*
* Universidad de Sevilla, 2009
*/
package org.us.fpl.modeloDatos.Kxml;
/** Like Attribute, this class is immutable for similar reasons */
public final class PrefixMap {
public static final PrefixMap DEFAULT = new PrefixMap (null, "", "");
String prefix;
String namespace;
PrefixMap previous;
public PrefixMap (PrefixMap previous, String prefix, String namespace) {
this.previous = previous;
this.prefix = prefix;
this.namespace = namespace;
}
public String getNamespace () {
return namespace;
}
public String getPrefix () {
return prefix;
}
public PrefixMap getPrevious () {
return previous;
}
/** returns the namespace associated with the given prefix,
or null, if none is assigned */
public String getNamespace (String prefix) {
PrefixMap current = this;
do {
if (prefix.equals (current.prefix)) return current.namespace;
current = current.previous;
Fernando Plaza López
Página 139
Implementación de aplicación BlackBerry para toma de datos de red
Sevilla, Febrero de 2009
}
while (current != null);
return null;
}
public String getPrefix (String namespace) {
PrefixMap current = this;
do {
//System.err.println ("found: "+current.namespace +"/"+ current.prefix + "/" +getNamespace (current.prefix));
if (namespace.equals (current.namespace)
&& namespace.equals (getNamespace (current.prefix)))
return current.prefix;
current = current.previous;
}
while (current != null);
return null;
}
}
Clase PrefixMap
/*
* Xml.java
*
* Proyecto Fin de Carrera de Fernando Plaza López.
* Implementación de una aplicación BlackBerry para la lectura
* y geoposicionamiento de datos de red.
*
* Universidad de Sevilla, 2009
*/
package org.us.fpl.modeloDatos.Kxml;
/** A class containing several static xml methods, mainly for escaping
special characters like angle brakets and quotes. This class
contains also some (partially shared) constants for the parser and
kDOM. */
public final class Xml {
public static final String NO_NAMESPACE = "";
/** XmlReader return value before the first call to next or skip */
public static final int START_DOCUMENT = 0;
/** Integer constant for comments */
public static final int COMMENT = 1;
/** Integer constant for doctype */
public static final int DOCTYPE = 2;
/** Integer constant for elements */
Fernando Plaza López
Página 140
Implementación de aplicación BlackBerry para toma de datos de red
Sevilla, Febrero de 2009
public static final int ELEMENT = 4;
/** Integer constant returned by ParseEvent.getType if the end of
the document has been reached */
public static final int END_DOCUMENT = 8;
/** Integer constant assigned to an EndTag parse event */
public static final int END_TAG = 16;
/** Integer constant assigned to a processing instruction */
public static final int PROCESSING_INSTRUCTION = 32;
/** Integer constant assigned to StartTag parse event */
public static final int START_TAG = 64;
/** Integer constant assigned to text nodes and events */
public static final int TEXT = 128;
/** Integer constant for whitespace nodes and events */
public static final int WHITESPACE = 256;
/** minimum escaping, quotes are not escaped */
public static final int ENCODE_MIN = 0;
/** forces escaping of quotes */
public static final int ENCODE_QUOT = 1;
/** forces escaping of all character coded greater than 127 */
public static int ENCODE_128 = 2;
/** Constant identifying wap extension events */
public static final int WAP_EXTENSION = 1024;
/** convenience method for encode (String raw, ENCODE_MIN) */
public static String encode (String raw) {
return encode (raw, ENCODE_MIN);
}
/* encodes an attribute with the given name and value. A single
space is inserted before the name of the attribute
public static String encodeAttr (String name, String value) {
return " "+name+"=\"" + encode (value, ENCODE_QUOT) + "\"";
}
*/
/** encodes a string escaping less than etc. */
Fernando Plaza López
Página 141
Implementación de aplicación BlackBerry para toma de datos de red
Sevilla, Febrero de 2009
public static String encode (String raw, int flags) {
int len = raw.length ();
StringBuffer cooked = new StringBuffer (raw.length ());
for (int i = 0; i < len; i++) {
char c = raw.charAt (i);
switch (c) {
case '<': cooked.append ("<"); break;
case '>': cooked.append (">"); break;
case '&': cooked.append ("&"); break;
case '"':
{
if ((flags & ENCODE_QUOT) != 0)
cooked.append (""");
else
cooked.append ('"');
}
break;
default:
if (c >= 128 && ((flags & ENCODE_128) != 0))
cooked.append ("&#"+((int) c)+";");
else
cooked.append (c);
}
}
return cooked.toString ();
}
/* quotes a string by adding quote chars at the beginning
and the end and escaping all quotes and XML special
chars contained in the string
public static String quote (String q) {
return "\"" + encode (q, ENCODE_QUOT) + "\"";
}
*/
/* like String.trim, but additionally all groups of one or more
whitespace characters in the string are replaced by a single
space (0x040)
public static String trim (String s) {
char [] buf = new char [s.length ()];
boolean ignoring = false;
int targetPos = 0;
for (int i = 0; i < s.length (); i++) {
char c = s.charAt (i);
if (c <= ' ')
ignoring = true;
else {
if (ignoring) {
if (targetPos != 0) buf [targetPos++] = ' ';
ignoring = false;
}
buf [targetPos++] = c;
}
}
Fernando Plaza López
Página 142
Implementación de aplicación BlackBerry para toma de datos de red
Sevilla, Febrero de 2009
return new String (buf, 0, targetPos);
}
*/
}
Paquete org.us.fpl.modeloDatos.Kxml.io
Clase AbstractXmlWriter
/*
* AbstractXmlWriter.java
*
* Proyecto Fin de Carrera de Fernando Plaza López.
* Implementación de una aplicación BlackBerry para la lectura
* y geoposicionamiento de datos de red.
*
* Universidad de Sevilla, 2009
*/
package org.us.fpl.modeloDatos.Kxml.io;
import java.io.IOException;
import java.io.Writer;
import org.us.fpl.modeloDatos.Kxml.PrefixMap;
import org.us.fpl.modeloDatos.Kxml.Xml;
/** An abstract XmlWriter including namespace handling. */
public abstract class AbstractXmlWriter extends Writer {
protected State current =
new State (null,
PrefixMap.DEFAULT, //null, null,
null);
/** writes an attribute. Only allowed immediately after
startTag or attribute. */
public abstract void attribute (String name,
String value) throws IOException;
/** writes an attribute with the given namespace. Only allowed
immediately after startTag or another attribute
call. */
public void attribute (String namespace,
String name,
String value) throws IOException {
if (namespace == null || "".equals (namespace))
attribute (name, value);
else {
String prefix = current.prefixMap.getPrefix (namespace);
if (prefix == null || prefix.equals ("")) {
int cnt = 0;
Fernando Plaza López
Página 143
Implementación de aplicación BlackBerry para toma de datos de red
Sevilla, Febrero de 2009
do {
prefix = "p"+(cnt++);
}
while (current.prefixMap.getNamespace (prefix) != null);
current.prefixMap = new PrefixMap
(current.prefixMap, prefix, namespace);
attribute ("xmlns:"+prefix, namespace);
}
attribute (prefix + ":" + name, value);
}
}
public PrefixMap getPrefixMap () {
return current.prefixMap;
}
/** writes a start tag with the given name, using the given prefix
map. This method cares about the namespace prefixes and calls
startTag (PrefixMap prefixMap, String tag) for concrete
writing. */
public void startTag (PrefixMap prefixMap,
String namespace,
String name) throws IOException {
// check if namespace is default.
if (prefixMap == null) prefixMap = current.prefixMap;
if (namespace == null) namespace = "";
String prefix = prefixMap.getPrefix (namespace);
if (prefix == null) {
//System.out.println ("namespace "+namespace +" not found in "+prefixMap);
prefixMap = new PrefixMap (prefixMap, "", namespace);
prefix = "";
}
String tag = prefix.length () == 0
? name
: prefix + ':' + name;
PrefixMap oldMap = current.prefixMap;
startTag (prefixMap, tag);
// if namespace has changed, write out changes...
if (prefixMap != oldMap) {
PrefixMap current = prefixMap;
do {
String p2 = current.getPrefix ();
String ns = current.getNamespace ();
if (prefixMap.getNamespace (p2).equals (ns)
&& !ns.equals (oldMap.getNamespace (p2)))
attribute (p2.equals ("") ? "xmlns" : ("xmlns:"+p2), ns);
current = current.getPrevious ();
}
while (current != null && current != oldMap);
}
}
/** writes a start tag with the given namespace and name */
Fernando Plaza López
Página 144
Implementación de aplicación BlackBerry para toma de datos de red
Sevilla, Febrero de 2009
public void startTag (String namespace,
String name) throws IOException {
startTag (null, namespace, name);
}
/** convenience method for startTag (Xml.NO_NAMESPACE, name) */
public void startTag (String name) throws IOException {
startTag (null, Xml.NO_NAMESPACE, name);
}
/** abstract method that must be overwritten by
a method actually writing the resolved start tag
without namespace checking. This implementation
just puts the state on the stack.<br /><br />
Attention: The actual implementation include the
following line in order to
put the current State on the stack!<br /><br />
current = new State (current, prefixMap, tag);
*/
protected abstract void startTag (PrefixMap prefixMap,
String tag) throws IOException;
/** Abstract method for writing an end tag. <b>Attention:</b>
Concrete implementations must pop the previous stack from the
stack:<br /><br />
current = current.prev; */
public abstract void endTag () throws IOException;
/** writes Xml.DOCTYPE, Xml.PROCESSING_INSTRUCTION or Xml.COMMENT */
public abstract void writeLegacy (int type,
String text) throws IOException;
}
Clase State
/*
* State.java
*
* Proyecto Fin de Carrera de Fernando Plaza López.
* Implementación de una aplicación BlackBerry para la lectura
* y geoposicionamiento de datos de red.
*
* Universidad de Sevilla, 2009
*/
package org.us.fpl.modeloDatos.Kxml.io;
import org.us.fpl.modeloDatos.Kxml.PrefixMap;
public final class State {
public State prev;
public PrefixMap prefixMap;
public String namespace;
Fernando Plaza López
Página 145
Implementación de aplicación BlackBerry para toma de datos de red
Sevilla, Febrero de 2009
public String name;
public String tag; // for auto-endtag writing
public State (State prev, PrefixMap prefixMap,
//String namespace, String name,
String tag) {
this.prev = prev;
this.prefixMap = prefixMap;
//
this.namespace = namespace;
//
this.name = name;
this.tag = tag;
}
}
Clase XmlWriter
/*
* XmlWriter.java
*
* Proyecto Fin de Carrera de Fernando Plaza López.
* Implementación de una aplicación BlackBerry para la lectura
* y geoposicionamiento de datos de red.
*
* Universidad de Sevilla, 2009
*/
package org.us.fpl.modeloDatos.Kxml.io;
import java.io.IOException;
import java.io.Writer;
import org.us.fpl.modeloDatos.Kxml.PrefixMap;
import org.us.fpl.modeloDatos.Kxml.Xml;
public final class XmlWriter extends AbstractXmlWriter {
protected Writer writer;
boolean pending = false;
int indentLevel = 0;
int noIndent = Integer.MAX_VALUE;
static char [] indent
= {'\r', '\n', ' ', ' ', ' ', ' ', ' ', ' ',
' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '};
/** creates a new xmlWritet based on the given writer */
public XmlWriter (Writer writer) {
this.writer = writer;
}
protected void checkPending () throws IOException {
if (pending) {
writer.write ('>');
pending = false;
}
}
/** closes the XmlWriter by closing the underlying writer */
Fernando Plaza López
Página 146
Implementación de aplicación BlackBerry para toma de datos de red
Sevilla, Febrero de 2009
public void close () throws IOException {
flush ();
writer.close ();
}
/** flushes the XmlWriter. Attention: If a closing
angle braket is pending, it will be appended before
flushing the underlying writer. Thus, after flush
attributes cannot be added any longer */
public void flush () throws IOException {
checkPending ();
writer.flush ();
}
/** writes a single character using the xml escaping rules */
public void write (char c) throws IOException {
checkPending ();
if (noIndent > indentLevel) noIndent = indentLevel;
switch (c) {
case '<': writer.write ("<"); break;
case '>': writer.write (">"); break;
case '&': writer.write ("&"); break;
default: writer.write (c);
}
}
/** writes an character array using the XML escaping rules */
public void write (char [] buf, int start, int len) throws IOException {
checkPending ();
if (noIndent > indentLevel) noIndent = indentLevel;
int end = start + len;
do {
int i = start;
while (i < end && "<>&".indexOf (buf [i]) == -1) i++;
writer.write (buf, start, i - start);
if (i == end) break;
write (buf [i]);
start = i+1;
}
while (start < end);
}
public void writeIndent () throws IOException {
int l = indentLevel + 2;
if (l < 2) l = 2;
else if (l > indent.length) l = indent.length;
Fernando Plaza López
Página 147
Implementación de aplicación BlackBerry para toma de datos de red
Sevilla, Febrero de 2009
checkPending ();
// writer.write ("<!-- i -->");
writer.write (indent, 0, l);
}
public void attributeWithoutEqual(String name) throws IOException {
if (!pending) throw new RuntimeException
("can write attr only immediately after a startTag");
writer.write (' ');
writer.write (name);
if (name.equals ("xml:space"))
noIndent = indentLevel;
}
/** writes a degenerated tag with the given name and attributes */
public void attribute(String name,String value) throws IOException {
if (!pending) throw new RuntimeException
("can write attr only immediately after a startTag");
writer.write (' ');
writer.write (name);
writer.write ("=\"");
writer.write (Xml.encode (value, Xml.ENCODE_QUOT));
writer.write ('"');
if (name.equals ("xml:space") && value.equals ("preserve"))
noIndent = indentLevel;
}
/** writes a start tag with the given name */
protected void startTag (PrefixMap prefixMap,
String tag) throws IOException {
current = new State (current, prefixMap, tag);
checkPending ();
if (indentLevel < noIndent)
writeIndent ();
indentLevel++;
writer.write ('<');
writer.write (tag);
pending = true;
}
/** writes an end tag. */
public void endTag () throws IOException {
indentLevel--;
if (pending) {
writer.write (" />");
Fernando Plaza López
Página 148
Implementación de aplicación BlackBerry para toma de datos de red
Sevilla, Febrero de 2009
pending = false;
}
else {
if (indentLevel + 1 < noIndent)
writeIndent ();
writer.write ("</");
writer.write (current.tag);
writer.write (">");
}
if (indentLevel + 1 == noIndent)
noIndent = Integer.MAX_VALUE;
current = current.prev;
if (current == null)
throw new RuntimeException ("too many closing tags!");
}
/** ATTENTION: Application needs to take care about not writing
illegal character sequences (like comment end in comments) */
public void writeLegacy (int type, String content) throws IOException {
checkPending ();
switch (type) {
case Xml.COMMENT:
writer.write ("<!--");
writer.write (content);
writer.write ("-->");
break;
case Xml.DOCTYPE:
writer.write ("<!DOCTYPE ");
writer.write (content);
writer.write (">");
break;
case Xml.PROCESSING_INSTRUCTION:
writer.write ("<?");
writer.write (content);
writer.write ("?>");
break;
}
}
/** writes a string without escaping. Use with care! Not
available in wbxml writer */
public void writeRaw (String s) throws IOException {
checkPending ();
writer.write (s);
}
}
Paquete org.us.fpl.pantallas
Clase PantallaConfiguracion
/*
* PantallaConfiguracion.java
Fernando Plaza López
Página 149
Implementación de aplicación BlackBerry para toma de datos de red
Sevilla, Febrero de 2009
*
* Proyecto Fin de Carrera de Fernando Plaza López.
* Implementación de una aplicación BlackBerry para la lectura
* y geoposicionamiento de datos de red.
*
* Universidad de Sevilla, 2009
*/
package org.us.fpl.pantallas;
import net.rim.device.api.system.Bitmap;
import net.rim.device.api.ui.Font;
import net.rim.device.api.ui.Manager;
import net.rim.device.api.ui.MenuItem;
import net.rim.device.api.ui.component.BitmapField;
import net.rim.device.api.ui.component.EditField;
import net.rim.device.api.ui.component.LabelField;
import net.rim.device.api.ui.component.Menu;
import net.rim.device.api.ui.component.RichTextField;
import net.rim.device.api.ui.container.MainScreen;
import org.us.fpl.ClienteLocalizadorDatosRed;
import org.us.fpl.localizadorGPS.Gps;
import org.us.fpl.modeloDatos.Configuracion;
import org.us.fpl.modeloDatos.GestorElementos;
public class PantallaConfiguracion extends MainScreen {
// Ppal
public ClienteLocalizadorDatosRed padre;
// Opciones Menú
private MenuItem miVolver;
private MenuItem miGuardar;
// Miembros de la pantalla
private RichTextField rtfPeriodoGPS;
private EditField editPeriodoGPS;
private RichTextField rtfDestinoEmail;
private EditField editDestinoEmail;
/**
* Constructor de la pantalla. Se le pasa como parámetro un objeto de la clase principal
* de la aplicación ( la clase que extiende a UiApplication).
*/
public PantallaConfiguracion(ClienteLocalizadorDatosRed padre) {
super(Manager.NO_VERTICAL_SCROLL);
this.padre = padre;
}
/**
* Método para instanciar todos los componentes de la pantalla. Una vez instaciados,
* se añaden a la pantalla para ser pintados.
*/
public void inicializaPantalla() {
this.deleteAll();
inicializaElementosMenu();
Configuracion miConfiguracion = Configuracion.load();
// En primer lugar, añadiremos el banner superior con el logo de la ESI y la Universidad
// de Sevilla
long anchosbannerSuperior[] = { 100 };
GestorElementos geBannerSuperior = new GestorElementos(
Manager.USE_ALL_WIDTH);
geBannerSuperior.n_cols = 1;
geBannerSuperior.anchos = anchosbannerSuperior;
geBannerSuperior.asignaAnchosPixeles();
Bitmap Logo1 = Bitmap.getBitmapResource("imgCabecera.png");
Fernando Plaza López
Página 150
Implementación de aplicación BlackBerry para toma de datos de red
Sevilla, Febrero de 2009
BitmapField bitmapLogo1 = null;
try {
bitmapLogo1 = new BitmapField(Logo1);
} catch (Exception e) {
System.err.println("");
}
if (bitmapLogo1 != null) {
geBannerSuperior.add(bitmapLogo1);
this.add(geBannerSuperior);
this.add(new LabelField());
}
// En segundo lugar añadimos un campo editable para que el usuario configure
// la periodicidad del GPS
GestorElementos geGPS = new GestorElementos(Manager.USE_ALL_WIDTH);
long[] anchosGPS = { 5, 30, 5, 55, 5 };
geGPS.n_cols = 5;
geGPS.anchos = anchosGPS;
geGPS.asignaAnchosPixeles();
rtfPeriodoGPS = new RichTextField("Periodo GPS:", RichTextField.NON_FOCUSABLE|
RichTextField.TEXT_ALIGN_LEFT);
rtfPeriodoGPS.setFont(rtfPeriodoGPS.getFont().derive((int) rtfPeriodoGPS.getStyle(), 18));
rtfPeriodoGPS.setFont(rtfPeriodoGPS.getFont().derive((int) (rtfPeriodoGPS.getStyle() |
Font.BOLD)));
editPeriodoGPS = new EditField(EditField.FILTER_INTEGER);
editPeriodoGPS.setText("" + miConfiguracion.getPeriodoGPS());
editPeriodoGPS.setFont(editPeriodoGPS.getFont().derive((int) editPeriodoGPS.getStyle(), 16));
editPeriodoGPS.setFont(editPeriodoGPS.getFont().derive((int) (editPeriodoGPS.getStyle() |
Font.BOLD)));
geGPS.add(new LabelField());
geGPS.add(rtfPeriodoGPS);
geGPS.add(new LabelField());
geGPS.add(editPeriodoGPS);
geGPS.add(new LabelField());
this.add(geGPS);
this.add(new LabelField());
// Ahora añadimos un campo editable para que el usuario configure
// la direción email a la que mandar el informe de red
GestorElementos geEmail = new GestorElementos(Manager.USE_ALL_WIDTH);
long[] anchosEmail = { 5, 15, 5, 70, 5 };
geEmail.n_cols = 5;
geEmail.anchos = anchosEmail;
geEmail.asignaAnchosPixeles();
rtfDestinoEmail = new RichTextField("Email:", RichTextField.NON_FOCUSABLE|
RichTextField.TEXT_ALIGN_LEFT);
rtfDestinoEmail.setFont(rtfPeriodoGPS.getFont().derive((int) rtfDestinoEmail.getStyle(), 18));
rtfDestinoEmail.setFont(rtfPeriodoGPS.getFont().derive((int) (rtfDestinoEmail.getStyle() |
Font.BOLD)));
editDestinoEmail = new EditField();
editDestinoEmail.setText(miConfiguracion.getDestinatarioEmail());
editDestinoEmail.setFont(editDestinoEmail.getFont().derive((int) editDestinoEmail.getStyle(),
16));
editDestinoEmail.setFont(editDestinoEmail.getFont().derive((int) (editDestinoEmail.getStyle() |
Font.BOLD)));
geEmail.add(new LabelField());
geEmail.add(rtfDestinoEmail);
geEmail.add(new LabelField());
Fernando Plaza López
Página 151
Implementación de aplicación BlackBerry para toma de datos de red
Sevilla, Febrero de 2009
geEmail.add(editDestinoEmail);
geEmail.add(new LabelField());
this.add(geEmail);
this.add(new LabelField());
this.add(new LabelField());
// Finalmente añadimos un pie a la pantalla con el texto Universidad de Sevilla, 2009
GestorElementos gePie = new GestorElementos(Manager.USE_ALL_WIDTH);
long ancPie[] = { 100 };
gePie.n_cols = 1;
gePie.anchos = ancPie;
gePie.asignaAnchosPixeles();
RichTextField pie = new RichTextField("Universidad de Sevilla, 2009",
RichTextField.TEXT_ALIGN_HCENTER | RichTextField.NON_FOCUSABLE);
gePie.add(pie);
this.add(gePie);
}
/**
* Método para instanciar los elementos del menú. La gestión de las operaciones de los mismos
* se hace con métodos individuales.
*/
private void inicializaElementosMenu() {
miGuardar = new MenuItem("Guardar", 50, 10) {
public void run() {
guardar();
}
};
miVolver = new MenuItem("Volver", 60, 10) {
public void run() {
volver();
}
};
}
/**
* Añade los elementos del menu a la pantalla cada vez que el usuario pulsa el botón Menu del dispositivo
*/
public void makeMenu(Menu menu, int instance) {
if (!menu.isDisplayed()) {
menu.deleteAll();
menu.add(miGuardar);
menu.add(miVolver);
}
}
/**
* Método que gestiona la opción de menú Volver. Vuelve a la pantalla principal
*/
public void volver() {
this.close();
}
/**
* Método que gestiona la opción de menú Guardar. Guarda en memoria persistente la configuración
* establecida por el usuario.
*/
public void guardar() {
Configuracion miConfiguracion = Configuracion.load();
try{
miConfiguracion.setDestinatarioEmail(editDestinoEmail.getText());
miConfiguracion.setPeriodoGPS(Integer.valueOf(editPeriodoGPS.getText()).intValue()
);
miConfiguracion.commit();
Fernando Plaza López
Página 152
Implementación de aplicación BlackBerry para toma de datos de red
Sevilla, Febrero de 2009
}catch(Exception ex){
System.err.println("Error al guardar los datos en memoria persistente en la pantalla de
configuracion: " + ex);
}
try{
Gps.getInstancia().setPeriodoGPS(miConfiguracion.getPeriodoGPS());
Gps.getInstancia().detener();
Gps.getInstancia().arrancar();
}catch(Exception ex){
System.err.println("Error al reiniciar el GPS: " + ex);
}
this.close();
}
}
Clase PantallaPrincipal
/*
* PantallaPrincipal.java
*
* Proyecto Fin de Carrera de Fernando Plaza López.
* Implementación de una aplicación BlackBerry para la lectura
* y geoposicionamiento de datos de red.
*
* Universidad de Sevilla, 2009
*/
package org.us.fpl.pantallas;
import javax.microedition.location.Location;
import net.rim.device.api.system.Bitmap;
import net.rim.device.api.system.DeviceInfo;
import net.rim.device.api.ui.Color;
import net.rim.device.api.ui.Field;
import net.rim.device.api.ui.FieldChangeListener;
import net.rim.device.api.ui.Font;
import net.rim.device.api.ui.Manager;
import net.rim.device.api.ui.MenuItem;
import net.rim.device.api.ui.component.BitmapField;
import net.rim.device.api.ui.component.Dialog;
import net.rim.device.api.ui.component.EditField;
import net.rim.device.api.ui.component.LabelField;
import net.rim.device.api.ui.component.Menu;
import net.rim.device.api.ui.component.RichTextField;
import net.rim.device.api.ui.container.MainScreen;
import org.us.fpl.ClienteLocalizadorDatosRed;
import org.us.fpl.localizadorGPS.Gps;
import org.us.fpl.modeloDatos.BotonPersonalizado;
import org.us.fpl.modeloDatos.GestorElementos;
import org.us.fpl.modeloDatos.ManejadorCorreos;
public class PantallaPrincipal extends MainScreen {
// Ppal
public ClienteLocalizadorDatosRed padre;
// Opciones Menú predefinidas
private MenuItem miOcultar;
private MenuItem miSalir;
private MenuItem miConfiguracion;
// Miembros de la pantalla
Fernando Plaza López
Página 153
Implementación de aplicación BlackBerry para toma de datos de red
Sevilla, Febrero de 2009
private RichTextField labelDescBoton;
private RichTextField labelNotas;
private EditField editNotas;
// Botones
private FieldChangeListener fclNotas = null;
private BotonPersonalizado cbfGuardarNota = null;
private FieldChangeListener fclGuardarNota = null;
private BotonPersonalizado cbfGPS = null;
private FieldChangeListener fclGPS = null;
private BotonPersonalizado cbfMail = null;
private FieldChangeListener fclMail = null;
private BotonPersonalizado cbfInfo = null;
private FieldChangeListener fclInfo = null;
/**
* Constructor de la pantalla. Se le pasa como parámetro un objeto de la clase principal
* de la aplicación ( la clase que extiende a UiApplication).
*/
public PantallaPrincipal(ClienteLocalizadorDatosRed padre) {
super(Manager.NO_VERTICAL_SCROLL);
this.padre = padre;
}
/**
* Método para instanciar todos los componentes de la pantalla. Una vez instaciados,
* se añaden a la pantalla para ser pintados.
*/
public void inicializaPantalla() {
this.deleteAll(); // Eliminamos todos los componentes de la pantalla.
inicializaElementosMenu();
// En primer lugar, añadiremos el banner superior con el logo de la ESI y la Universidad
// de Sevilla
long anchosbannerSuperior[] = { 100 };
GestorElementos geBannerSuperior = new GestorElementos(
Manager.USE_ALL_WIDTH);
geBannerSuperior.n_cols = 1;
geBannerSuperior.anchos = anchosbannerSuperior;
geBannerSuperior.asignaAnchosPixeles();
Bitmap Logo1 = Bitmap.getBitmapResource("imgCabecera.png");
BitmapField bitmapLogo1 = null;
try {
bitmapLogo1 = new BitmapField(Logo1);
} catch (Exception e) {
System.err.println("");
}
if (bitmapLogo1 != null) {
geBannerSuperior.add(bitmapLogo1);
this.add(geBannerSuperior);
this.add(new LabelField());
}
// En segundo lugar añadimos un campo editable en el que podrems añadir notas
GestorElementos geNotas = new GestorElementos(Manager.USE_ALL_WIDTH);
long[] anchosNotas = { 5, 15, 5, 65, 10 };
geNotas.n_cols = 5;
geNotas.anchos = anchosNotas;
geNotas.asignaAnchosPixeles();
labelNotas = new RichTextField("Notas:", RichTextField.NON_FOCUSABLE|
RichTextField.TEXT_ALIGN_HCENTER);
labelNotas.setFont(labelNotas.getFont().derive((int) labelNotas.getStyle(), 18));
labelNotas.setFont(labelNotas.getFont().derive((int) (labelNotas.getStyle() | Font.BOLD)));
Fernando Plaza López
Página 154
Implementación de aplicación BlackBerry para toma de datos de red
Sevilla, Febrero de 2009
editNotas = new EditField(){
protected void onFocus(int direction) {
labelDescBoton.setText("");
super.onFocus(direction);
}
};
editNotas.setFont(editNotas.getFont().derive((int) editNotas.getStyle(), 16));
editNotas.setFont(editNotas.getFont().derive((int) (editNotas.getStyle() | Font.BOLD)));
geNotas.add(new LabelField());
geNotas.add(labelNotas);
geNotas.add(new LabelField());
geNotas.add(editNotas);
geNotas.add(new LabelField());
this.add(geNotas);
// Botones
GestorElementos geBotones = new GestorElementos(Manager.USE_ALL_WIDTH,
GestorElementos.CENTRADO);
long[] anchosBotones = { 17, 16, 16, 16, 16, 17 };
geBotones.n_cols = 6;
geBotones.anchos = anchosBotones;
geBotones.asignaAnchosPixeles();
// Guardar comentarios
cbfGuardarNota = new BotonPersonalizado(Bitmap
.getBitmapResource("imgMarcarNota.png"), Color.RED) {
protected void onFocus(int direction) {
labelDescBoton.setText("Guardar nota");
super.onFocus(direction);
}
};
fclGuardarNota = new FieldChangeListener() {
public void fieldChanged(Field field, int context) {
marcarNota();
}
};
cbfGuardarNota.setChangeListener(fclGuardarNota);
// GPS
if (Gps.getInstancia().getEstado() == Gps.ESTADO_EN_MARCHA) {
cbfGPS = new BotonPersonalizado(Bitmap.getBitmapResource("imgGpsOn.png"),
Color.RED) {
protected void onFocus(int direction) {
labelDescBoton.setText("Detener estudio de datos de red");
super.onFocus(direction);
}
};
} else {
cbfGPS = new BotonPersonalizado(Bitmap.getBitmapResource("imgGpsOff.png"),
Color.RED) {
protected void onFocus(int direction) {
labelDescBoton.setText("Iniciar estudio de datos de red");
super.onFocus(direction);
}
};
}
fclGPS = new FieldChangeListener() {
public void fieldChanged(Field field, int context) {
cambiaEstado();
}
};
cbfGPS.setChangeListener(fclGPS);
// Enviar email
cbfMail = new BotonPersonalizado(Bitmap
.getBitmapResource("imgMail.png"), Color.RED) {
Fernando Plaza López
Página 155
Implementación de aplicación BlackBerry para toma de datos de red
Sevilla, Febrero de 2009
protected void onFocus(int direction) {
labelDescBoton.setText("Enviar correo ahora");
super.onFocus(direction);
}
};
fclMail = new FieldChangeListener() {
public void fieldChanged(Field field, int context) {
enviarAhora();
}
};
cbfMail.setChangeListener(fclMail);
// Info
cbfInfo = new BotonPersonalizado(Bitmap
.getBitmapResource("imgInfo.png"), Color.RED) {
protected void onFocus(int direction) {
labelDescBoton.setText("Ver información de red");
super.onFocus(direction);
}
};
fclInfo = new FieldChangeListener() {
public void fieldChanged(Field field, int context) {
muestraInfo();
}
};
cbfInfo.setChangeListener(fclInfo);
geBotones.add(new LabelField());
geBotones.add(cbfGuardarNota);
geBotones.add(cbfGPS);
geBotones.add(cbfMail);
geBotones.add(cbfInfo);
geBotones.add(new LabelField());
this.add(geBotones);
// Descripcion boton seleccionado
GestorElementos geDescBotones = new GestorElementos(Manager.USE_ALL_WIDTH);
long anchosDescBoton[] = { 100 };
geDescBotones.n_cols = 1;
geDescBotones.anchos = anchosDescBoton;
geDescBotones.asignaAnchosPixeles();
labelDescBoton = new RichTextField("" ,RichTextField.NON_FOCUSABLE |
RichTextField.TEXT_ALIGN_HCENTER);
labelDescBoton.setFont(labelDescBoton.getFont().derive((int) labelDescBoton.getStyle(), 16));
labelDescBoton.setFont(labelDescBoton.getFont().derive((int) (labelDescBoton.getStyle() |
Font.PLAIN)));
geDescBotones.add(labelDescBoton);
this.add(geDescBotones);
this.add(new LabelField());
// Finalmente añadimos un pie a la pantalla con el texto Universidad de Sevilla, 2009
GestorElementos gePie = new GestorElementos(Manager.USE_ALL_WIDTH);
long ancPie[] = { 100 };
gePie.n_cols = 1;
gePie.anchos = ancPie;
gePie.asignaAnchosPixeles();
RichTextField pie = new RichTextField("Universidad de Sevilla, 2009",
RichTextField.TEXT_ALIGN_HCENTER | RichTextField.NON_FOCUSABLE);
gePie.add(pie);
this.add(gePie);
}
/**
* Método para instanciar los elementos del menú. La gestión de las operaciones de los mismos
Fernando Plaza López
Página 156
Implementación de aplicación BlackBerry para toma de datos de red
Sevilla, Febrero de 2009
* se hace con métodos individuales.
*/
private void inicializaElementosMenu() {
miConfiguracion = new MenuItem("Configuracion", 50, 10) {
public void run() {
configuracion();
}
};
miOcultar = new MenuItem("Ocultar aplicación", 55, 10) {
public void run() {
ocultar();
}
};
miSalir = new MenuItem("Salir", 60, 10) {
public void run() {
salir();
}
};
}
/**
* Añade los elementos del menu a la pantalla cada vez que el usuario pulsa el botón Menu del dispositivo
*/
public void makeMenu(Menu menu, int instance) {
if (!menu.isDisplayed()) {
menu.deleteAll();
menu.add(miConfiguracion);
menu.add(miOcultar);
menu.add(miSalir);
}
}
/**
* Método al que se llama cuando el usuario pulsa el botón de incio/detención del GPS
*/
public void cambiaEstado() {
// Si el GPS estaba activo, paso a inactivo
if (Gps.getInstancia().getEstado() == Gps.ESTADO_EN_MARCHA) {
Gps.getInstancia().detener();
Gps.getInstancia().setEstado(Gps.ESTADO_PARADO);
// Si el GPS estaba inactivo, paso a activo
} else {
Gps.getInstancia().arrancar();
Gps.getInstancia().setEstado(Gps.ESTADO_EN_MARCHA);
}
padre.pantallaPrincipal.inicializaPantalla();
}
/**
* Método al que se llama cuando el usuario pulsa el botón de guardado de nota
*/
public void marcarNota() {
Location localización = Gps.getInstancia().getUltimaLocalizacionLeida();
if (localización == null || ((System.currentTimeMillis() - localización.getTimestamp()) < 60000))
{
Gps.getInstancia().insertaComentario(this.editNotas.getText());
Dialog.inform("Nota guardada!");
inicializaPantalla();
} else {
Dialog.inform("No haby cobertura GPS en este momento. Inténtelo más tarde.");
Fernando Plaza López
Página 157
Implementación de aplicación BlackBerry para toma de datos de red
Sevilla, Febrero de 2009
}
}
/**
* Método al que se llama cuando el usuario pulsa el botón de envío de correo electrónico
*/
public void enviarAhora() {
Dialog.inform("Mensaje depositado en la bandeja de salida");
try {
ManejadorCorreos.enviarEmail();
} catch (Exception ex) {
System.err.println("Error en enviarAhora: " + ex);
}
}
/**
* Método al que se llama cuando el usuario pulsa el botón de información acumulada
*/
public void muestraInfo(){
String texto = "";
// Hora ultima localización
texto+="Número de localizaciones en memoria:";
texto+='\n';
texto+=" - " + Gps.getInstancia().getVectorLocalizaciones().size();
texto+='\n';
texto+="Nivel de batería:";
texto+='\n';
texto+=" - " + DeviceInfo.getBatteryLevel() + " %";
Dialog.inform(texto);
}
/**
* Método que gestiona la opción de menú Configuración
*/
public void configuracion(){
padre.pantallaConfiguracion.inicializaPantalla();
padre.pushScreen(padre.pantallaConfiguracion);
}
/**
* Método que gestiona la opción de menú Ocultar. Pone la aplicación en background
*/
public void ocultar() {
Gps.getInstancia().detener();
padre.requestBackground();
}
/**
* Método que gestiona la opción de menú Salir. Sale de la aplicación
*/
public void salir() {
Gps.getInstancia().detener();
System.exit(0);
}
}
Fernando Plaza López
Página 158
Descargar