From 341f1b24787adfdc7c13f3c5394a31d752911ab7 Mon Sep 17 00:00:00 2001 From: cocoa-dev004 <66989461+cocoa-dev004@users.noreply.github.com> Date: Tue, 19 Jul 2022 12:09:14 +0900 Subject: [PATCH] Fixed background task --- .../Covid19Radar.Android.csproj | 2 - .../Covid19Radar.Android/MainApplication.cs | 1 - .../DataMaintainanceBackgroundService.cs | 73 ++++---- .../EventLogSubmissionBackgroundService.cs | 6 +- .../Services/Logs/LogPeriodicDeleteService.cs | 80 --------- .../Migration/MigrationProcessService.cs | 4 + .../Services/Migration/WorkManagerMigrator.cs | 4 + Covid19Radar/Covid19Radar.iOS/AppDelegate.cs | 5 +- .../Covid19Radar.iOS/Covid19Radar.iOS.csproj | 2 - Covid19Radar/Covid19Radar.iOS/Info.plist | 2 - .../DataMaintainanceBackgroundService.cs | 29 ++-- .../EventLogSubmissionBackgroundService.cs | 122 +++++++------- .../Services/Logs/LogPeriodicDeleteService.cs | 159 ------------------ Covid19Radar/Covid19Radar/App.xaml.cs | 4 - .../AbsDataMaintainanceBackgroundService.cs | 5 + .../Services/Logs/LogPeriodicDeleteService.cs | 11 -- 16 files changed, 135 insertions(+), 374 deletions(-) delete mode 100644 Covid19Radar/Covid19Radar.Android/Services/Logs/LogPeriodicDeleteService.cs delete mode 100644 Covid19Radar/Covid19Radar.iOS/Services/Logs/LogPeriodicDeleteService.cs delete mode 100644 Covid19Radar/Covid19Radar/Services/Logs/LogPeriodicDeleteService.cs diff --git a/Covid19Radar/Covid19Radar.Android/Covid19Radar.Android.csproj b/Covid19Radar/Covid19Radar.Android/Covid19Radar.Android.csproj index ab12167a6..192a6b06e 100644 --- a/Covid19Radar/Covid19Radar.Android/Covid19Radar.Android.csproj +++ b/Covid19Radar/Covid19Radar.Android/Covid19Radar.Android.csproj @@ -175,7 +175,6 @@ - @@ -611,7 +610,6 @@ - diff --git a/Covid19Radar/Covid19Radar.Android/MainApplication.cs b/Covid19Radar/Covid19Radar.Android/MainApplication.cs index 8d4c5f2e1..cd1b18d69 100644 --- a/Covid19Radar/Covid19Radar.Android/MainApplication.cs +++ b/Covid19Radar/Covid19Radar.Android/MainApplication.cs @@ -134,7 +134,6 @@ private void RegisterPlatformTypes(IContainer container) // Services container.Register(Reuse.Singleton); container.Register(Reuse.Singleton); - container.Register(Reuse.Singleton); container.Register(Reuse.Singleton); container.Register(Reuse.Singleton); container.Register(Reuse.Singleton); diff --git a/Covid19Radar/Covid19Radar.Android/Services/DataMaintainanceBackgroundService.cs b/Covid19Radar/Covid19Radar.Android/Services/DataMaintainanceBackgroundService.cs index 33788b0f1..7e5e4f210 100644 --- a/Covid19Radar/Covid19Radar.Android/Services/DataMaintainanceBackgroundService.cs +++ b/Covid19Radar/Covid19Radar.Android/Services/DataMaintainanceBackgroundService.cs @@ -24,8 +24,9 @@ public class DataMaintainanceBackgroundService : AbsDataMaintainanceBackgroundSe public DataMaintainanceBackgroundService( ILoggerService loggerService, + ILogFileService logFileService, IEventLogRepository eventLogRepository - ) : base(loggerService, eventLogRepository) + ) : base(loggerService, logFileService, eventLogRepository) { // do nothing } @@ -49,7 +50,7 @@ public override void Schedule() private PeriodicWorkRequest CreatePeriodicWorkRequest() { var workRequestBuilder = new PeriodicWorkRequest.Builder( - typeof(DataMaintainanceBackgroundWorker), + typeof(BackgroundWorker), INTERVAL_IN_HOURS, TimeUnit.Hours ) .SetConstraints(new Constraints.Builder() @@ -58,49 +59,49 @@ private PeriodicWorkRequest CreatePeriodicWorkRequest() .SetBackoffCriteria(BackoffPolicy.Linear, BACKOFF_DELAY_IN_MINUTES, TimeUnit.Minutes); return workRequestBuilder.Build(); } - } - - [Preserve] - public class DataMaintainanceBackgroundWorker : Worker - { - private Lazy _dataMaintainanceBackgroundService - => new Lazy(() => ContainerLocator.Current.Resolve()); - private Lazy _loggerService => new Lazy(() => ContainerLocator.Current.Resolve()); - - public DataMaintainanceBackgroundWorker(Context context, WorkerParameters workerParameters) - : base(context, workerParameters) - { - // do nothing - } - public override Result DoWork() + [Preserve] + public class BackgroundWorker : Worker { - var dataMaintainanceBackgroundService = _dataMaintainanceBackgroundService.Value; - var loggerService = _loggerService.Value; - - loggerService.StartMethod(); + private Lazy _dataMaintainanceBackgroundService + => new Lazy(() => ContainerLocator.Current.Resolve()); + private Lazy _loggerService => new Lazy(() => ContainerLocator.Current.Resolve()); - try + public BackgroundWorker(Context context, WorkerParameters workerParameters) + : base(context, workerParameters) { - dataMaintainanceBackgroundService.ExecuteAsync().GetAwaiter().GetResult(); - return Result.InvokeSuccess(); + // do nothing } - catch (Exception exception) - { - loggerService.Exception("Exception", exception); - return Result.InvokeFailure(); - } - finally + + public override Result DoWork() { - loggerService.EndMethod(); + var dataMaintainanceBackgroundService = _dataMaintainanceBackgroundService.Value; + var loggerService = _loggerService.Value; + + loggerService.StartMethod(); + + try + { + dataMaintainanceBackgroundService.ExecuteAsync().GetAwaiter().GetResult(); + return Result.InvokeSuccess(); + } + catch (Exception exception) + { + loggerService.Exception("Exception", exception); + return Result.InvokeFailure(); + } + finally + { + loggerService.EndMethod(); + } } - } - public override void OnStopped() - { - base.OnStopped(); + public override void OnStopped() + { + base.OnStopped(); - _loggerService.Value.Warning("OnStopped"); + _loggerService.Value.Warning("OnStopped"); + } } } } diff --git a/Covid19Radar/Covid19Radar.Android/Services/EventLogSubmissionBackgroundService.cs b/Covid19Radar/Covid19Radar.Android/Services/EventLogSubmissionBackgroundService.cs index 774fe5966..52bfbcfc4 100644 --- a/Covid19Radar/Covid19Radar.Android/Services/EventLogSubmissionBackgroundService.cs +++ b/Covid19Radar/Covid19Radar.Android/Services/EventLogSubmissionBackgroundService.cs @@ -19,7 +19,7 @@ namespace Covid19Radar.Droid.Services { public class EventLogSubmissionBackgroundService : AbsEventLogSubmissionBackgroundService { - private const string CURRENT_WORK_NAME = "eventlog_submission_worker_20220112"; + private const string CURRENT_WORK_NAME = "eventlog_submission_worker_20220628"; private const long INTERVAL_IN_HOURS = 24; private const long BACKOFF_DELAY_IN_MINUTES = 60; @@ -42,14 +42,14 @@ public override void Schedule() PeriodicWorkRequest periodicWorkRequest = CreatePeriodicWorkRequest(); workManager.EnqueueUniquePeriodicWork( CURRENT_WORK_NAME, - ExistingPeriodicWorkPolicy.Replace, + ExistingPeriodicWorkPolicy.Keep, periodicWorkRequest ); _loggerService.EndMethod(); } - private static PeriodicWorkRequest CreatePeriodicWorkRequest() + private PeriodicWorkRequest CreatePeriodicWorkRequest() { var workRequestBuilder = new PeriodicWorkRequest.Builder( typeof(BackgroundWorker), diff --git a/Covid19Radar/Covid19Radar.Android/Services/Logs/LogPeriodicDeleteService.cs b/Covid19Radar/Covid19Radar.Android/Services/Logs/LogPeriodicDeleteService.cs deleted file mode 100644 index d88497c70..000000000 --- a/Covid19Radar/Covid19Radar.Android/Services/Logs/LogPeriodicDeleteService.cs +++ /dev/null @@ -1,80 +0,0 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ - -using System; -using Android.App; -using Android.Content; -using Covid19Radar.Services.Logs; -using Prism.Ioc; -using Xamarin.Essentials; - -namespace Covid19Radar.Droid.Services.Logs -{ - public class LogPeriodicDeleteService : ILogPeriodicDeleteService - { - private static readonly int requestCode = 1000; - private static readonly long executionIntervalMillis = 60 * 60 * 24 * 1000; // 24hours - - private readonly ILoggerService loggerService; - - public LogPeriodicDeleteService( - ILoggerService loggerService - ) - { - this.loggerService = loggerService; - } - - public void Init() - { - var nextScheduledTime = SetNextSchedule(); - loggerService.Info($"Next scheduled time: {DateTimeOffset.FromUnixTimeMilliseconds(nextScheduledTime).ToOffset(new TimeSpan(9, 0, 0))}"); - } - - public static long SetNextSchedule() - { - var nextScheduledTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds() + executionIntervalMillis; - - var context = Platform.AppContext; - var intent = new Intent(context, typeof(LogPeriodicDeleteReceiver)); - var pendingIntent = PendingIntent.GetBroadcast(context, requestCode, intent, PendingIntentFlags.CancelCurrent); - - var alermService = context.GetSystemService(Context.AlarmService) as AlarmManager; - if (alermService != null) - { - alermService.SetExactAndAllowWhileIdle(AlarmType.RtcWakeup, nextScheduledTime, pendingIntent); - } - - return nextScheduledTime; - } - } - - [BroadcastReceiver] - [IntentFilter(new[] { Intent.ActionBootCompleted })] - public class LogPeriodicDeleteReceiver : BroadcastReceiver - { - private ILoggerService loggerService => ContainerLocator.Current.Resolve(); - private ILogFileService logFileService => ContainerLocator.Current.Resolve(); - - public LogPeriodicDeleteReceiver() - { - // do nothing - } - - public override void OnReceive(Context context, Intent intent) - { - try - { - loggerService.Info($"Action: {intent.Action}"); - logFileService.Rotate(); - loggerService.Info("Periodic deletion of old logs."); - var nextScheduledTime = LogPeriodicDeleteService.SetNextSchedule(); - loggerService.Info($"Next scheduled time: {DateTimeOffset.FromUnixTimeMilliseconds(nextScheduledTime).ToOffset(new TimeSpan(9, 0, 0))}"); - } - catch - { - // do nothing - } - } - } -} diff --git a/Covid19Radar/Covid19Radar.Android/Services/Migration/MigrationProcessService.cs b/Covid19Radar/Covid19Radar.Android/Services/Migration/MigrationProcessService.cs index a9209cafe..bef8a4738 100644 --- a/Covid19Radar/Covid19Radar.Android/Services/Migration/MigrationProcessService.cs +++ b/Covid19Radar/Covid19Radar.Android/Services/Migration/MigrationProcessService.cs @@ -70,17 +70,20 @@ public class MigrationProccessService : IMigrationProcessService { private readonly AbsExposureDetectionBackgroundService _exposureDetectionBackgroundService; private readonly AbsDataMaintainanceBackgroundService _dataMaintainanceBackgroundService; + private readonly AbsEventLogSubmissionBackgroundService _eventLogSubmissionBackgroundService; private readonly ILoggerService _loggerService; public MigrationProccessService( AbsExposureDetectionBackgroundService exposureDetectionBackgroundService, AbsDataMaintainanceBackgroundService dataMaintainanceBackgroundService, + AbsEventLogSubmissionBackgroundService eventLogSubmissionBackgroundService, ILoggerService loggerService ) { _exposureDetectionBackgroundService = exposureDetectionBackgroundService; _dataMaintainanceBackgroundService = dataMaintainanceBackgroundService; + _eventLogSubmissionBackgroundService = eventLogSubmissionBackgroundService; _loggerService = loggerService; } @@ -91,6 +94,7 @@ public async Task SetupAsync() await new WorkManagerMigrator( _exposureDetectionBackgroundService, _dataMaintainanceBackgroundService, + _eventLogSubmissionBackgroundService, _loggerService ).ExecuteAsync(); diff --git a/Covid19Radar/Covid19Radar.Android/Services/Migration/WorkManagerMigrator.cs b/Covid19Radar/Covid19Radar.Android/Services/Migration/WorkManagerMigrator.cs index 5fc117812..c40b7b290 100644 --- a/Covid19Radar/Covid19Radar.Android/Services/Migration/WorkManagerMigrator.cs +++ b/Covid19Radar/Covid19Radar.Android/Services/Migration/WorkManagerMigrator.cs @@ -20,17 +20,20 @@ internal class WorkManagerMigrator private readonly AbsExposureDetectionBackgroundService _exposureDetectionBackgroundService; private readonly AbsDataMaintainanceBackgroundService _dataMaintainanceBackgroundService; + private readonly AbsEventLogSubmissionBackgroundService _eventLogSubmissionBackgroundService; private readonly ILoggerService _loggerService; public WorkManagerMigrator( AbsExposureDetectionBackgroundService exposureDetectionBackgroundService, AbsDataMaintainanceBackgroundService dataMaintainanceBackgroundService, + AbsEventLogSubmissionBackgroundService eventLogSubmissionBackgroundService, ILoggerService loggerService ) { _exposureDetectionBackgroundService = exposureDetectionBackgroundService; _dataMaintainanceBackgroundService = dataMaintainanceBackgroundService; + _eventLogSubmissionBackgroundService = eventLogSubmissionBackgroundService; _loggerService = loggerService; } @@ -43,6 +46,7 @@ internal Task ExecuteAsync() _exposureDetectionBackgroundService.Schedule(); _dataMaintainanceBackgroundService.Schedule(); + _eventLogSubmissionBackgroundService.Schedule(); _loggerService.EndMethod(); diff --git a/Covid19Radar/Covid19Radar.iOS/AppDelegate.cs b/Covid19Radar/Covid19Radar.iOS/AppDelegate.cs index b989d2dd0..c36334acb 100644 --- a/Covid19Radar/Covid19Radar.iOS/AppDelegate.cs +++ b/Covid19Radar/Covid19Radar.iOS/AppDelegate.cs @@ -115,12 +115,12 @@ public override bool FinishedLaunching(UIApplication app, NSDictionary launchOpt UIApplication.SharedApplication.SetMinimumBackgroundFetchInterval(UIApplication.BackgroundFetchIntervalMinimum); - ScheduleBackgroundTask(); + ScheduleBackgroundTasks(); return base.FinishedLaunching(app, launchOptions); } - private void ScheduleBackgroundTask() + private void ScheduleBackgroundTasks() { try { @@ -269,7 +269,6 @@ private void RegisterPlatformTypes(IContainer container) // Services container.Register(Reuse.Singleton); container.Register(Reuse.Singleton); - container.Register(Reuse.Singleton); container.Register(Reuse.Singleton); container.Register(Reuse.Singleton); container.Register(Reuse.Singleton); diff --git a/Covid19Radar/Covid19Radar.iOS/Covid19Radar.iOS.csproj b/Covid19Radar/Covid19Radar.iOS/Covid19Radar.iOS.csproj index 874a138eb..2f1704fe3 100644 --- a/Covid19Radar/Covid19Radar.iOS/Covid19Radar.iOS.csproj +++ b/Covid19Radar/Covid19Radar.iOS/Covid19Radar.iOS.csproj @@ -256,7 +256,6 @@ - @@ -546,7 +545,6 @@ - diff --git a/Covid19Radar/Covid19Radar.iOS/Info.plist b/Covid19Radar/Covid19Radar.iOS/Info.plist index 4b8d77ceb..7c84330af 100644 --- a/Covid19Radar/Covid19Radar.iOS/Info.plist +++ b/Covid19Radar/Covid19Radar.iOS/Info.plist @@ -54,7 +54,6 @@ BGTaskSchedulerPermittedIdentifiers APP_PACKAGE_NAME.exposure-notification - APP_PACKAGE_NAME.delete-old-logs APP_PACKAGE_NAME.eventlog-submission APP_PACKAGE_NAME.data-maintainance @@ -62,7 +61,6 @@ LaunchScreen UIBackgroundModes - fetch processing UIUserInterfaceStyle diff --git a/Covid19Radar/Covid19Radar.iOS/Services/DataMaintainanceBackgroundService.cs b/Covid19Radar/Covid19Radar.iOS/Services/DataMaintainanceBackgroundService.cs index 3df569f1a..a93881e97 100644 --- a/Covid19Radar/Covid19Radar.iOS/Services/DataMaintainanceBackgroundService.cs +++ b/Covid19Radar/Covid19Radar.iOS/Services/DataMaintainanceBackgroundService.cs @@ -17,18 +17,15 @@ namespace Covid19Radar.iOS.Services { public class DataMaintainanceBackgroundService : AbsDataMaintainanceBackgroundService { - private const int TASK_INTERVAL_IN_DAYS = 1; + private const double BGTASK_INTERVAL = 24 * 60 * 60; // one day private static readonly string BGTASK_IDENTIFIER = AppInfo.PackageName + ".data-maintainance"; - private readonly IDateTimeUtility _dateTimeUtility; - public DataMaintainanceBackgroundService( ILoggerService loggerService, - IEventLogRepository eventLogRepository, - IDateTimeUtility dateTimeUtility - ) : base(loggerService, eventLogRepository) + ILogFileService logFileService, + IEventLogRepository eventLogRepository + ) : base(loggerService, logFileService, eventLogRepository) { - _dateTimeUtility = dateTimeUtility; } public override void Schedule() @@ -39,14 +36,15 @@ public override void Schedule() { LoggerService.Info("Background task has been started."); - DateTime nextDateTime = _dateTimeUtility.UtcNow.Date.AddDays(TASK_INTERVAL_IN_DAYS); - ScheduleBgTask(nextDateTime); + ScheduleBgTask(); var cancellationTokenSource = new CancellationTokenSource(); task.ExpirationHandler = cancellationTokenSource.Cancel; _ = Task.Run(async () => { + LoggerService.Info("Task.Run() start"); + try { await ExecuteAsync(); @@ -65,25 +63,26 @@ public override void Schedule() finally { cancellationTokenSource.Dispose(); + LoggerService.Info("Task.Run() end"); } }, cancellationTokenSource.Token); }); if (result) { - LoggerService.Debug("BGTaskScheduler.Shared.Register succeeded."); + LoggerService.Info("BGTaskScheduler.Shared.Register succeeded."); } else { - LoggerService.Info("BGTaskScheduler.Shared.Register failed."); + LoggerService.Error("BGTaskScheduler.Shared.Register failed."); } - ScheduleBgTask(_dateTimeUtility.UtcNow); + ScheduleBgTask(); LoggerService.EndMethod(); } - private void ScheduleBgTask(DateTime nextDateTime) + private void ScheduleBgTask() { LoggerService.StartMethod(); @@ -91,9 +90,11 @@ private void ScheduleBgTask(DateTime nextDateTime) { BGProcessingTaskRequest bgTaskRequest = new BGProcessingTaskRequest(BGTASK_IDENTIFIER) { - EarliestBeginDate = NSDate.FromTimeIntervalSince1970(nextDateTime.ToUnixEpoch()) + EarliestBeginDate = NSDate.FromTimeIntervalSinceNow(BGTASK_INTERVAL), }; + _loggerService.Info($"request.EarliestBeginDate: {bgTaskRequest.EarliestBeginDate}"); + BGTaskScheduler.Shared.Submit(bgTaskRequest, out var error); if (error != null) { diff --git a/Covid19Radar/Covid19Radar.iOS/Services/EventLogSubmissionBackgroundService.cs b/Covid19Radar/Covid19Radar.iOS/Services/EventLogSubmissionBackgroundService.cs index 34736ba7b..6b63c9511 100644 --- a/Covid19Radar/Covid19Radar.iOS/Services/EventLogSubmissionBackgroundService.cs +++ b/Covid19Radar/Covid19Radar.iOS/Services/EventLogSubmissionBackgroundService.cs @@ -17,9 +17,8 @@ namespace Covid19Radar.iOS.Services { public class EventLogSubmissionBackgroundService : AbsEventLogSubmissionBackgroundService { - private static readonly string IDENTIFIER = AppInfo.PackageName + ".eventlog-submission"; - - private const double ONE_DAY_IN_SECONDS = 1 * 24 * 60 * 60; + private const double BGTASK_INTERVAL = 24 * 60 * 60; // one day + private static readonly string BGTASK_IDENTIFIER = AppInfo.PackageName + ".eventlog-submission"; private readonly IEventLogService _eventLogService; private readonly IEventLogRepository _eventLogRepository; @@ -40,79 +39,88 @@ public override void Schedule() { _loggerService.StartMethod(); - _ = BGTaskScheduler.Shared.Register(IDENTIFIER, null, task => + bool result = BGTaskScheduler.Shared.Register(BGTASK_IDENTIFIER, null, task => { - HandleSendLogAsync((BGAppRefreshTask)task); - }); + _loggerService.Info("Background task has been started."); - ScheduleSendEventLog(); + ScheduleBgTask(); - _loggerService.EndMethod(); - } - - private void HandleSendLogAsync(BGAppRefreshTask task) - { - _loggerService.StartMethod(); + var cancellationTokenSource = new CancellationTokenSource(); + task.ExpirationHandler = cancellationTokenSource.Cancel; - ScheduleSendEventLog(); + _ = Task.Run(async () => + { + _loggerService.Info("Task.Run() start"); + + try + { + await _eventLogRepository.RotateAsync( + AppConstants.EventLogFileExpiredSeconds); + + await _eventLogService.SendAllAsync( + AppConstants.EventLogMaxRequestSizeInBytes, + AppConstants.EventLogMaxRetry); + + task.SetTaskCompleted(true); + } + catch (OperationCanceledException exception) + { + _loggerService.Exception($"Background task canceled.", exception); + task.SetTaskCompleted(false); + } + catch (Exception exception) + { + _loggerService.Exception($"Exception", exception); + task.SetTaskCompleted(false); + } + finally + { + cancellationTokenSource.Dispose(); + _loggerService.Info("Task.Run() end"); + } + }, cancellationTokenSource.Token); + }); - var cancellationTokenSource = new CancellationTokenSource(); - task.ExpirationHandler = cancellationTokenSource.Cancel; + ScheduleBgTask(); - _ = Task.Run(async () => + if (result) { - _loggerService.Info("HandleSendLogAsync() Task.Run() start"); - try - { - await _eventLogRepository.RotateAsync( - AppConstants.EventLogFileExpiredSeconds); - - await _eventLogService.SendAllAsync( - AppConstants.EventLogMaxRequestSizeInBytes, - AppConstants.EventLogMaxRetry); - task.SetTaskCompleted(true); - } - catch (OperationCanceledException exception) - { - _loggerService.Exception($"Background task canceled.", exception); - task.SetTaskCompleted(false); - } - catch (Exception exception) - { - _loggerService.Exception($"Exception", exception); - task.SetTaskCompleted(false); - } - finally - { - cancellationTokenSource.Dispose(); - _loggerService.Info("HandleSendLogAsync() Task.Run() end"); - } - }); + _loggerService.Info("BGTaskScheduler.Shared.Register succeeded."); + } + else + { + _loggerService.Error("BGTaskScheduler.Shared.Register failed."); + } _loggerService.EndMethod(); } - private void ScheduleSendEventLog() + private void ScheduleBgTask() { _loggerService.StartMethod(); - var bgTaskRequest = new BGProcessingTaskRequest(IDENTIFIER) + try { - EarliestBeginDate = NSDate.FromTimeIntervalSinceNow(ONE_DAY_IN_SECONDS), - RequiresNetworkConnectivity = true - }; + var bgTaskRequest = new BGProcessingTaskRequest(BGTASK_IDENTIFIER) + { + EarliestBeginDate = NSDate.FromTimeIntervalSinceNow(BGTASK_INTERVAL), + RequiresNetworkConnectivity = true + }; - _loggerService.Info($"request.EarliestBeginDate: {bgTaskRequest.EarliestBeginDate}"); + _loggerService.Info($"request.EarliestBeginDate: {bgTaskRequest.EarliestBeginDate}"); - _ = BGTaskScheduler.Shared.Submit(bgTaskRequest, out var error); - if (error != null) + _ = BGTaskScheduler.Shared.Submit(bgTaskRequest, out var error); + if (error != null) + { + NSErrorException exception = new NSErrorException(error); + _loggerService.Exception("BGTaskScheduler submit failed.", exception); + throw exception; + } + } + finally { - NSErrorException exception = new NSErrorException(error); - _loggerService.Exception("BGTaskScheduler submit failed.", exception); - throw exception; + _loggerService.EndMethod(); } - - _loggerService.EndMethod(); } } } diff --git a/Covid19Radar/Covid19Radar.iOS/Services/Logs/LogPeriodicDeleteService.cs b/Covid19Radar/Covid19Radar.iOS/Services/Logs/LogPeriodicDeleteService.cs deleted file mode 100644 index 8f3955de2..000000000 --- a/Covid19Radar/Covid19Radar.iOS/Services/Logs/LogPeriodicDeleteService.cs +++ /dev/null @@ -1,159 +0,0 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ - -using BackgroundTasks; -using Covid19Radar.Services.Logs; -using Foundation; -using Xamarin.Essentials; - -namespace Covid19Radar.iOS.Services.Logs -{ - public class LogPeriodicDeleteService : ILogPeriodicDeleteService - { - #region Static Fields - - private static readonly string identifier = AppInfo.PackageName + ".delete-old-logs"; - - #endregion - - #region Instance Fields - - private readonly ILoggerService loggerService; - private readonly ILogFileService logFileService; - - #endregion - - #region Constructors - - public LogPeriodicDeleteService( - ILoggerService loggerService, - ILogFileService logFileService - ) - { - this.loggerService = loggerService; - this.logFileService = logFileService; - } - - #endregion - - #region ILogPeriodicDeleteService Methods - - public void Init() - { - loggerService.StartMethod(); - - _ = BGTaskScheduler.Shared.Register(identifier, null, task => - { - HandleAppRefresh((BGAppRefreshTask)task); - }); - - ScheduleAppRefresh(); - - loggerService.EndMethod(); - } - - #endregion - - #region Other Private Methods - - private void HandleAppRefresh(BGAppRefreshTask task) - { - try - { - loggerService.StartMethod(); - - ScheduleAppRefresh(); - - var queue = new NSOperationQueue(); - queue.MaxConcurrentOperationCount = 1; - - task.ExpirationHandler = () => - { - loggerService.Info("Task expired."); - queue.CancelAllOperations(); - }; - - var operation = new DeleteOldLogsOperation(loggerService, logFileService); - operation.CompletionBlock = () => - { - loggerService.Info($"Operation completed. operation.IsCancelled: {operation.IsCancelled}"); - task.SetTaskCompleted(!operation.IsCancelled); - }; - - queue.AddOperation(operation); - - loggerService.EndMethod(); - } - catch - { - // do nothing - } - } - - private void ScheduleAppRefresh() - { - loggerService.StartMethod(); - - var oneDay = 1 * 24 * 60 * 60; - var request = new BGAppRefreshTaskRequest(identifier); - request.EarliestBeginDate = NSDate.FromTimeIntervalSinceNow(oneDay); // Fetch no earlier than 1 day from now - - loggerService.Info($"request.EarliestBeginDate: {request.EarliestBeginDate}"); - - _ = BGTaskScheduler.Shared.Submit(request, out var error); - - if (error != null) - { - loggerService.Error($"Could not schedule app refresh. Error: {error}"); - } - - loggerService.EndMethod(); - } - - #endregion - } - - class DeleteOldLogsOperation : NSOperation - { - #region Instance Fields - - private readonly ILoggerService loggerService; - private readonly ILogFileService logFileService; - - #endregion - - #region Constructors - - public DeleteOldLogsOperation(ILoggerService loggerService, ILogFileService logFileService) - { - this.loggerService = loggerService; - this.logFileService = logFileService; - } - - #endregion - - #region NSOperation Methods - - public override void Main() - { - base.Main(); - - try - { - loggerService.StartMethod(); - - logFileService.Rotate(); - - loggerService.Info("Periodic deletion of old logs."); - loggerService.EndMethod(); - } - catch - { - // do nothing - } - } - - #endregion - } -} diff --git a/Covid19Radar/Covid19Radar/App.xaml.cs b/Covid19Radar/Covid19Radar/App.xaml.cs index 235eab879..448208526 100644 --- a/Covid19Radar/Covid19Radar/App.xaml.cs +++ b/Covid19Radar/Covid19Radar/App.xaml.cs @@ -243,10 +243,6 @@ private static void RegisterCommonTypes(IContainer container) protected override async void OnStart() { - // Initialize periodic log delete service - var logPeriodicDeleteService = Container.Resolve(); - logPeriodicDeleteService.Init(); - LogFileService.Rotate(); await EventLogRepository.RotateAsync( diff --git a/Covid19Radar/Covid19Radar/Services/AbsDataMaintainanceBackgroundService.cs b/Covid19Radar/Covid19Radar/Services/AbsDataMaintainanceBackgroundService.cs index eefa1c0e1..60ac0e9b1 100644 --- a/Covid19Radar/Covid19Radar/Services/AbsDataMaintainanceBackgroundService.cs +++ b/Covid19Radar/Covid19Radar/Services/AbsDataMaintainanceBackgroundService.cs @@ -13,13 +13,16 @@ public abstract class AbsDataMaintainanceBackgroundService : IBackgroundService { protected ILoggerService LoggerService { get; private set; } + private readonly ILogFileService _logFileService; private readonly IEventLogRepository _eventLogRepository; protected AbsDataMaintainanceBackgroundService( ILoggerService loggerService, + ILogFileService logFileService, IEventLogRepository eventLogRepository) { LoggerService = loggerService; + _logFileService = logFileService; _eventLogRepository = eventLogRepository; } @@ -31,6 +34,8 @@ public async Task ExecuteAsync() try { + _logFileService.Rotate(); + await _eventLogRepository.RotateAsync( AppConstants.EventLogFileExpiredSeconds); } diff --git a/Covid19Radar/Covid19Radar/Services/Logs/LogPeriodicDeleteService.cs b/Covid19Radar/Covid19Radar/Services/Logs/LogPeriodicDeleteService.cs deleted file mode 100644 index 0a9711e44..000000000 --- a/Covid19Radar/Covid19Radar/Services/Logs/LogPeriodicDeleteService.cs +++ /dev/null @@ -1,11 +0,0 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ - -namespace Covid19Radar.Services.Logs -{ - public interface ILogPeriodicDeleteService - { - void Init(); - } -}