/// <summary>
        /// intenta buscar la ubicacion actual
        /// utilizando el gps.
        /// </summary>
        /// <param name="geolocator"></param>
        /// <param name="timeout"></param>
        /// <returns></returns>
        private async Task <LocationResult> GetGPSPosition()
        {
            var request  = new GeolocationRequest(GeolocationAccuracy.Best);
            var position = await Geolocation.GetLocationAsync(request);

            return((position is null) ?
                   LocationResult.Fail(msg: "No se pudo obtener la ubicación del gps") :
                   LocationResult.Done(position: position));
        }
        /// <summary>
        /// en caso que la ubicacion ya se haya encontrado retorna la posicion cacheada
        /// en caso que no exista la intenta buscar con el gps.
        /// </summary>
        /// <param name="geolocator"></param>
        /// <param name="timeout"></param>
        /// <returns></returns>
        private async Task <LocationResult> GetCachedPosition( )
        {
            var position = await Geolocation.GetLastKnownLocationAsync();

            if (position is null)
            {
                return(await GetGPSPosition());
            }
            return(LocationResult.Done(position: position));
        }
        /// <summary>
        ///
        /// </summary>
        /// <param name="cached"></param>
        /// <param name="accuracy"></param>
        /// <param name="timeout"></param>
        /// <returns></returns>
        public async Task <LocationResult> FindLocation(bool cached = true)
        {
            try
            {
                LocationResult result;

                if (cached)
                {
                    result = await GetCachedPosition();

                    LastPosition = result.Position;
                    return(result);
                }

                result = await GetGPSPosition();

                LastPosition = result.Position;
                return(result);
            }
            catch (FeatureNotSupportedException e)
            {
                // handle no support on device
                var err = string.IsNullOrEmpty(e.Message) ?
                          "No se pudo obtener la ubicación: característica no soportada" :
                          e.Message;
                return(LocationResult.Fail(err));
            }
            catch (FeatureNotEnabledException e) {
                //
                var err = string.IsNullOrEmpty(e.Message) ?
                          "No se pudo obtener la ubicación: característica no habilitada" :
                          e.Message;
                return(LocationResult.Fail(err));
            }
            catch (PermissionException e)
            {
                // handle permision exception
                var err = string.IsNullOrEmpty(e.Message) ?
                          "No se pudo obtener la ubicación: Permisos no otorgados" :
                          e.Message;
                return(LocationResult.Fail(err));
            }
            catch (Exception e)
            {
                // unable get position.
                var err = string.IsNullOrEmpty(e.Message) ?
                          "No se pudo obtener la ubicación: Error desconocido" :
                          e.Message;
                return(LocationResult.Fail(err));
            }
        }