MedicionPresenter

com.uva.rafael.tfg_goniometer.presenter

## Class MedicionPresenter

- java.lang.Object
- - com.uva.rafael.tfg_goniometer.presenter.MedicionPresenter

- All Implemented Interfaces:
    android.hardware.SensorEventListener, PresenterFunctions, PresenterFunctions.MedicionFunctions

      public class MedicionPresenter
      extends java.lang.Object
      implements PresenterFunctions, android.hardware.SensorEventListener, PresenterFunctions.MedicionFunctions

  Este es el Presentador asociado al `Fragment MedicionFragment` de la aplicacion. Se encarga de llevar a cabo toda la logica asociada a las acciones del usuario realizadas en la IU.

  En concreto, se encarga de realizar la "configuracion inicial" del `Fragment`, que, consiste en actualizar el item del `NavigationView` al segundo item del mismo, fijar la orientacion de la pantalla a "Landscape", para evitar que se pueda girar, fijar el `Toolbar` como `SupportActionBar` y registrar el `Listener` del vector de rotacion del dispositivo.

  Ademas de eso, se encarga de calcular el angulo de desplazamiento del dispositivo entre dos posiciones distintas, en funcion de las lecturas obtenidas por el vector de rotacion del mismo; asi como indicar a la Vista (`MedicionFragment`), que muestre ese angulo en tiempo real mientras el usuario mueve el dispositivo

  Por ultimo, gestiona el comportamiento de la aplicacion cuando el usuario pulsa sobre el boton "Reiniciar", indicando a la Vista (`MedicionFragment`) que deje la IU tal y como estaba cuando se creo el `Fragment MedicionFragment`.

  Esta clase forma parte de la aplicacion TFG-Goniometer, desarrollada para el Trabajo de Fin de Grado - Grado en Ingenieria Informatica (Universidad de Valladolid)

  Version:
    1.0
  Author:
    Rafael Matamoros Luque
  See Also:
    `MedicionFragment`, `MainModel`, `Toolbar`, `SensorEventListener`, `Sensor`, `SensorManager`, `AlertDialog`

- - ### Nested Class Summary

    - ### Nested classes/interfaces inherited from interface com.uva.rafael.tfg_goniometer.interfaces.PresenterFunctions

      `PresenterFunctions.HomeFunctions, PresenterFunctions.MainFunctions, PresenterFunctions.MedicionFunctions, PresenterFunctions.NuevaMedicionFunctions, PresenterFunctions.NuevoPacienteFunctions, PresenterFunctions.PacientesFunctions, PresenterFunctions.PerfilPacienteFunctions, PresenterFunctions.SobreAppFunctions, PresenterFunctions.UltimasMedicionesFunctions`

  - ### Constructor Summary

    Constructors
    Constructor and Description
    `MedicionPresenter(android.app.Fragment fragment, MainModel model)` Constructor principal de la clase

  - ### Method Summary

    All Methods Instance Methods Concrete Methods
    Modifier and Type | Method and Description
    --- | ---
    `void` | `onAccuracyChanged(android.hardware.Sensor sensor, int accuracy)` Called when the accuracy of the registered rotationVector has changed.
    `void` | `onDestroy()` Perform any final cleanup before an activity is destroyed.
    `void` | `onGoniometerClicked()` Evento `ClickListener` que se llama cuando el usuario ha pulsado sobre el `LinearLayout` que contiene el goniometro en el `MedicionFragment`.
    `void` | `onPause()` Called as part of the fragment lifecycle when a fragment is going into the background, but has not (yet) been killed.
    `void` | `onResetClicked(java.lang.String lecturaGoniometro)` Evento `ClickListener` que se llama cuando el usuario ha pulsado sobre el boton "Reiniciar" en el `MedicionFragment`.
    `void` | `onResume()` Called as part of the fragment lifecycle when your fragment is ready to start interacting with the user.
    `void` | `onSensorChanged(android.hardware.SensorEvent sensorEvent)` Called when there is a new sensor event.
    `void` | `onStoreMeasurementClicked(java.lang.String measurement)` Evento `ClickListener` que se llama cuando el usuario ha pulsado sobre el boton "ALMACENAR MEDICION" en el `MedicionFragment`.
    `void` | `setUpInitialSettings(android.support.v7.widget.Toolbar toolbar)` Metodo que realiza las operaciones iniciales cuando se crea el `Fragment MedicionFragment`.

    - ### Methods inherited from class java.lang.Object

      `clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`

