Uso de intenciones en Mis Lugares

Ejercicio: Intenciones implícitas en Mis Lugares

1. En la clase CasosUsoLugar añade cuatro nuevos casos de uso:

// INTENCIONES
public void compartir(Lugar lugar) {
   Intent i = new Intent(Intent.ACTION_SEND);
   i.setType("text/plain");
   i.putExtra(Intent.EXTRA_TEXT, 
              lugar.getNombre() + " - " + lugar.getUrl());
   actividad.startActivity(i);
}

public void llamarTelefono(Lugar lugar) {
   actividad.startActivity(new Intent(Intent.ACTION_DIAL, 
            Uri.parse("tel:" + lugar.getTelefono())));
}

public void verPgWeb(Lugar lugar) {
   actividad.startActivity(new Intent(Intent.ACTION_VIEW,
            Uri.parse(lugar.getUrl())));
}

public final void verMapa(Lugar lugar) {
   double lat = lugar.getPosicion().getLatitud();
   double lon = lugar.getPosicion().getLongitud();
   Uri uri = lugar.getPosicion() != GeoPunto.SIN_POSICION
      ? Uri.parse("geo:" + lat + ',' + lon) 
      : Uri.parse("geo:0,0?q=" + lugar.getDireccion());
   actividad.startActivity(new Intent("android.intent.action.VIEW", uri));
} 
// INTENCIONES
fun compartir(lugar: Lugar) = actividad.startActivity(
   Intent(Intent.ACTION_SEND).apply {
      type = "text/plain"
      putExtra(Intent.EXTRA_TEXT, "$(lugar.nombre) - $(lugar.url)")
   })

fun llamarTelefono(lugar: Lugar) = actividad.startActivity(
   Intent(Intent.ACTION_DIAL, Uri.parse("tel:" + lugar.telefono)))

fun verPgWeb(lugar: Lugar) = actividad.startActivity(
   Intent(Intent.ACTION_VIEW, Uri.parse(lugar.url)))

fun verMapa(lugar: Lugar) {
   val lat = lugar.posicion.latitud
   val lon = lugar.posicion.longitud
   val uri = if (lugar.posicion != GeoPunto.SIN_POSICION)
                  Uri.parse("geo:$lat,$lon")
             else Uri.parse("geo:0,0?q=" + lugar.direccion)
   actividad.startActivity(Intent(Intent.ACTION_VIEW, uri))
} 
El primer método crea una intención implícita con acción ACTION_SEND. Mandaremos un texto plano formado por el nombre del lugar y su URL. Esta información podrá ser recogida por cualquier aplicación que se haya registrado como enviadora de mensajes (WhatsApp, Gmail, SMS, etc.).

El segundo método realiza una llamada telefónica al número del lugar. El tercero abre su página Web. El cuarto obtiene la latitud y longitud del lugar. Si alguna de las dos es distinta de cero, consideraremos que se ha introducido esta información y crearemos una URI basada en estos valores. Si son cero, consideraremos que no se han introducido, por lo que crearemos una URI basándonos en la dirección del lugar.

2.   En la clase VistaLugarActivity hay que llamar a dos de estos métodos desde el menú. En el método onOptionsItemSelected() añade el código subrayado:

@Override public boolean onOptionsItemSelected(MenuItem item) {
   switch (item.getItemId()) {
   case R.id.accion_compartir:
      usoLugar.compartir(lugar);
      return true;
   case R.id.accion_llegar:
      usoLugar.verMapa(lugar);
      return true;
      … 
override fun onOptionsItemSelected(item: MenuItem): Boolean {
   when (item.getItemId()) {
      R.id.accion_compartir -> {
         usoLugar.compartir(lugar)
         return true
      }
      R.id.accion_llegar -> {
         usoLugar.verMapa(lugar)
         return true
      }
      … 

3.    Ejecuta la aplicación, selecciona alguno de los lugares y utiliza la barra de acciones para verificar estas opciones. Para verificar la segunda opción, es importante que el terminal disponga de algún software de mapas (como Google Maps).

4.    Abre el layout vista_lugar.xml. Localiza el LinearLayout que contiene el icono y el texto con la dirección. Añade el atributo onClick como se muestra a continuación:

lt;LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal" 
    android:onClick="verMapa">
        <ImageView
            android:layout_width="40dp"
            android:layout_height="40dp"
            android:contentDescription="logo dirección"
            android:src="@android:drawable/ic_menu_myplaces" />
        … 

5.  Añade también el atributo onClick en los LinearLayout que contienen el teléfono y la URL utilizando el método adecuado.

6.  Añade a VistaLugarActivity los siguientes métodos:

void verMapa(View view) {
   usoLugar.verMapa(lugar);
}

void llamarTelefono(View view) {
   usoLugar.llamarTelefono(lugar);
}

void verPgWeb(View view) {
   usoLugar.verPgWeb(lugar);
} 
fun verMapa(view: View) = usoLugar.verMapa(lugar)

fun llamarTelefono(view: View) = usoLugar.llamarTelefono(lugar)

fun verPgWeb(view: View) = usoLugar.verPgWeb(lugar) 

7.  Verifica el funcionamiento de las nuevas intenciones implícitas.