|
|
@ -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; |
|
|
|
} |
|
|
|
} |
|
|
|
} |