All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.taig.android.monix.LocationUpdates.scala Maven / Gradle / Ivy

There is a newer version: 0.8.2
Show newest version
package io.taig.android.monix

import android.content.Context
import android.location.Location
import com.google.android.gms.location.{ LocationListener, LocationRequest, LocationServices }
import io.taig.android.log.Log
import io.taig.android.monix.syntax.task._
import monix.eval.Task
import monix.execution.Ack.Stop
import monix.execution.Cancelable
import monix.reactive.observers.Subscriber

object LocationUpdates {
    def unsubscribe( client: GoogleApiClient, listener: LocationListener )(
        implicit
        t: Log.Tag
    ): Unit =
        if ( client.isConnected ) {
            Log.d( "Unsubscribing from location updates" )

            LocationServices.FusedLocationApi
                .removeLocationUpdates( client, listener )
        }

    def apply(
        client:     GoogleApiClient,
        request:    LocationRequest,
        subscriber: Subscriber.Sync[Location]
    )(
        implicit
        c: Context,
        t: Log.Tag
    ): Cancelable = {
        import subscriber.scheduler

        val listener = new LocationListener {
            override def onLocationChanged( location: Location ): Unit = {
                Log.d( s"Received location update: $location" )

                if ( subscriber.onNext( location ) == Stop ) {
                    unsubscribe( client, this )
                }
            }
        }

        Log.d( "Subscribing to location updates" )

        val pending = LocationServices.FusedLocationApi.requestLocationUpdates(
            client,
            request,
            listener,
            c.getMainLooper
        )

        val result = Task.fromPendingResult( pending ).foreach { status ⇒
            if ( !status.isSuccess ) {
                val message = "Location updates failed: " +
                    s"${status.getStatusMessage} (${status.getStatusCode})"
                val exception = new IllegalStateException( message )
                subscriber.onError( exception )
            }
        }

        Cancelable { () ⇒
            result.cancel()
            unsubscribe( client, listener )
        }
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy