Browse Source

Android Location Services Implemented.

master
Kaustav Chaudhuri 1 year ago
parent
commit
d61ebd4b75
1 changed files with 134 additions and 0 deletions
  1. +134
    -0
      GMCabsDriverAssistantSolution/Platforms/Android/Services/AndroidLocationService.cs

+ 134
- 0
GMCabsDriverAssistantSolution/Platforms/Android/Services/AndroidLocationService.cs View File

@ -0,0 +1,134 @@
using Android.App;
using Android.Content;
using Android.OS;
using Android.Runtime;
using AndroidX.Core.App;
using GMCabsDriverAssistant.Messages;
using GMCabsDriverAssistant.Services;
using GMCabsDriverAssistantSolution.Platforms.Android.Services;
using Sentry;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
[assembly: Dependency(typeof(AndroidLocationService))]
namespace GMCabsDriverAssistantSolution.Platforms.Android.Services
{
[Service(Enabled = true)]
public class AndroidLocationService : Service, IForegroundService
{
CancellationTokenSource _cts;
public const int SERVICE_RUNNING_NOTIFICATION_ID = 10000;
public static bool IsForegroundServiceRunning;
public override IBinder OnBind(Intent intent)
{
return null;
}
[return: GeneratedEnum]
public override StartCommandResult OnStartCommand(Intent intent, [GeneratedEnum] StartCommandFlags flags, int startId)
{
string foregroundChannelId = "GMCabsForeGroundServiceChannel";
_cts = new CancellationTokenSource();
Task.Run(() =>
{
while (IsForegroundServiceRunning)
{
try
{
var locShared = new LocationService();
locShared.Run(_cts.Token).Wait();
}
catch (System.OperationCanceledException oce)
{
SentrySdk.CaptureException(oce);
}
finally
{
if (_cts.IsCancellationRequested)
{
var message = new StopServiceMessage();
Device.BeginInvokeOnMainThread(
() => DependencyService.Resolve<IForegroundService>().StopMyForegroundService()
);
}
}
}
}, _cts.Token);
var notifManager = this.GetSystemService(global::Android.Content.Context.NotificationService) as NotificationManager;
var pendingIntentFlags = (Build.VERSION.SdkInt >= BuildVersionCodes.S)
? PendingIntentFlags.UpdateCurrent | PendingIntentFlags.Mutable
: PendingIntentFlags.UpdateCurrent;
var pendingActivityIntent = PendingIntent.GetActivity(this, 0, intent, pendingIntentFlags);
var pendingIntent = PendingIntent.GetBroadcast(this, 0, intent, pendingIntentFlags);
var notificationBuilder = new NotificationCompat.Builder(this, foregroundChannelId)
.SetContentTitle("Location")
.SetContentText("Update location")
.SetPriority(1)
.SetOngoing(true)
.SetAutoCancel(true)
.SetContentIntent(pendingIntent);
if (global::Android.OS.Build.VERSION.SdkInt >= global::Android.OS.BuildVersionCodes.O)
{
var notificationChannel = new NotificationChannel(foregroundChannelId, "Title", NotificationImportance.High);
notificationChannel.Importance = NotificationImportance.High;
notificationChannel.EnableLights(true);
notificationChannel.EnableVibration(true);
notificationChannel.SetShowBadge(true);
notificationChannel.SetVibrationPattern(new long[] { 100, 200, 300 });
if (notificationBuilder != null)
{
notificationBuilder.SetChannelId(foregroundChannelId);
notifManager.CreateNotificationChannel(notificationChannel);
}
}
// Notification notif = DependencyService.Get<INotification>().ReturnNotif();
StartForeground(SERVICE_RUNNING_NOTIFICATION_ID, notificationBuilder.Build());
return base.OnStartCommand(intent, flags, startId);
}
public override void OnCreate()
{
base.OnCreate();
IsForegroundServiceRunning = true;
}
public override void OnDestroy()
{
IsForegroundServiceRunning = false;
if (_cts != null)
{
_cts.Token.ThrowIfCancellationRequested();
_cts.Cancel();
}
base.OnDestroy();
}
public void StartMyForegroundService()
{
var intent = new Intent(global::Android.App.Application.Context, typeof(AndroidLocationService));
if (global::Android.OS.Build.VERSION.SdkInt >= global::Android.OS.BuildVersionCodes.O)
{
global::Android.App.Application.Context.StartForegroundService(intent);
}
else
{
global::Android.App.Application.Context.StartService(intent);
}
}
public void StopMyForegroundService()
{
var intent = new Intent(global::Android.App.Application.Context, typeof(AndroidLocationService));
global::Android.App.Application.Context.StopService(intent);
}
public bool IsForeGroundServiceRunning()
{
return IsForegroundServiceRunning;
}
}
}

Loading…
Cancel
Save