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.