- - ### Constructor Detail

    - #### MedicionPresenter

          public MedicionPresenter(android.app.Fragment fragment,
                                   MainModel model)

      Constructor principal de la clase
      Parameters:
        `fragment` - Fragmento (Vista) con la que mantiene una relacion 1-a-1.
        `model` - Modelo (unico) de la aplicacion.

  - ### Method Detail

    - #### setUpInitialSettings

          public void setUpInitialSettings(android.support.v7.widget.Toolbar toolbar)

      Metodo que realiza las operaciones iniciales cuando se crea el `Fragment MedicionFragment`.

      Se encarga de marcar el segundo item del `NavigationView` (correspondiente a `MedicionFragment`), fijar la orientacion de la pantalla en "Landscape", de utilizar el `Toolbar` recibido como `SupportActionBar`, y de registrar el `Listener` del vector de rotacion, para que empiece a obtener lecturas del dispositivo.

      Ademas de esto, se encarga de enviar a la Vista (`MedicionFragment`), el tamaño que tiene que asignar al goniometro y al boton "Reiniciar" en funcion del tamaño de la pantalla del dispositivo.

      Specified by:
        `setUpInitialSettings` in interface `PresenterFunctions.MedicionFunctions`
      Parameters:
        `toolbar` - `Toolbar` a emplear como `SupportActionBar`

    - #### onGoniometerClicked

          public void onGoniometerClicked()

      Evento `ClickListener` que se llama cuando el usuario ha pulsado sobre el `LinearLayout` que contiene el goniometro en el `MedicionFragment`.

      Se encarga de comprobar si se dispone un lectura del vector de rotacion como "origen" para calcular el angulo de desplazamiento.

      Si ya se dispone de ella, significa que el usuario ha pulsado sobre el goniometro para terminar la medicion, por tanto, se deja de mostrar la variacion del angulo en tiempo real, y se obtiene la fecha y la hora en la que se ha realizado la medicion para su, quizas, posterior almacenamiento.

      Si no se dispone de ella, significa que el usuario ha pulsado sobre el goniometro para empezar la medicion, por tanto, se toma como origen de la misma la lectura que se esta obteniendo del vector de rotacion en esa posicion, y se empieza a mostrar la variacion del angulo en tiempo real.

      Specified by:
        `onGoniometerClicked` in interface `PresenterFunctions.MedicionFunctions`

    - #### onStoreMeasurementClicked

          public void onStoreMeasurementClicked(java.lang.String measurement)

      Evento `ClickListener` que se llama cuando el usuario ha pulsado sobre el boton "ALMACENAR MEDICION" en el `MedicionFragment`.

      Se encarga de:

      1.- Comprobar que el usuario ha realizado una medicion y no ha pulsado sobre el boton antes de haberlo hecho. 2.- Crea un dialogo que envia a la Vista para que se lo muestre al usuario, con el fin de confirmar que quiere almacenar la medicion. 3.- Crea un nuevo `Fragment PacientesFragment` para que el usuario elija el usuario al que quiere añadir esa medicion.

      Specified by:
        `onStoreMeasurementClicked` in interface `PresenterFunctions.MedicionFunctions`
      Parameters:
        `measurement` - Lectura obtenida del `TextView` con el angulo de desplazamiento del dispositivo.

    - #### onSensorChanged

          public void onSensorChanged(android.hardware.SensorEvent sensorEvent)

      Called when there is a new sensor event.

      Si el cambio es del vector de rotacion, se almacena la lectura del mismo en la variable global `quaternion` (previa obtencion del cuaternion asociado a la lectura del vector de rotacion), y, por ultimo, si hay que mostrar la variacion del angulo en tiempo real, se llama al metodo `mostrarAngulo()` para que obtenga el angulo de desplazamiento entre el cuaternion inicial `initialQuaternion` y el cuaternion final `quaternion`, y mande esa informacion a la vista para que se la muestre al usuario.

      Specified by:
        `onSensorChanged` in interface `android.hardware.SensorEventListener`
      Parameters:
        `sensorEvent` - the SensorEvent

    - #### onAccuracyChanged

          public void onAccuracyChanged(android.hardware.Sensor sensor,
                                        int accuracy)

      Called when the accuracy of the registered rotationVector has changed.
      Specified by:
        `onAccuracyChanged` in interface `android.hardware.SensorEventListener`
      Parameters:
        `sensor` - the Sensor
        `accuracy` - The new accuracy of this rotationVector, one of `SensorManager.SENSOR_STATUS_*`

    - #### onResetClicked

          public void onResetClicked(java.lang.String lecturaGoniometro)

      Evento `ClickListener` que se llama cuando el usuario ha pulsado sobre el boton "Reiniciar" en el `MedicionFragment`.

      Se encarga de:

      1.- Comprobar si se esta mostrando la variacion del angulo en tiempo real. 2.- De ser asi, dejar de mostrarla. 3.- Reiniciar los valores que representan el origen de la medicion. 4.- Volver al estado inicial la lectura del goniometro, asi como la barra de desplazamiento que representa la variacion del angulo.

      Specified by:
        `onResetClicked` in interface `PresenterFunctions.MedicionFunctions`
      Parameters:
        `lecturaGoniometro` - Lectura del goniometro que se tiene en ese momento.

    - #### onResume

          public void onResume()

      Called as part of the fragment lifecycle when your fragment is ready to start interacting with the user.

      Se encarga de volver a registrar el vector de rotacion para poder obtener, de nuevo, lecturas del mismo.

      Specified by:
        `onResume` in interface `PresenterFunctions.MedicionFunctions`

    - #### onPause

          public void onPause()

      Called as part of the fragment lifecycle when a fragment is going into the background, but has not (yet) been killed.

      Se encarga de borrar el `Listener` del vector de rotacion, para evitar asi, que se consuma la bateria del dispositivo cuando la actividad este en un segundo plano.

      Specified by:
        `onPause` in interface `PresenterFunctions.MedicionFunctions`

    - #### onDestroy

          public void onDestroy()

      Perform any final cleanup before an activity is destroyed.

      Se encarga de liberar la referencia al `Fragment` con el que esta asociado.

      Specified by:
        `onDestroy` in interface `PresenterFunctions`