viernes, 11 de mayo de 2012

Adecuación de la aplicación SMSMorseConverter


Como comentamos en el blog anterior, nuestros objetivos eran los siguientes:

- Adecuar la aplicación de traducción de mensajes a código Morse para que sea funcional para las personas sordo-ciegas.
-Realizar una batería de pruebas con diversas situaciones de uso de la aplicación y limpiar esos posibles errores, como hicimos con la aplicación AudioSense.

A la hora de adecuar la aplicación para los usuarios hacia los que va dirigida ésta, lo que estábamos buscando era una funcionalidad práctica y sencilla. Por ello, lo que pensamos para que pudiesen elegir los mensajes de una forma más sencilla fue que seleccionaran los mensajes a través de los botones de volumen (situados en los laterales de los dispositivos android), seleccionando los mensajes por numero (el 1 el que tiene la fecha más reciente) con un máximo de 10 mensajes (que se puede configurar a más o a menos). Para implementarlo lo que hicimos fue crear un KeyEvent que es la clase encargada de dar funcionalidad a los botones físicos.

Para configurar los botones creamos un método que regulase que hacer cuando pulsásemos los botones físicos y definimos acciones con ellos (clase Event) y los distintos botones. Para diferenciar que botón era pulsado creamos un switch con dos case y un default. En el primer case se situaba subir el volumen, y cuando lo reconocía ejecutaba el método que había dentro del case y el segundo era el de bajar el volumen. Si no se pulsaba ninguna de estas dos teclas los botones hacían lo que venga definido por el sistema operativo de Android.

int action = event.getAction();
        int keyCode = event.getKeyCode();
            switch (keyCode) {
            case KeyEvent.KEYCODE_VOLUME_UP:
                if (action == KeyEvent.ACTION_UP) {
               …
case KeyEvent.KEYCODE_VOLUME_DOWN:
                if (action == KeyEvent.ACTION_DOWN) {
              

Para comprobar que funcionaba el código al pulsar los botones pusimos que fuese aumentando (botón de subir el volumen) o disminuyendo (botón de bajar el volumen) una variable, número de mensaje seleccionado, que al pulsar cualquier de los botones nos mostraba por pantalla esta, y así pudimos comprobar que los botones tenían una funcionalidad correcta.

Para implementar el programa, introducimos varias condiciones dentro de los case de cada botón ya que era necesario que el programa reconociese que no había mensajes en la bandeja de entrada (lo hicimos mediante la condición cur.moveToPosition(0)==false), o que nunca pasara del decimo mensaje (forzando que una variable no pudiese pasar de 10), ya que habíamos decidido que el máximo número de mensajes que pudiese traducir el usuario fuese 10. Otra de las condiciones que pusimos fue que no pudiese bajar del primer mensaje ya que no tendría sentido. En el caso de no haber mensajes vibra 500ms como hemos mencionado anteriormente.

Después de esto, se nos ocurrió implementar que cada vez que pasases un mensaje mediante los botones de volumen te tradujese el número de mensaje a código Morse mediante vibraciones para que el usuario supiese en que mensaje estaba y así saber más fácilmente que mensaje quiere traducir. Recordar siempre que los mensajes están ordenados por fecha de antigüedad siendo el primero el más reciente.

En la pantalla lo único que pusimos fue un botón que ocupase la pantalla entera, para que cuando decida qué mensaje quiere traducir el usuario solo tenga que tocar la pantalla y el dispositivo empezará a traducir a código Morse el mensaje seleccionado. Sabrá si es el mensaje a traducir pues como hemos dicho antes se le muestra por vibraciones el número de mensaje asociado al mensaje en el que se sitúa.

Después intentamos hacer varias mejoras sobre el código que habíamos hecho. La primera era añadir la hora a la fecha del mensaje ya que podía llegar a ser útil para diferenciar mejor los mensajes. Para hacerlo añadimos al método que habíamos usado anteriormente para traducir la fecha  a un formato reconocido (dd-mm-aaaa), la hora (dd-mm-aaaa H: hh:mm). Para que diese la hora correcta tuvimos que dar la zona horaria de España (GMT+1), pero como estamos actualmente en horario de verano la hora que nos señalaba del mensaje era una hora menos que la que era realmente por eso pusimos al final GMT+2.

SimpleDateFormat datePattern = new SimpleDateFormat ("yyyy-MM-dd HH:mm");;
datePattern.setTimeZone(TimeZone.getTimeZone("GMT+2:00"));

La otra mejora que pensamos que podía ser útil, fue que pudiese elegir la velocidad del Morse, es decir, que durasen más (pulsación larga) o menos (pulsación corta) los tiempos de punto o raya. Esto podía ser útil para personas que están aprendiendo Morse o para gente con menos sensibilidad en el tacto. Les damos la posibilidad del tiempo base normal (100ms) o tiempo base lento (200ms). Para ello lo que implementamos fue el método onLongClickListener, que lo que hace es que distingue entre una pulsación larga y una pulsación corta del botón de la pantalla antes mencionado. Para poder implementar esta segunda velocidad lo que hicimos fue crear otra clase que se llamase MorseCodeConverterDouble que tuviese como velocidad base 200ms.

boton.setOnLongClickListener(new View.OnLongClickListener() {
public boolean onLongClick(View v) {

También para que para el usuario le fuese más fácil descifrar el mensaje en vez de darle el formato de mensaje que anteriormente habíamos pensado lo que hicimos fue implementarlo de otra manera:
T: ‘nº teléfono’. F:’fecha’. H: ‘hora’. M:’mensaje’ß Cadena de caracteres a traducir a código Morse.

Al final de la aplicación nos encontramos con un problema con las vibraciones, ya que cuando le dábamos al botón atrás o al botón home (botón central) o sucedía cualquier otro evento del móvil externo a la aplicación, y  ésta estaba traduciéndose un mensaje, no paraba de vibrar. Para solucionarlo lo que hicimos fue implementar todas las vibraciones desde una única variable declarada al principio de la actividad, y definimos el método onPause y onStop para cancelar las vibraciones (parecido a la aplicación AudioSense).

También cuando se está traduciendo un mensaje y cambiamos el numero de mensaje porque no nos interesa el que habíamos seleccionado (pulsamos los botones de volumen), se cancelan las vibraciones asociadas al mensaje para traducir el número de mensaje siguiente o anterior dependiendo del botón que haya pulsado el usuario. Esto es muy útil para cancelar la traducción del mensaje antes seleccionado por si no hubiese seleccionado el usuario el mensaje deseado y así no tiene que esperar a finalizar la traducción completa.

Como habíamos implementado esta doble velocidad de Morse (larga o corta pulsación), cambiamos el tiempo que estaba vibrando si no había mensajes de 500ms a 1000ms, para no crear confusión al usuario. Por tanto si no hay mensajes en la bandeja de entrada del dispositivo, vibrará 1 segundo tanto al pulsar la pantalla como al pulsar el botón de volumen.

Probando la aplicación final, nos dimos cuenta de que si girábamos la pantalla se cancelaban las vibraciones, por lo tanto como pensábamos que no era de utilidad, cancelamos el giro de pantalla desde el manifest.xml de la aplicación como en la aplicación AudioSense.

 El resultado final de la aplicación, una vez pasada ésta una batería de posibles casos de uso de la aplicación dónde surgían errores, los cuales se han corregido y son los que antes hemos mencionado, es el siguiente:



Pronto subiremos un vídeo explicativo de nuestras aplicaciones: Idiotizador, AudioSense, Morse y SMSMorseConverter.

No hay comentarios:

Publicar un comentario