|
|
|
|
using Android.App;
|
|
|
|
|
using Android.Content;
|
|
|
|
|
using Android.OS;
|
|
|
|
|
using Android.Runtime;
|
|
|
|
|
using Android.Views;
|
|
|
|
|
using Android.Widget;
|
|
|
|
|
using System;
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
using System.Linq;
|
|
|
|
|
using System.Text;
|
|
|
|
|
using PhilExample.Droid.Services;
|
|
|
|
|
using PhilExample.Droid.Utils;
|
|
|
|
|
using PhilExample.Services;
|
|
|
|
|
|
|
|
|
|
[assembly: Xamarin.Forms.Dependency(typeof(ForegroundCrawlService))]
|
|
|
|
|
namespace PhilExample.Droid.Services
|
|
|
|
|
{
|
|
|
|
|
[Service]
|
|
|
|
|
public class ForegroundCrawlService : Service, IForegroundCrawlService
|
|
|
|
|
{
|
|
|
|
|
private static IForegroundCrawlDelegate _crawlDelegate;
|
|
|
|
|
private static readonly int _notiID = 1;
|
|
|
|
|
private static bool _running = false;
|
|
|
|
|
|
|
|
|
|
const string NOTIFICATION_CHANNEL_ID = "1";
|
|
|
|
|
const string NOTIFICATION_CHANNEL_NAME = "PhilExample_noti_1";
|
|
|
|
|
const string NOTIFICATION_CHANNEL_DESCR = "PhilExample_foreground";
|
|
|
|
|
|
|
|
|
|
private static System.Threading.Timer _callClock;
|
|
|
|
|
|
|
|
|
|
#region IForegroundCrawlService
|
|
|
|
|
public void Start(IForegroundCrawlDelegate del)
|
|
|
|
|
{
|
|
|
|
|
_crawlDelegate = del;
|
|
|
|
|
|
|
|
|
|
if (_running)
|
|
|
|
|
UpdateNotification();
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
StartService();
|
|
|
|
|
_running = true;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void UpdateNotification()
|
|
|
|
|
{
|
|
|
|
|
NotificationHelper.GetAndroidNotificationManager().Notify(_notiID, CreateNotification());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void Stop()
|
|
|
|
|
{
|
|
|
|
|
if(_callClock != null)
|
|
|
|
|
{
|
|
|
|
|
_callClock.Dispose();
|
|
|
|
|
_callClock = null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//StopForeground(StopForegroundFlags.Remove);
|
|
|
|
|
var fgIntent = new Intent(MainActivity._THIS, typeof(ForegroundCrawlService));
|
|
|
|
|
MainActivity._THIS.StopService(fgIntent);
|
|
|
|
|
_running = false;
|
|
|
|
|
}
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private void StartService()
|
|
|
|
|
{
|
|
|
|
|
var intent = new Intent(MainActivity._THIS, typeof(ForegroundCrawlService));
|
|
|
|
|
|
|
|
|
|
if (Build.VERSION.SdkInt >= BuildVersionCodes.O)
|
|
|
|
|
MainActivity._THIS.StartForegroundService(intent);
|
|
|
|
|
else
|
|
|
|
|
MainActivity._THIS.StartService(intent);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public override StartCommandResult OnStartCommand(Intent intent, StartCommandFlags flags, int startId)
|
|
|
|
|
{
|
|
|
|
|
if (_crawlDelegate == null)
|
|
|
|
|
throw new NotImplementedException("Android ForegroundCrawlService.StartCommandResult");
|
|
|
|
|
|
|
|
|
|
Console.WriteLine("Starting foregorund crawl service with _notiID: " + _notiID);
|
|
|
|
|
NotificationHelper.CreateNotificationChannel(NOTIFICATION_CHANNEL_ID, NOTIFICATION_CHANNEL_NAME, NOTIFICATION_CHANNEL_DESCR);
|
|
|
|
|
//_foregroundNotification = CreateNotification();
|
|
|
|
|
StartForeground(_notiID, CreateNotification());
|
|
|
|
|
|
|
|
|
|
var startTimeSpan = TimeSpan.Zero;
|
|
|
|
|
var periodTimeSpan = TimeSpan.FromSeconds(1);
|
|
|
|
|
|
|
|
|
|
_callClock = new System.Threading.Timer((e) =>
|
|
|
|
|
{
|
|
|
|
|
Console.WriteLine("[" + DateTime.Now.TimeOfDay.ToString().Substring(0, 8) + "] (" + _notiID + ") foreground service timer call started");
|
|
|
|
|
_crawlDelegate.Crawl();
|
|
|
|
|
Console.WriteLine("[" + DateTime.Now.TimeOfDay.ToString().Substring(0, 8) + "] (" + _notiID + ") foreground service timer call finished");
|
|
|
|
|
}, null, startTimeSpan, periodTimeSpan);
|
|
|
|
|
return StartCommandResult.Sticky;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private Notification CreateNotification()
|
|
|
|
|
{
|
|
|
|
|
string msgTitle = _crawlDelegate.GetForegroundNotificationTitle;
|
|
|
|
|
string msgDescr = _crawlDelegate.GetForegroundNotificationDescription;
|
|
|
|
|
|
|
|
|
|
Intent notificationIntent = new Intent(MainActivity._THIS, typeof(MainActivity));
|
|
|
|
|
var onClickIntent = PendingIntent.GetActivity(MainActivity._THIS, 0, notificationIntent, PendingIntentFlags.UpdateCurrent);
|
|
|
|
|
var notification = new Notification.Builder(MainActivity._THIS, NOTIFICATION_CHANNEL_ID)
|
|
|
|
|
.SetContentIntent(onClickIntent)
|
|
|
|
|
.SetContentTitle(msgTitle)
|
|
|
|
|
.SetContentText(msgDescr)
|
|
|
|
|
.SetSmallIcon(Resource.Drawable.abc_ab_share_pack_mtrl_alpha)
|
|
|
|
|
.SetOngoing(true)
|
|
|
|
|
.Build();
|
|
|
|
|
return notification;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public override IBinder OnBind(Intent intent) => null;
|
|
|
|
|
}
|
|
|
|
|
}
|