/// <summary> /// Get called when Region is left /// </summary> /// <param name="region">Region thats left.</param> private void OnRegionLeft(CLRegion region) { if (!this.geofenceResults.ContainsKey(region.Identifier)) { this.geofenceResults.Add( region.Identifier, new GeofenceResult { RegionId = region.Identifier }); } if (this.LastKnownLocation != null) { this.geofenceResults[region.Identifier].Latitude = this.LastKnownLocation.Latitude; this.geofenceResults[region.Identifier].Longitude = this.LastKnownLocation.Longitude; this.geofenceResults[region.Identifier].Accuracy = this.LastKnownLocation.Accuracy; } else { this.geofenceResults[region.Identifier].Latitude = region.Center.Latitude; this.geofenceResults[region.Identifier].Longitude = region.Center.Longitude; this.geofenceResults[region.Identifier].Accuracy = region.Radius; } this.geofenceResults[region.Identifier].LastExitTime = DateTime.Now; this.geofenceResults[region.Identifier].Transition = GeofenceTransition.Exited; CrossGeofence.GeofenceListener.OnRegionStateChanged(this.geofenceResults[region.Identifier]); if (this.Regions[region.Identifier].ShowNotification) { GeofenceImplementation.CreateNotification(ViewAction, string.IsNullOrEmpty(this.Regions[region.Identifier].NotificationExitMessage) ? this.GeofenceResults[region.Identifier].ToString() : this.Regions[region.Identifier].NotificationExitMessage); } }
/// <summary> /// Get Called on RegionEntered. /// </summary> /// <param name="region">Region entered.</param> private async void OnRegionEntered(CLRegion region) { if (this.GeofenceResults.ContainsKey(region.Identifier) && this.GeofenceResults[region.Identifier].Transition == GeofenceTransition.Entered) { return; } if (!this.geofenceResults.ContainsKey(region.Identifier)) { this.geofenceResults.Add( region.Identifier, new GeofenceResult { RegionId = region.Identifier }); } if (this.LastKnownLocation != null) { this.geofenceResults[region.Identifier].Latitude = this.LastKnownLocation.Latitude; this.geofenceResults[region.Identifier].Longitude = this.LastKnownLocation.Longitude; this.geofenceResults[region.Identifier].Accuracy = this.LastKnownLocation.Accuracy; } else { this.geofenceResults[region.Identifier].Latitude = region.Center.Latitude; this.geofenceResults[region.Identifier].Longitude = region.Center.Longitude; this.geofenceResults[region.Identifier].Accuracy = region.Radius; } this.geofenceResults[region.Identifier].LastEnterTime = DateTime.Now; this.geofenceResults[region.Identifier].LastExitTime = null; this.geofenceResults[region.Identifier].Transition = GeofenceTransition.Entered; if (region.NotifyOnEntry) { CrossGeofence.GeofenceListener.OnRegionStateChanged(this.geofenceResults[region.Identifier]); if (this.Regions.ContainsKey(region.Identifier) && this.Regions[region.Identifier].ShowNotification) { GeofenceImplementation.CreateNotification(ViewAction, string.IsNullOrEmpty(this.Regions[region.Identifier].NotificationEntryMessage) ? this.GeofenceResults[region.Identifier].ToString() : this.Regions[region.Identifier].NotificationEntryMessage); } } // Checks if device has stayed asynchronously await GeofenceImplementation.CheckIfStayed(region.Identifier); }
/// <summary> /// Checks if has passed to stayed state /// </summary> /// <returns>The if stayed.</returns> /// <param name="regionId">Region identifier.</param> public static async Task CheckIfStayed(string regionId) { if (CrossGeofence.Current.GeofenceResults.ContainsKey(regionId) && CrossGeofence.Current.Regions.ContainsKey(regionId) && CrossGeofence.Current.Regions[regionId].NotifyOnStay && CrossGeofence.Current.GeofenceResults[regionId].Transition == GeofenceTransition.Entered && Math.Abs(CrossGeofence.Current.Regions[regionId].StayedInThresholdDuration.TotalMilliseconds) > float.Epsilon) { await Task.Delay((int)CrossGeofence.Current.Regions[regionId].StayedInThresholdDuration.TotalMilliseconds); if (CrossGeofence.Current.GeofenceResults[regionId].LastExitTime == null && CrossGeofence.Current.GeofenceResults[regionId].Transition != GeofenceTransition.Stayed) { CrossGeofence.Current.GeofenceResults[regionId].Transition = GeofenceTransition.Stayed; CrossGeofence.GeofenceListener.OnRegionStateChanged(CrossGeofence.Current.GeofenceResults[regionId]); if (CrossGeofence.Current.Regions[regionId].ShowNotification) { GeofenceImplementation.CreateNotification(ViewAction, string.IsNullOrEmpty(CrossGeofence.Current.Regions[regionId].NotificationStayMessage) ? CrossGeofence.Current.GeofenceResults[regionId].ToString() : CrossGeofence.Current.Regions[regionId].NotificationStayMessage); } } } }