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