This repository has been archived on 2022-11-03. You can view files and clone it, but cannot push or open issues or pull requests.
DevOpsOpenHack/MobileApps/MyDriving/MyDriving.Android/Services/GeolocationService.cs

116 lines
3.4 KiB
C#
Raw Permalink Normal View History

2022-11-03 20:41:13 +00:00
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for details.
using Android.App;
using Android.OS;
using Android.Content;
using MyDriving.ViewModel;
using System;
using Android.Support.V4.App;
namespace MyDriving.Droid.Services
{
public class GeolocationServiceBinder : Binder
{
public GeolocationServiceBinder(GeolocationService service)
{
Service = service;
}
public GeolocationService Service { get; }
public bool IsBound { get; set; }
}
[Service]
public class GeolocationService : Service
{
IBinder binder;
public CurrentTripViewModel ViewModel { get; private set; }
public override IBinder OnBind(Intent intent)
{
binder = new GeolocationServiceBinder(this);
return binder;
}
public override StartCommandResult OnStartCommand(Intent intent, StartCommandFlags flags, int startId)
{
var builder = new NotificationCompat.Builder(this);
var newIntent = new Intent(this, typeof (MainActivity));
newIntent.PutExtra("tracking", true);
newIntent.AddFlags(ActivityFlags.ClearTop);
newIntent.AddFlags(ActivityFlags.SingleTop);
var pendingIntent = PendingIntent.GetActivity(this, 0, newIntent, 0);
var notification = builder.SetContentIntent(pendingIntent)
.SetSmallIcon(Resource.Drawable.ic_notification)
.SetAutoCancel(false)
.SetTicker("MyDriving is recording.")
.SetContentTitle("MyDriving")
.SetContentText("MyDriving is recording your current trip.")
.Build();
StartForeground((int) NotificationFlags.ForegroundService, notification);
ViewModel = new CurrentTripViewModel();
return StartCommandResult.Sticky;
}
public void StartLocationUpdates()
{
ViewModel.StartTrackingTripCommand.Execute(null);
}
public void StopLocationUpdates()
{
ViewModel.StopTrackingTripCommand.Execute(null);
}
}
public class GeolocationServiceConnection : Java.Lang.Object, IServiceConnection
{
public GeolocationServiceConnection(GeolocationServiceBinder binder)
{
if (binder != null)
{
Binder = binder;
}
}
public GeolocationServiceBinder Binder { get; set; }
public void OnServiceConnected(ComponentName name, IBinder service)
{
var serviceBinder = service as GeolocationServiceBinder;
if (serviceBinder == null)
return;
Binder = serviceBinder;
Binder.IsBound = true;
// raise the service bound event
ServiceConnected?.Invoke(this, new ServiceConnectedEventArgs {Binder = service});
// begin updating the location in the Service
serviceBinder.Service.StartLocationUpdates();
}
public void OnServiceDisconnected(ComponentName name)
{
Binder.IsBound = false;
}
public event EventHandler<ServiceConnectedEventArgs> ServiceConnected;
}
public class ServiceConnectedEventArgs : EventArgs
{
public IBinder Binder { get; set; }
}
}