From cdbe128a3e01d5c12fd680e0da8a7ad8a19b5786 Mon Sep 17 00:00:00 2001 From: ARIYAMA Keiji Date: Mon, 27 Dec 2021 14:16:52 +0900 Subject: [PATCH 01/23] Migrate from AlarmManager to WorkManager --- .../Covid19Radar.Android/MainApplication.cs | 2 +- .../Services/Logs/LogPeriodicDeleteService.cs | 104 +++++++++++------- Covid19Radar/Covid19Radar.iOS/AppDelegate.cs | 2 +- .../Services/Logs/LogPeriodicDeleteService.cs | 18 +-- Covid19Radar/Covid19Radar/App.xaml.cs | 8 +- .../Logs/AbsLogPeriodicDeleteService.cs | 21 ++++ .../Services/Logs/LogPeriodicDeleteService.cs | 11 -- 7 files changed, 105 insertions(+), 61 deletions(-) create mode 100644 Covid19Radar/Covid19Radar/Services/Logs/AbsLogPeriodicDeleteService.cs delete mode 100644 Covid19Radar/Covid19Radar/Services/Logs/LogPeriodicDeleteService.cs diff --git a/Covid19Radar/Covid19Radar.Android/MainApplication.cs b/Covid19Radar/Covid19Radar.Android/MainApplication.cs index e9827b98d..d1a372e7c 100644 --- a/Covid19Radar/Covid19Radar.Android/MainApplication.cs +++ b/Covid19Radar/Covid19Radar.Android/MainApplication.cs @@ -98,7 +98,7 @@ 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); container.Register(Reuse.Singleton); diff --git a/Covid19Radar/Covid19Radar.Android/Services/Logs/LogPeriodicDeleteService.cs b/Covid19Radar/Covid19Radar.Android/Services/Logs/LogPeriodicDeleteService.cs index d88497c70..b80b66a22 100644 --- a/Covid19Radar/Covid19Radar.Android/Services/Logs/LogPeriodicDeleteService.cs +++ b/Covid19Radar/Covid19Radar.Android/Services/Logs/LogPeriodicDeleteService.cs @@ -3,78 +3,108 @@ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ using System; -using Android.App; +using System.IO; using Android.Content; +using Android.Runtime; +using AndroidX.Work; +using Covid19Radar.Services; using Covid19Radar.Services.Logs; +using Java.Util.Concurrent; using Prism.Ioc; using Xamarin.Essentials; namespace Covid19Radar.Droid.Services.Logs { - public class LogPeriodicDeleteService : ILogPeriodicDeleteService + public class LogPeriodicDeleteService : AbsLogPeriodicDeleteService { - private static readonly int requestCode = 1000; - private static readonly long executionIntervalMillis = 60 * 60 * 24 * 1000; // 24hours + private const string CURRENT_WORK_NAME = "log_periodic_delete_worker_20211227"; - private readonly ILoggerService loggerService; + private static readonly long INTERVAL_IN_HOURS = 24; + private static readonly long BACKOFF_DELAY_IN_MINUTES = 60; public LogPeriodicDeleteService( ILoggerService loggerService - ) + ) : base(loggerService) { - this.loggerService = loggerService; } - public void Init() + public override void Schedule() { - var nextScheduledTime = SetNextSchedule(); - loggerService.Info($"Next scheduled time: {DateTimeOffset.FromUnixTimeMilliseconds(nextScheduledTime).ToOffset(new TimeSpan(9, 0, 0))}"); - } + loggerService.StartMethod(); - public static long SetNextSchedule() - { - var nextScheduledTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds() + executionIntervalMillis; + WorkManager workManager = WorkManager.GetInstance(Platform.AppContext); - var context = Platform.AppContext; - var intent = new Intent(context, typeof(LogPeriodicDeleteReceiver)); - var pendingIntent = PendingIntent.GetBroadcast(context, requestCode, intent, PendingIntentFlags.CancelCurrent); + PeriodicWorkRequest periodicWorkRequest = CreatePeriodicWorkRequest(); + workManager.EnqueueUniquePeriodicWork( + CURRENT_WORK_NAME, + ExistingPeriodicWorkPolicy.Replace, + periodicWorkRequest + ); - var alermService = context.GetSystemService(Context.AlarmService) as AlarmManager; - if (alermService != null) - { - alermService.SetExactAndAllowWhileIdle(AlarmType.RtcWakeup, nextScheduledTime, pendingIntent); - } + loggerService.EndMethod(); + } - return nextScheduledTime; + private static PeriodicWorkRequest CreatePeriodicWorkRequest() + { + var workRequestBuilder = new PeriodicWorkRequest.Builder( + typeof(BackgroundWorker), + INTERVAL_IN_HOURS, TimeUnit.Hours + ) + .SetConstraints(new Constraints.Builder() + .SetRequiresBatteryNotLow(true) + .Build()) + .SetBackoffCriteria(BackoffPolicy.Linear, BACKOFF_DELAY_IN_MINUTES, TimeUnit.Minutes); + return workRequestBuilder.Build(); } } - [BroadcastReceiver] - [IntentFilter(new[] { Intent.ActionBootCompleted })] - public class LogPeriodicDeleteReceiver : BroadcastReceiver + [Preserve] + public class BackgroundWorker : Worker { - private ILoggerService loggerService => ContainerLocator.Current.Resolve(); - private ILogFileService logFileService => ContainerLocator.Current.Resolve(); + private Lazy _loggerService => new Lazy(() => ContainerLocator.Current.Resolve()); + private Lazy _logFileService => new Lazy(() => ContainerLocator.Current.Resolve()); - public LogPeriodicDeleteReceiver() + public BackgroundWorker(Context context, WorkerParameters workerParameters) + : base(context, workerParameters) { - // do nothing } - public override void OnReceive(Context context, Intent intent) + public override Result DoWork() { + var loggerService = _loggerService.Value; + var logFileService = _logFileService.Value; + + loggerService.StartMethod(); + 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))}"); + loggerService.Info("Success: Periodic deletion of old logs."); + + return Result.InvokeSuccess(); } - catch + catch (IOException exception) { - // do nothing + loggerService.Exception("IOException", exception); + return Result.InvokeRetry(); + } + catch (Exception exception) + { + loggerService.Exception("Exception", exception); + return Result.InvokeFailure(); + } + finally + { + loggerService.EndMethod(); } } + + public override void OnStopped() + { + base.OnStopped(); + + _loggerService.Value.Warning("OnStopped"); + } + } } diff --git a/Covid19Radar/Covid19Radar.iOS/AppDelegate.cs b/Covid19Radar/Covid19Radar.iOS/AppDelegate.cs index 2a6a3b9e4..45fd2210f 100644 --- a/Covid19Radar/Covid19Radar.iOS/AppDelegate.cs +++ b/Covid19Radar/Covid19Radar.iOS/AppDelegate.cs @@ -246,7 +246,7 @@ 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); container.Register(Reuse.Singleton); diff --git a/Covid19Radar/Covid19Radar.iOS/Services/Logs/LogPeriodicDeleteService.cs b/Covid19Radar/Covid19Radar.iOS/Services/Logs/LogPeriodicDeleteService.cs index 8f3955de2..86d741223 100644 --- a/Covid19Radar/Covid19Radar.iOS/Services/Logs/LogPeriodicDeleteService.cs +++ b/Covid19Radar/Covid19Radar.iOS/Services/Logs/LogPeriodicDeleteService.cs @@ -3,14 +3,21 @@ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ using BackgroundTasks; +using Covid19Radar.Services; using Covid19Radar.Services.Logs; using Foundation; using Xamarin.Essentials; namespace Covid19Radar.iOS.Services.Logs { - public class LogPeriodicDeleteService : ILogPeriodicDeleteService + public class LogPeriodicDeleteService : AbsLogPeriodicDeleteService { + #region Constants + + private const double ONE_DAY_IN_SECONDS = 1 * 24 * 60 * 60; + + #endregion + #region Static Fields private static readonly string identifier = AppInfo.PackageName + ".delete-old-logs"; @@ -19,7 +26,6 @@ public class LogPeriodicDeleteService : ILogPeriodicDeleteService #region Instance Fields - private readonly ILoggerService loggerService; private readonly ILogFileService logFileService; #endregion @@ -29,9 +35,8 @@ public class LogPeriodicDeleteService : ILogPeriodicDeleteService public LogPeriodicDeleteService( ILoggerService loggerService, ILogFileService logFileService - ) + ) : base(loggerService) { - this.loggerService = loggerService; this.logFileService = logFileService; } @@ -39,7 +44,7 @@ ILogFileService logFileService #region ILogPeriodicDeleteService Methods - public void Init() + public override void Schedule() { loggerService.StartMethod(); @@ -95,9 +100,8 @@ 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 + request.EarliestBeginDate = NSDate.FromTimeIntervalSinceNow(ONE_DAY_IN_SECONDS); // Fetch no earlier than 1 day from now loggerService.Info($"request.EarliestBeginDate: {request.EarliestBeginDate}"); diff --git a/Covid19Radar/Covid19Radar/App.xaml.cs b/Covid19Radar/Covid19Radar/App.xaml.cs index c82f65b40..b7e13d7d5 100644 --- a/Covid19Radar/Covid19Radar/App.xaml.cs +++ b/Covid19Radar/Covid19Radar/App.xaml.cs @@ -222,11 +222,11 @@ private static void RegisterCommonTypes(IContainer container) protected override void OnStart() { - // Initialize periodic log delete service - var logPeriodicDeleteService = Container.Resolve(); - logPeriodicDeleteService.Init(); - LogFileService.Rotate(); + + // Initialize periodic log delete service + var logPeriodicDeleteService = Container.Resolve(); + logPeriodicDeleteService.Schedule(); } protected override void OnResume() diff --git a/Covid19Radar/Covid19Radar/Services/Logs/AbsLogPeriodicDeleteService.cs b/Covid19Radar/Covid19Radar/Services/Logs/AbsLogPeriodicDeleteService.cs new file mode 100644 index 000000000..72cf729b5 --- /dev/null +++ b/Covid19Radar/Covid19Radar/Services/Logs/AbsLogPeriodicDeleteService.cs @@ -0,0 +1,21 @@ +// 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 Covid19Radar.Services.Logs; + +namespace Covid19Radar.Services +{ + public abstract class AbsLogPeriodicDeleteService : IBackgroundService + { + protected readonly ILoggerService loggerService; + + public AbsLogPeriodicDeleteService( + ILoggerService loggerService + ) + { + this.loggerService = loggerService; + } + + public abstract void Schedule(); + } +} 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(); - } -} From 6e2acc670cbd2ccd2d9e49d00f3b60774897edb2 Mon Sep 17 00:00:00 2001 From: ARIYAMA Keiji Date: Mon, 27 Dec 2021 16:15:38 +0900 Subject: [PATCH 02/23] Schedule LogPeriodicDelete to WorkManager on Migrating process. --- .../Services/Migration/MigrationProcessService.cs | 4 ++++ .../Services/Migration/WorkManagerMigrator.cs | 5 +++++ 2 files changed, 9 insertions(+) diff --git a/Covid19Radar/Covid19Radar.Android/Services/Migration/MigrationProcessService.cs b/Covid19Radar/Covid19Radar.Android/Services/Migration/MigrationProcessService.cs index 9ee3dbbbb..094239d0c 100644 --- a/Covid19Radar/Covid19Radar.Android/Services/Migration/MigrationProcessService.cs +++ b/Covid19Radar/Covid19Radar.Android/Services/Migration/MigrationProcessService.cs @@ -69,14 +69,17 @@ public override Result DoWork() public class MigrationProccessService : IMigrationProcessService { private readonly AbsExposureDetectionBackgroundService _exposureDetectionBackgroundService; + private readonly AbsLogPeriodicDeleteService _logPeriodicDeleteService; private readonly ILoggerService _loggerService; public MigrationProccessService( AbsExposureDetectionBackgroundService exposureDetectionBackgroundService, + AbsLogPeriodicDeleteService logPeriodicDeleteService, ILoggerService loggerService ) { _exposureDetectionBackgroundService = exposureDetectionBackgroundService; + _logPeriodicDeleteService = logPeriodicDeleteService; _loggerService = loggerService; } @@ -86,6 +89,7 @@ public async Task SetupAsync() await new WorkManagerMigrator( _exposureDetectionBackgroundService, + _logPeriodicDeleteService, _loggerService ).ExecuteAsync(); diff --git a/Covid19Radar/Covid19Radar.Android/Services/Migration/WorkManagerMigrator.cs b/Covid19Radar/Covid19Radar.Android/Services/Migration/WorkManagerMigrator.cs index a75fb8080..7381421d1 100644 --- a/Covid19Radar/Covid19Radar.Android/Services/Migration/WorkManagerMigrator.cs +++ b/Covid19Radar/Covid19Radar.Android/Services/Migration/WorkManagerMigrator.cs @@ -18,14 +18,18 @@ internal class WorkManagerMigrator }; private readonly AbsExposureDetectionBackgroundService _exposureDetectionBackgroundService; + private readonly AbsLogPeriodicDeleteService _logPeriodicDeleteService; + private readonly ILoggerService _loggerService; public WorkManagerMigrator( AbsExposureDetectionBackgroundService exposureDetectionBackgroundService, + AbsLogPeriodicDeleteService logPeriodicDeleteService, ILoggerService loggerService ) { _exposureDetectionBackgroundService = exposureDetectionBackgroundService; + _logPeriodicDeleteService = logPeriodicDeleteService; _loggerService = loggerService; } @@ -37,6 +41,7 @@ internal Task ExecuteAsync() CancelOldWorks(workManager, OldWorkNames, _loggerService); _exposureDetectionBackgroundService.Schedule(); + _logPeriodicDeleteService.Schedule(); _loggerService.EndMethod(); From 60b41636d2f63a610a5d15471cd2baa3694b4aaa Mon Sep 17 00:00:00 2001 From: ARIYAMA Keiji Date: Wed, 22 Jun 2022 12:45:55 +0900 Subject: [PATCH 03/23] Move LogPeriodicDeleteService scheduling from App to AppDelegate and MainApplicaiton. --- .../Covid19Radar.Android/MainApplication.cs | 13 +++++++++++++ .../Services/Logs/LogPeriodicDeleteService.cs | 2 +- Covid19Radar/Covid19Radar.iOS/AppDelegate.cs | 13 +++++++++++++ .../Services/Logs/LogPeriodicDeleteService.cs | 6 +++--- Covid19Radar/Covid19Radar/App.xaml.cs | 4 ---- 5 files changed, 30 insertions(+), 8 deletions(-) diff --git a/Covid19Radar/Covid19Radar.Android/MainApplication.cs b/Covid19Radar/Covid19Radar.Android/MainApplication.cs index c17891755..d54d1a0f5 100644 --- a/Covid19Radar/Covid19Radar.Android/MainApplication.cs +++ b/Covid19Radar/Covid19Radar.Android/MainApplication.cs @@ -54,6 +54,9 @@ private Lazy _loggerService private Lazy _exposureConfigurationRepository = new Lazy(() => ContainerLocator.Current.Resolve()); + private Lazy _logPeriodicDeleteService + = new Lazy(() => ContainerLocator.Current.Resolve()); + public MainApplication(IntPtr handle, JniHandleOwnership transfer) : base(handle, transfer) { } @@ -95,6 +98,7 @@ private void ScheduleBackgroundTasks() { _loggerService.Value.Exception("Failed to schedule ExposureDetectionBackgroundService", exception); } + try { _eventLogSubmissionBackgroundService.Value.Schedule(); @@ -103,6 +107,15 @@ private void ScheduleBackgroundTasks() { _loggerService.Value.Exception("Failed to schedule EventLogSubmissionBackgroundService", exception); } + + try + { + _logPeriodicDeleteService.Value.Schedule(); + } + catch (Exception exception) + { + _loggerService.Value.Exception("Failed to schedule LogPeriodicDeleteService", exception); + } } private void SetupENClient(ExposureNotificationClient client) diff --git a/Covid19Radar/Covid19Radar.Android/Services/Logs/LogPeriodicDeleteService.cs b/Covid19Radar/Covid19Radar.Android/Services/Logs/LogPeriodicDeleteService.cs index b80b66a22..82fd60172 100644 --- a/Covid19Radar/Covid19Radar.Android/Services/Logs/LogPeriodicDeleteService.cs +++ b/Covid19Radar/Covid19Radar.Android/Services/Logs/LogPeriodicDeleteService.cs @@ -17,7 +17,7 @@ namespace Covid19Radar.Droid.Services.Logs { public class LogPeriodicDeleteService : AbsLogPeriodicDeleteService { - private const string CURRENT_WORK_NAME = "log_periodic_delete_worker_20211227"; + private const string CURRENT_WORK_NAME = "log_periodic_delete_worker_20220622"; private static readonly long INTERVAL_IN_HOURS = 24; private static readonly long BACKOFF_DELAY_IN_MINUTES = 60; diff --git a/Covid19Radar/Covid19Radar.iOS/AppDelegate.cs b/Covid19Radar/Covid19Radar.iOS/AppDelegate.cs index b8c9cb05f..414e973b6 100644 --- a/Covid19Radar/Covid19Radar.iOS/AppDelegate.cs +++ b/Covid19Radar/Covid19Radar.iOS/AppDelegate.cs @@ -53,6 +53,9 @@ private Lazy _loggerService private Lazy _exposureConfigurationRepository = new Lazy(() => ContainerLocator.Current.Resolve()); + private Lazy _logPeriodicDeleteService + = new Lazy(() => ContainerLocator.Current.Resolve()); + private App? AppInstance { get @@ -127,6 +130,7 @@ private void ScheduleBackgroundTask() { _loggerService.Value.Exception("Failed to schedule ExposureDetectionBackgroundService", exception); } + try { _eventLogSubmissionBackgroundService.Value.Schedule(); @@ -135,6 +139,15 @@ private void ScheduleBackgroundTask() { _loggerService.Value.Exception("Failed to schedule EventLogSubmissionBackgroundService", exception); } + + try + { + _logPeriodicDeleteService.Value.Schedule(); + } + catch (Exception exception) + { + _loggerService.Value.Exception("Failed to schedule LogPeriodicDeleteService", exception); + } } private bool IsUniversalLinks(NSDictionary launchOptions) diff --git a/Covid19Radar/Covid19Radar.iOS/Services/Logs/LogPeriodicDeleteService.cs b/Covid19Radar/Covid19Radar.iOS/Services/Logs/LogPeriodicDeleteService.cs index 86d741223..4cf869cce 100644 --- a/Covid19Radar/Covid19Radar.iOS/Services/Logs/LogPeriodicDeleteService.cs +++ b/Covid19Radar/Covid19Radar.iOS/Services/Logs/LogPeriodicDeleteService.cs @@ -26,7 +26,7 @@ public class LogPeriodicDeleteService : AbsLogPeriodicDeleteService #region Instance Fields - private readonly ILogFileService logFileService; + private readonly ILogFileService _logFileService; #endregion @@ -37,7 +37,7 @@ public LogPeriodicDeleteService( ILogFileService logFileService ) : base(loggerService) { - this.logFileService = logFileService; + _logFileService = logFileService; } #endregion @@ -79,7 +79,7 @@ private void HandleAppRefresh(BGAppRefreshTask task) queue.CancelAllOperations(); }; - var operation = new DeleteOldLogsOperation(loggerService, logFileService); + var operation = new DeleteOldLogsOperation(loggerService, _logFileService); operation.CompletionBlock = () => { loggerService.Info($"Operation completed. operation.IsCancelled: {operation.IsCancelled}"); diff --git a/Covid19Radar/Covid19Radar/App.xaml.cs b/Covid19Radar/Covid19Radar/App.xaml.cs index 269615797..1464fc2d4 100644 --- a/Covid19Radar/Covid19Radar/App.xaml.cs +++ b/Covid19Radar/Covid19Radar/App.xaml.cs @@ -232,10 +232,6 @@ private static void RegisterCommonTypes(IContainer container) protected override void OnStart() { LogFileService.Rotate(); - - // Initialize periodic log delete service - var logPeriodicDeleteService = Container.Resolve(); - logPeriodicDeleteService.Schedule(); } protected override void OnResume() From 506123b820124be676ebdcc251b38f670b9be0c4 Mon Sep 17 00:00:00 2001 From: ARIYAMA Keiji Date: Sat, 18 Jun 2022 13:44:30 +0900 Subject: [PATCH 04/23] Fix the issue that restoring NuGet packages failed on mac-latest image. --- Nuget.config | 1 + 1 file changed, 1 insertion(+) diff --git a/Nuget.config b/Nuget.config index b1eb6ad04..846ec155b 100644 --- a/Nuget.config +++ b/Nuget.config @@ -2,6 +2,7 @@ + From bf67ec49b62304d51d663b7b5b03bbe83a9cf01e Mon Sep 17 00:00:00 2001 From: ARIYAMA Keiji Date: Wed, 22 Jun 2022 13:25:15 +0900 Subject: [PATCH 05/23] Update CIserver.yml --- .github/workflows/CIserver.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/CIserver.yml b/.github/workflows/CIserver.yml index 5e22e7970..32c3af59f 100644 --- a/.github/workflows/CIserver.yml +++ b/.github/workflows/CIserver.yml @@ -69,7 +69,7 @@ jobs: - name: Add msbuild to PATH uses: microsoft/setup-msbuild@v1 - name: msbuild - run: msbuild ${{ github.workspace }}/Covid19Radar.Functions.sln /restore /t:Build /p:Configuration=${{ matrix.Configuration }} + run: msbuild ${{ github.workspace }}/Covid19Radar.Functions.sln /restore /t:Build /p:RestoreConfigFile=${{ github.workspace }}/Nuget.config /p:Configuration=${{ matrix.Configuration }} - name: Execute Unit Tests run: dotnet test ${{ github.workspace }}/Covid19Radar.Functions.sln /p:CollectCoverage=true /p:CoverletOutputFormat=opencover --no-build --logger trx --settings ${{ github.workspace }}/Covid19Radar.Functions.runsettings --configuration ${{ matrix.Configuration }} --collect:"XPlat Code Coverage" env: From 4ba25b4dbeaddb0d7f442626114048006d8e7fe5 Mon Sep 17 00:00:00 2001 From: ARIYAMA Keiji Date: Fri, 24 Jun 2022 10:01:30 +0900 Subject: [PATCH 06/23] Migrate BGAppRefreshTaskRequest to BGProcessingTaskRequest --- .../EventLogSubmissionBackgroundService.cs | 103 ++++++------- .../Services/Logs/LogPeriodicDeleteService.cs | 139 +++++++----------- 2 files changed, 98 insertions(+), 144 deletions(-) diff --git a/Covid19Radar/Covid19Radar.iOS/Services/EventLogSubmissionBackgroundService.cs b/Covid19Radar/Covid19Radar.iOS/Services/EventLogSubmissionBackgroundService.cs index eb6b65720..96e627f95 100644 --- a/Covid19Radar/Covid19Radar.iOS/Services/EventLogSubmissionBackgroundService.cs +++ b/Covid19Radar/Covid19Radar.iOS/Services/EventLogSubmissionBackgroundService.cs @@ -16,7 +16,7 @@ namespace Covid19Radar.iOS.Services { public class EventLogSubmissionBackgroundService : AbsEventLogSubmissionBackgroundService { - private static readonly string IDENTIFIER = AppInfo.PackageName + ".eventlog-submission"; + private static readonly string BGTASK_IDENTIFIER = AppInfo.PackageName + ".eventlog-submission"; private const double ONE_DAY_IN_SECONDS = 1 * 24 * 60 * 60; @@ -36,77 +36,70 @@ public override void Schedule() { _loggerService.StartMethod(); - _ = BGTaskScheduler.Shared.Register(IDENTIFIER, null, task => + var result = BGTaskScheduler.Shared.Register(BGTASK_IDENTIFIER, null, task => { - HandleSendLogAsync((BGAppRefreshTask)task); - }); - - ScheduleSendEventLog(); + _loggerService.Info("Background task has been started."); - _loggerService.EndMethod(); - } - - private void HandleSendLogAsync(BGAppRefreshTask task) - { - _loggerService.StartMethod(); + ScheduleBgTask(); - ScheduleSendEventLog(); + var cancellationTokenSource = new CancellationTokenSource(); + task.ExpirationHandler = cancellationTokenSource.Cancel; - var cancellationTokenSource = new CancellationTokenSource(); - task.ExpirationHandler = cancellationTokenSource.Cancel; - - _ = Task.Run(async () => - { - _loggerService.Info("HandleSendLogAsync() Task.Run() start"); - try - { - 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) + _ = Task.Run(async () => { - _loggerService.Exception($"Exception", exception); - task.SetTaskCompleted(false); - } - finally - { - cancellationTokenSource.Dispose(); - _loggerService.Info("HandleSendLogAsync() Task.Run() end"); - } + try + { + 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(); + } + }, cancellationTokenSource.Token); }); + ScheduleBgTask(); + _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 - }; - - _loggerService.Info($"request.EarliestBeginDate: {bgTaskRequest.EarliestBeginDate}"); + BGProcessingTaskRequest bgTaskRequest = new BGProcessingTaskRequest(BGTASK_IDENTIFIER) + { + RequiresNetworkConnectivity = true, + EarliestBeginDate = NSDate.FromTimeIntervalSinceNow(HALF_DAY_IN_SECONDS) + }; - _ = 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 index 4cf869cce..81dc0f55b 100644 --- a/Covid19Radar/Covid19Radar.iOS/Services/Logs/LogPeriodicDeleteService.cs +++ b/Covid19Radar/Covid19Radar.iOS/Services/Logs/LogPeriodicDeleteService.cs @@ -2,6 +2,9 @@ * 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 System.Threading; +using System.Threading.Tasks; using BackgroundTasks; using Covid19Radar.Services; using Covid19Radar.Services.Logs; @@ -20,7 +23,7 @@ public class LogPeriodicDeleteService : AbsLogPeriodicDeleteService #region Static Fields - private static readonly string identifier = AppInfo.PackageName + ".delete-old-logs"; + private static readonly string BGTASK_IDENTIFIER = AppInfo.PackageName + ".delete-old-logs"; #endregion @@ -48,116 +51,74 @@ public override void Schedule() { 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 + var result = BGTaskScheduler.Shared.Register(BGTASK_IDENTIFIER, null, task => { - loggerService.StartMethod(); + loggerService.Info("Background task has been started."); - ScheduleAppRefresh(); + ScheduleBgTask(); - var queue = new NSOperationQueue(); - queue.MaxConcurrentOperationCount = 1; - - task.ExpirationHandler = () => - { - loggerService.Info("Task expired."); - queue.CancelAllOperations(); - }; + var cancellationTokenSource = new CancellationTokenSource(); + task.ExpirationHandler = cancellationTokenSource.Cancel; - var operation = new DeleteOldLogsOperation(loggerService, _logFileService); - operation.CompletionBlock = () => + _ = Task.Run(() => { - 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 request = new BGAppRefreshTaskRequest(identifier); - request.EarliestBeginDate = NSDate.FromTimeIntervalSinceNow(ONE_DAY_IN_SECONDS); // 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}"); - } + try + { + _logFileService.Rotate(); + 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(); + } + }, cancellationTokenSource.Token); + }); + + ScheduleBgTask(); 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 + #region Other Private Methods - public override void Main() + private void ScheduleBgTask() { - base.Main(); + loggerService.StartMethod(); try { - loggerService.StartMethod(); - - logFileService.Rotate(); + BGProcessingTaskRequest bgTaskRequest = new BGProcessingTaskRequest(BGTASK_IDENTIFIER) + { + EarliestBeginDate = NSDate.FromTimeIntervalSinceNow(ONE_DAY_IN_SECONDS) + }; - loggerService.Info("Periodic deletion of old logs."); - loggerService.EndMethod(); + BGTaskScheduler.Shared.Submit(bgTaskRequest, out var error); + if (error != null) + { + NSErrorException exception = new NSErrorException(error); + loggerService.Exception("BGTaskScheduler submit failed.", exception); + throw exception; + } } - catch + finally { - // do nothing + loggerService.EndMethod(); } } #endregion } + } From eddd4b6967822fc40453c85c355bff9319e3ad0d Mon Sep 17 00:00:00 2001 From: ARIYAMA Keiji Date: Fri, 24 Jun 2022 10:13:18 +0900 Subject: [PATCH 07/23] Fix build. --- .../Services/EventLogSubmissionBackgroundService.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Covid19Radar/Covid19Radar.iOS/Services/EventLogSubmissionBackgroundService.cs b/Covid19Radar/Covid19Radar.iOS/Services/EventLogSubmissionBackgroundService.cs index 96e627f95..b9b48c0ee 100644 --- a/Covid19Radar/Covid19Radar.iOS/Services/EventLogSubmissionBackgroundService.cs +++ b/Covid19Radar/Covid19Radar.iOS/Services/EventLogSubmissionBackgroundService.cs @@ -85,7 +85,7 @@ private void ScheduleBgTask() BGProcessingTaskRequest bgTaskRequest = new BGProcessingTaskRequest(BGTASK_IDENTIFIER) { RequiresNetworkConnectivity = true, - EarliestBeginDate = NSDate.FromTimeIntervalSinceNow(HALF_DAY_IN_SECONDS) + EarliestBeginDate = NSDate.FromTimeIntervalSinceNow(ONE_DAY_IN_SECONDS) }; BGTaskScheduler.Shared.Submit(bgTaskRequest, out var error); From 3e6bce7b2f321369e39a60cbe6a8ab1b214ce58c Mon Sep 17 00:00:00 2001 From: ARIYAMA Keiji Date: Fri, 24 Jun 2022 10:23:17 +0900 Subject: [PATCH 08/23] Add log. --- .../Services/EventLogSubmissionBackgroundService.cs | 9 +++++++++ .../Services/Logs/LogPeriodicDeleteService.cs | 9 +++++++++ 2 files changed, 18 insertions(+) diff --git a/Covid19Radar/Covid19Radar.iOS/Services/EventLogSubmissionBackgroundService.cs b/Covid19Radar/Covid19Radar.iOS/Services/EventLogSubmissionBackgroundService.cs index b9b48c0ee..9d9fa4978 100644 --- a/Covid19Radar/Covid19Radar.iOS/Services/EventLogSubmissionBackgroundService.cs +++ b/Covid19Radar/Covid19Radar.iOS/Services/EventLogSubmissionBackgroundService.cs @@ -71,6 +71,15 @@ await _eventLogService.SendAllAsync( }, cancellationTokenSource.Token); }); + if (result) + { + _loggerService.Debug("BGTaskScheduler.Shared.Register succeeded."); + } + else + { + _loggerService.Info("BGTaskScheduler.Shared.Register failed."); + } + ScheduleBgTask(); _loggerService.EndMethod(); diff --git a/Covid19Radar/Covid19Radar.iOS/Services/Logs/LogPeriodicDeleteService.cs b/Covid19Radar/Covid19Radar.iOS/Services/Logs/LogPeriodicDeleteService.cs index 81dc0f55b..0a694f052 100644 --- a/Covid19Radar/Covid19Radar.iOS/Services/Logs/LogPeriodicDeleteService.cs +++ b/Covid19Radar/Covid19Radar.iOS/Services/Logs/LogPeriodicDeleteService.cs @@ -84,6 +84,15 @@ public override void Schedule() }, cancellationTokenSource.Token); }); + if (result) + { + loggerService.Debug("BGTaskScheduler.Shared.Register succeeded."); + } + else + { + loggerService.Info("BGTaskScheduler.Shared.Register failed."); + } + ScheduleBgTask(); loggerService.EndMethod(); From 5258916aa6fa78a09fac88e49363c9d64a81a1ef Mon Sep 17 00:00:00 2001 From: ARIYAMA Keiji Date: Sat, 25 Jun 2022 19:26:18 +0900 Subject: [PATCH 09/23] COCOA will not use BGAppRefreshTask. --- Covid19Radar/Covid19Radar.iOS/Info.plist | 1 - 1 file changed, 1 deletion(-) diff --git a/Covid19Radar/Covid19Radar.iOS/Info.plist b/Covid19Radar/Covid19Radar.iOS/Info.plist index 751350d06..bc6f3deb3 100644 --- a/Covid19Radar/Covid19Radar.iOS/Info.plist +++ b/Covid19Radar/Covid19Radar.iOS/Info.plist @@ -68,7 +68,6 @@ LaunchScreen UIBackgroundModes - fetch processing UIUserInterfaceStyle From 961c89e299cb7ffb29d0c4ac9aec6a445f03084e Mon Sep 17 00:00:00 2001 From: ARIYAMA Keiji Date: Sun, 26 Jun 2022 13:08:21 +0900 Subject: [PATCH 10/23] Rename LogPeriodicDeleteService to DataMaintainanceBackgroundService. --- .../Covid19Radar.Android.csproj | 3 +-- .../Covid19Radar.Android/MainApplication.cs | 8 ++++---- ...cs => DataMaintainanceBackgroundService.cs} | 18 +++++++++--------- .../Migration/MigrationProcessService.cs | 4 ++-- .../Services/Migration/WorkManagerMigrator.cs | 4 ++-- Covid19Radar/Covid19Radar.iOS/AppDelegate.cs | 8 ++++---- .../Covid19Radar.iOS/Covid19Radar.iOS.csproj | 3 +-- Covid19Radar/Covid19Radar.iOS/Info.plist | 3 ++- ...cs => DataMaintainanceBackgroundService.cs} | 17 +++++++---------- ...=> AbsDataMaintainanceBackgroundService.cs} | 14 ++++++++++++-- 10 files changed, 44 insertions(+), 38 deletions(-) rename Covid19Radar/Covid19Radar.Android/Services/{Logs/LogPeriodicDeleteService.cs => DataMaintainanceBackgroundService.cs} (79%) rename Covid19Radar/Covid19Radar.iOS/Services/{Logs/LogPeriodicDeleteService.cs => DataMaintainanceBackgroundService.cs} (87%) rename Covid19Radar/Covid19Radar/Services/{Logs/AbsLogPeriodicDeleteService.cs => AbsDataMaintainanceBackgroundService.cs} (55%) diff --git a/Covid19Radar/Covid19Radar.Android/Covid19Radar.Android.csproj b/Covid19Radar/Covid19Radar.Android/Covid19Radar.Android.csproj index 2cba60edc..b3094171c 100644 --- a/Covid19Radar/Covid19Radar.Android/Covid19Radar.Android.csproj +++ b/Covid19Radar/Covid19Radar.Android/Covid19Radar.Android.csproj @@ -175,7 +175,6 @@ - @@ -192,6 +191,7 @@ + @@ -601,7 +601,6 @@ - diff --git a/Covid19Radar/Covid19Radar.Android/MainApplication.cs b/Covid19Radar/Covid19Radar.Android/MainApplication.cs index d54d1a0f5..bb7ea869c 100644 --- a/Covid19Radar/Covid19Radar.Android/MainApplication.cs +++ b/Covid19Radar/Covid19Radar.Android/MainApplication.cs @@ -54,8 +54,8 @@ private Lazy _loggerService private Lazy _exposureConfigurationRepository = new Lazy(() => ContainerLocator.Current.Resolve()); - private Lazy _logPeriodicDeleteService - = new Lazy(() => ContainerLocator.Current.Resolve()); + private Lazy _dataMaintainanceService + = new Lazy(() => ContainerLocator.Current.Resolve()); public MainApplication(IntPtr handle, JniHandleOwnership transfer) : base(handle, transfer) { @@ -110,7 +110,7 @@ private void ScheduleBackgroundTasks() try { - _logPeriodicDeleteService.Value.Schedule(); + _dataMaintainanceService.Value.Schedule(); } catch (Exception exception) { @@ -131,7 +131,7 @@ 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); container.Register(Reuse.Singleton); diff --git a/Covid19Radar/Covid19Radar.Android/Services/Logs/LogPeriodicDeleteService.cs b/Covid19Radar/Covid19Radar.Android/Services/DataMaintainanceBackgroundService.cs similarity index 79% rename from Covid19Radar/Covid19Radar.Android/Services/Logs/LogPeriodicDeleteService.cs rename to Covid19Radar/Covid19Radar.Android/Services/DataMaintainanceBackgroundService.cs index 82fd60172..c9e1c7a10 100644 --- a/Covid19Radar/Covid19Radar.Android/Services/Logs/LogPeriodicDeleteService.cs +++ b/Covid19Radar/Covid19Radar.Android/Services/DataMaintainanceBackgroundService.cs @@ -15,16 +15,17 @@ namespace Covid19Radar.Droid.Services.Logs { - public class LogPeriodicDeleteService : AbsLogPeriodicDeleteService + public class DataMaintainanceBackgroundService : AbsDataMaintainanceBackgroundService { - private const string CURRENT_WORK_NAME = "log_periodic_delete_worker_20220622"; + private const string CURRENT_WORK_NAME = "data_maintainance_worker_20220626"; private static readonly long INTERVAL_IN_HOURS = 24; private static readonly long BACKOFF_DELAY_IN_MINUTES = 60; - public LogPeriodicDeleteService( + public DataMaintainanceBackgroundService( + ILogFileService logFileService, ILoggerService loggerService - ) : base(loggerService) + ) : base(logFileService, loggerService) { } @@ -61,8 +62,9 @@ private static PeriodicWorkRequest CreatePeriodicWorkRequest() [Preserve] public class BackgroundWorker : Worker { + private Lazy _dataMaintainanceBackgroundService + => new Lazy(() => ContainerLocator.Current.Resolve()); private Lazy _loggerService => new Lazy(() => ContainerLocator.Current.Resolve()); - private Lazy _logFileService => new Lazy(() => ContainerLocator.Current.Resolve()); public BackgroundWorker(Context context, WorkerParameters workerParameters) : base(context, workerParameters) @@ -71,16 +73,14 @@ public BackgroundWorker(Context context, WorkerParameters workerParameters) public override Result DoWork() { + var dataMaintainanceBackgroundService = _dataMaintainanceBackgroundService.Value; var loggerService = _loggerService.Value; - var logFileService = _logFileService.Value; loggerService.StartMethod(); try { - logFileService.Rotate(); - loggerService.Info("Success: Periodic deletion of old logs."); - + dataMaintainanceBackgroundService.ExecuteAsync().GetAwaiter().GetResult(); return Result.InvokeSuccess(); } catch (IOException exception) diff --git a/Covid19Radar/Covid19Radar.Android/Services/Migration/MigrationProcessService.cs b/Covid19Radar/Covid19Radar.Android/Services/Migration/MigrationProcessService.cs index 094239d0c..1093dc7ac 100644 --- a/Covid19Radar/Covid19Radar.Android/Services/Migration/MigrationProcessService.cs +++ b/Covid19Radar/Covid19Radar.Android/Services/Migration/MigrationProcessService.cs @@ -69,12 +69,12 @@ public override Result DoWork() public class MigrationProccessService : IMigrationProcessService { private readonly AbsExposureDetectionBackgroundService _exposureDetectionBackgroundService; - private readonly AbsLogPeriodicDeleteService _logPeriodicDeleteService; + private readonly AbsDataMaintainanceBackgroundService _logPeriodicDeleteService; private readonly ILoggerService _loggerService; public MigrationProccessService( AbsExposureDetectionBackgroundService exposureDetectionBackgroundService, - AbsLogPeriodicDeleteService logPeriodicDeleteService, + AbsDataMaintainanceBackgroundService logPeriodicDeleteService, ILoggerService loggerService ) { diff --git a/Covid19Radar/Covid19Radar.Android/Services/Migration/WorkManagerMigrator.cs b/Covid19Radar/Covid19Radar.Android/Services/Migration/WorkManagerMigrator.cs index 4f91eaafb..1a021cab1 100644 --- a/Covid19Radar/Covid19Radar.Android/Services/Migration/WorkManagerMigrator.cs +++ b/Covid19Radar/Covid19Radar.Android/Services/Migration/WorkManagerMigrator.cs @@ -19,13 +19,13 @@ internal class WorkManagerMigrator }; private readonly AbsExposureDetectionBackgroundService _exposureDetectionBackgroundService; - private readonly AbsLogPeriodicDeleteService _logPeriodicDeleteService; + private readonly AbsDataMaintainanceBackgroundService _logPeriodicDeleteService; private readonly ILoggerService _loggerService; public WorkManagerMigrator( AbsExposureDetectionBackgroundService exposureDetectionBackgroundService, - AbsLogPeriodicDeleteService logPeriodicDeleteService, + AbsDataMaintainanceBackgroundService logPeriodicDeleteService, ILoggerService loggerService ) { diff --git a/Covid19Radar/Covid19Radar.iOS/AppDelegate.cs b/Covid19Radar/Covid19Radar.iOS/AppDelegate.cs index 414e973b6..4a67d2829 100644 --- a/Covid19Radar/Covid19Radar.iOS/AppDelegate.cs +++ b/Covid19Radar/Covid19Radar.iOS/AppDelegate.cs @@ -53,8 +53,8 @@ private Lazy _loggerService private Lazy _exposureConfigurationRepository = new Lazy(() => ContainerLocator.Current.Resolve()); - private Lazy _logPeriodicDeleteService - = new Lazy(() => ContainerLocator.Current.Resolve()); + private Lazy _dataMaintainanceService + = new Lazy(() => ContainerLocator.Current.Resolve()); private App? AppInstance { @@ -142,7 +142,7 @@ private void ScheduleBackgroundTask() try { - _logPeriodicDeleteService.Value.Schedule(); + _dataMaintainanceService.Value.Schedule(); } catch (Exception exception) { @@ -269,7 +269,7 @@ 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); container.Register(Reuse.Singleton); diff --git a/Covid19Radar/Covid19Radar.iOS/Covid19Radar.iOS.csproj b/Covid19Radar/Covid19Radar.iOS/Covid19Radar.iOS.csproj index 013036399..6cecd9df3 100644 --- a/Covid19Radar/Covid19Radar.iOS/Covid19Radar.iOS.csproj +++ b/Covid19Radar/Covid19Radar.iOS/Covid19Radar.iOS.csproj @@ -256,7 +256,6 @@ - @@ -271,6 +270,7 @@ + @@ -548,7 +548,6 @@ - diff --git a/Covid19Radar/Covid19Radar.iOS/Info.plist b/Covid19Radar/Covid19Radar.iOS/Info.plist index bc6f3deb3..9cc46a539 100644 --- a/Covid19Radar/Covid19Radar.iOS/Info.plist +++ b/Covid19Radar/Covid19Radar.iOS/Info.plist @@ -54,8 +54,8 @@ BGTaskSchedulerPermittedIdentifiers APP_PACKAGE_NAME.exposure-notification - APP_PACKAGE_NAME.delete-old-logs APP_PACKAGE_NAME.eventlog-submission + APP_PACKAGE_NAME.data-maintainance UIAppFonts @@ -68,6 +68,7 @@ LaunchScreen UIBackgroundModes + fetch processing UIUserInterfaceStyle diff --git a/Covid19Radar/Covid19Radar.iOS/Services/Logs/LogPeriodicDeleteService.cs b/Covid19Radar/Covid19Radar.iOS/Services/DataMaintainanceBackgroundService.cs similarity index 87% rename from Covid19Radar/Covid19Radar.iOS/Services/Logs/LogPeriodicDeleteService.cs rename to Covid19Radar/Covid19Radar.iOS/Services/DataMaintainanceBackgroundService.cs index 0a694f052..768f38350 100644 --- a/Covid19Radar/Covid19Radar.iOS/Services/Logs/LogPeriodicDeleteService.cs +++ b/Covid19Radar/Covid19Radar.iOS/Services/DataMaintainanceBackgroundService.cs @@ -13,7 +13,7 @@ namespace Covid19Radar.iOS.Services.Logs { - public class LogPeriodicDeleteService : AbsLogPeriodicDeleteService + public class DataMaintainanceBackgroundService : AbsDataMaintainanceBackgroundService { #region Constants @@ -23,24 +23,21 @@ public class LogPeriodicDeleteService : AbsLogPeriodicDeleteService #region Static Fields - private static readonly string BGTASK_IDENTIFIER = AppInfo.PackageName + ".delete-old-logs"; + private static readonly string BGTASK_IDENTIFIER = AppInfo.PackageName + ".data-maintainance"; #endregion #region Instance Fields - private readonly ILogFileService _logFileService; - #endregion #region Constructors - public LogPeriodicDeleteService( + public DataMaintainanceBackgroundService( ILoggerService loggerService, ILogFileService logFileService - ) : base(loggerService) + ) : base(logFileService, loggerService) { - _logFileService = logFileService; } #endregion @@ -60,11 +57,11 @@ public override void Schedule() var cancellationTokenSource = new CancellationTokenSource(); task.ExpirationHandler = cancellationTokenSource.Cancel; - _ = Task.Run(() => + _ = Task.Run(async () => { try { - _logFileService.Rotate(); + await ExecuteAsync(); task.SetTaskCompleted(true); } catch (OperationCanceledException exception) @@ -108,7 +105,7 @@ private void ScheduleBgTask() try { - BGProcessingTaskRequest bgTaskRequest = new BGProcessingTaskRequest(BGTASK_IDENTIFIER) + BGAppRefreshTaskRequest bgTaskRequest = new BGAppRefreshTaskRequest(BGTASK_IDENTIFIER) { EarliestBeginDate = NSDate.FromTimeIntervalSinceNow(ONE_DAY_IN_SECONDS) }; diff --git a/Covid19Radar/Covid19Radar/Services/Logs/AbsLogPeriodicDeleteService.cs b/Covid19Radar/Covid19Radar/Services/AbsDataMaintainanceBackgroundService.cs similarity index 55% rename from Covid19Radar/Covid19Radar/Services/Logs/AbsLogPeriodicDeleteService.cs rename to Covid19Radar/Covid19Radar/Services/AbsDataMaintainanceBackgroundService.cs index 72cf729b5..632bf6f64 100644 --- a/Covid19Radar/Covid19Radar/Services/Logs/AbsLogPeriodicDeleteService.cs +++ b/Covid19Radar/Covid19Radar/Services/AbsDataMaintainanceBackgroundService.cs @@ -1,21 +1,31 @@ // 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.Threading.Tasks; using Covid19Radar.Services.Logs; namespace Covid19Radar.Services { - public abstract class AbsLogPeriodicDeleteService : IBackgroundService + public abstract class AbsDataMaintainanceBackgroundService : IBackgroundService { protected readonly ILoggerService loggerService; - public AbsLogPeriodicDeleteService( + private readonly ILogFileService _logFileService; + + public AbsDataMaintainanceBackgroundService( + ILogFileService logFileService, ILoggerService loggerService ) { + _logFileService = logFileService; this.loggerService = loggerService; } public abstract void Schedule(); + + public async Task ExecuteAsync() + { + _logFileService.Rotate(); + } } } From 621cece106540d3b46f0f2acc2018203f29a7941 Mon Sep 17 00:00:00 2001 From: ARIYAMA Keiji Date: Sun, 26 Jun 2022 13:13:03 +0900 Subject: [PATCH 11/23] Update log. --- Covid19Radar/Covid19Radar.Android/MainApplication.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Covid19Radar/Covid19Radar.Android/MainApplication.cs b/Covid19Radar/Covid19Radar.Android/MainApplication.cs index bb7ea869c..ddbbd0e7b 100644 --- a/Covid19Radar/Covid19Radar.Android/MainApplication.cs +++ b/Covid19Radar/Covid19Radar.Android/MainApplication.cs @@ -114,7 +114,7 @@ private void ScheduleBackgroundTasks() } catch (Exception exception) { - _loggerService.Value.Exception("Failed to schedule LogPeriodicDeleteService", exception); + _loggerService.Value.Exception("Failed to schedule DataMaintainanceBackgroundService", exception); } } From 12a886c11b8ac4c0d7dfa4b11d668a80600da402 Mon Sep 17 00:00:00 2001 From: ARIYAMA Keiji Date: Sun, 26 Jun 2022 13:16:13 +0900 Subject: [PATCH 12/23] Rename argument/variable. --- .../Services/Migration/MigrationProcessService.cs | 8 ++++---- .../Services/Migration/WorkManagerMigrator.cs | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/Covid19Radar/Covid19Radar.Android/Services/Migration/MigrationProcessService.cs b/Covid19Radar/Covid19Radar.Android/Services/Migration/MigrationProcessService.cs index 1093dc7ac..7751a5dba 100644 --- a/Covid19Radar/Covid19Radar.Android/Services/Migration/MigrationProcessService.cs +++ b/Covid19Radar/Covid19Radar.Android/Services/Migration/MigrationProcessService.cs @@ -69,17 +69,17 @@ public override Result DoWork() public class MigrationProccessService : IMigrationProcessService { private readonly AbsExposureDetectionBackgroundService _exposureDetectionBackgroundService; - private readonly AbsDataMaintainanceBackgroundService _logPeriodicDeleteService; + private readonly AbsDataMaintainanceBackgroundService _dataMaintainanceBackgroundService; private readonly ILoggerService _loggerService; public MigrationProccessService( AbsExposureDetectionBackgroundService exposureDetectionBackgroundService, - AbsDataMaintainanceBackgroundService logPeriodicDeleteService, + AbsDataMaintainanceBackgroundService dataMaintainanceBackgroundService, ILoggerService loggerService ) { _exposureDetectionBackgroundService = exposureDetectionBackgroundService; - _logPeriodicDeleteService = logPeriodicDeleteService; + _dataMaintainanceBackgroundService = dataMaintainanceBackgroundService; _loggerService = loggerService; } @@ -89,7 +89,7 @@ public async Task SetupAsync() await new WorkManagerMigrator( _exposureDetectionBackgroundService, - _logPeriodicDeleteService, + _dataMaintainanceBackgroundService, _loggerService ).ExecuteAsync(); diff --git a/Covid19Radar/Covid19Radar.Android/Services/Migration/WorkManagerMigrator.cs b/Covid19Radar/Covid19Radar.Android/Services/Migration/WorkManagerMigrator.cs index 1a021cab1..5fc117812 100644 --- a/Covid19Radar/Covid19Radar.Android/Services/Migration/WorkManagerMigrator.cs +++ b/Covid19Radar/Covid19Radar.Android/Services/Migration/WorkManagerMigrator.cs @@ -19,18 +19,18 @@ internal class WorkManagerMigrator }; private readonly AbsExposureDetectionBackgroundService _exposureDetectionBackgroundService; - private readonly AbsDataMaintainanceBackgroundService _logPeriodicDeleteService; + private readonly AbsDataMaintainanceBackgroundService _dataMaintainanceBackgroundService; private readonly ILoggerService _loggerService; public WorkManagerMigrator( AbsExposureDetectionBackgroundService exposureDetectionBackgroundService, - AbsDataMaintainanceBackgroundService logPeriodicDeleteService, + AbsDataMaintainanceBackgroundService dataMaintainanceBackgroundService, ILoggerService loggerService ) { _exposureDetectionBackgroundService = exposureDetectionBackgroundService; - _logPeriodicDeleteService = logPeriodicDeleteService; + _dataMaintainanceBackgroundService = dataMaintainanceBackgroundService; _loggerService = loggerService; } @@ -42,7 +42,7 @@ internal Task ExecuteAsync() CancelOldWorks(workManager, OldWorkNames, _loggerService); _exposureDetectionBackgroundService.Schedule(); - _logPeriodicDeleteService.Schedule(); + _dataMaintainanceBackgroundService.Schedule(); _loggerService.EndMethod(); From 1d546a372a28053ad521ac8d962b059f9247ba9e Mon Sep 17 00:00:00 2001 From: ARIYAMA Keiji Date: Sun, 26 Jun 2022 13:18:08 +0900 Subject: [PATCH 13/23] Update log. --- Covid19Radar/Covid19Radar.iOS/AppDelegate.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Covid19Radar/Covid19Radar.iOS/AppDelegate.cs b/Covid19Radar/Covid19Radar.iOS/AppDelegate.cs index 4a67d2829..b65dea0b0 100644 --- a/Covid19Radar/Covid19Radar.iOS/AppDelegate.cs +++ b/Covid19Radar/Covid19Radar.iOS/AppDelegate.cs @@ -146,7 +146,7 @@ private void ScheduleBackgroundTask() } catch (Exception exception) { - _loggerService.Value.Exception("Failed to schedule LogPeriodicDeleteService", exception); + _loggerService.Value.Exception("Failed to schedule DataMaintainanceService", exception); } } From 79961b6a6eb4d43c22c0620def40fad085e9ba89 Mon Sep 17 00:00:00 2001 From: ARIYAMA Keiji Date: Sun, 26 Jun 2022 13:28:11 +0900 Subject: [PATCH 14/23] Add logs. --- .../Services/AbsDataMaintainanceBackgroundService.cs | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/Covid19Radar/Covid19Radar/Services/AbsDataMaintainanceBackgroundService.cs b/Covid19Radar/Covid19Radar/Services/AbsDataMaintainanceBackgroundService.cs index 632bf6f64..2198801a4 100644 --- a/Covid19Radar/Covid19Radar/Services/AbsDataMaintainanceBackgroundService.cs +++ b/Covid19Radar/Covid19Radar/Services/AbsDataMaintainanceBackgroundService.cs @@ -25,7 +25,16 @@ ILoggerService loggerService public async Task ExecuteAsync() { - _logFileService.Rotate(); + loggerService.StartMethod(); + + try + { + _logFileService.Rotate(); + } + finally + { + loggerService.EndMethod(); + } } } } From e8c762216e1cdd2cbcbbfb0a4ef0d6736a482e4b Mon Sep 17 00:00:00 2001 From: ARIYAMA Keiji Date: Tue, 28 Jun 2022 11:04:54 +0900 Subject: [PATCH 15/23] Refactoring. --- Covid19Radar/Covid19Radar.iOS/AppDelegate.cs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Covid19Radar/Covid19Radar.iOS/AppDelegate.cs b/Covid19Radar/Covid19Radar.iOS/AppDelegate.cs index b65dea0b0..87f3fdc79 100644 --- a/Covid19Radar/Covid19Radar.iOS/AppDelegate.cs +++ b/Covid19Radar/Covid19Radar.iOS/AppDelegate.cs @@ -53,7 +53,7 @@ private Lazy _loggerService private Lazy _exposureConfigurationRepository = new Lazy(() => ContainerLocator.Current.Resolve()); - private Lazy _dataMaintainanceService + private Lazy _dataMaintainanceBackgroundService = new Lazy(() => ContainerLocator.Current.Resolve()); private App? AppInstance @@ -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 { @@ -142,11 +142,11 @@ private void ScheduleBackgroundTask() try { - _dataMaintainanceService.Value.Schedule(); + _dataMaintainanceBackgroundService.Value.Schedule(); } catch (Exception exception) { - _loggerService.Value.Exception("Failed to schedule DataMaintainanceService", exception); + _loggerService.Value.Exception("Failed to schedule DataMaintainanceBackgroundService", exception); } } From 6a2d85f47c44eb3fab2b8d41d3ced960efbc960d Mon Sep 17 00:00:00 2001 From: ARIYAMA Keiji Date: Tue, 28 Jun 2022 11:05:44 +0900 Subject: [PATCH 16/23] Change ExistingPeriodicWorkPolicy to Keep. --- .../Services/DataMaintainanceBackgroundService.cs | 4 ++-- .../Services/EventLogSubmissionBackgroundService.cs | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Covid19Radar/Covid19Radar.Android/Services/DataMaintainanceBackgroundService.cs b/Covid19Radar/Covid19Radar.Android/Services/DataMaintainanceBackgroundService.cs index c9e1c7a10..4c33a3d47 100644 --- a/Covid19Radar/Covid19Radar.Android/Services/DataMaintainanceBackgroundService.cs +++ b/Covid19Radar/Covid19Radar.Android/Services/DataMaintainanceBackgroundService.cs @@ -17,7 +17,7 @@ namespace Covid19Radar.Droid.Services.Logs { public class DataMaintainanceBackgroundService : AbsDataMaintainanceBackgroundService { - private const string CURRENT_WORK_NAME = "data_maintainance_worker_20220626"; + private const string CURRENT_WORK_NAME = "data_maintainance_worker_20220628"; private static readonly long INTERVAL_IN_HOURS = 24; private static readonly long BACKOFF_DELAY_IN_MINUTES = 60; @@ -38,7 +38,7 @@ public override void Schedule() PeriodicWorkRequest periodicWorkRequest = CreatePeriodicWorkRequest(); workManager.EnqueueUniquePeriodicWork( CURRENT_WORK_NAME, - ExistingPeriodicWorkPolicy.Replace, + ExistingPeriodicWorkPolicy.Keep, periodicWorkRequest ); diff --git a/Covid19Radar/Covid19Radar.Android/Services/EventLogSubmissionBackgroundService.cs b/Covid19Radar/Covid19Radar.Android/Services/EventLogSubmissionBackgroundService.cs index 11daf9f39..50b49bf37 100644 --- a/Covid19Radar/Covid19Radar.Android/Services/EventLogSubmissionBackgroundService.cs +++ b/Covid19Radar/Covid19Radar.Android/Services/EventLogSubmissionBackgroundService.cs @@ -17,7 +17,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; @@ -40,7 +40,7 @@ public override void Schedule() PeriodicWorkRequest periodicWorkRequest = CreatePeriodicWorkRequest(); workManager.EnqueueUniquePeriodicWork( CURRENT_WORK_NAME, - ExistingPeriodicWorkPolicy.Replace, + ExistingPeriodicWorkPolicy.Keep, periodicWorkRequest ); From 143c9a64afd6941304b81134f23876674998707e Mon Sep 17 00:00:00 2001 From: ARIYAMA Keiji Date: Tue, 28 Jun 2022 11:06:11 +0900 Subject: [PATCH 17/23] Change BGAppRefreshTaskRequest to BGProcessingTaskRequest. Adjust EarliestBeginDate from 24 hours later to 00:00 in UTC. --- Covid19Radar/Covid19Radar.iOS/Info.plist | 1 - .../DataMaintainanceBackgroundService.cs | 16 ++++++++++++---- .../EventLogSubmissionBackgroundService.cs | 14 ++++++++++---- 3 files changed, 22 insertions(+), 9 deletions(-) diff --git a/Covid19Radar/Covid19Radar.iOS/Info.plist b/Covid19Radar/Covid19Radar.iOS/Info.plist index 9cc46a539..a88e10d47 100644 --- a/Covid19Radar/Covid19Radar.iOS/Info.plist +++ b/Covid19Radar/Covid19Radar.iOS/Info.plist @@ -68,7 +68,6 @@ LaunchScreen UIBackgroundModes - fetch processing UIUserInterfaceStyle diff --git a/Covid19Radar/Covid19Radar.iOS/Services/DataMaintainanceBackgroundService.cs b/Covid19Radar/Covid19Radar.iOS/Services/DataMaintainanceBackgroundService.cs index 768f38350..2f59ca24a 100644 --- a/Covid19Radar/Covid19Radar.iOS/Services/DataMaintainanceBackgroundService.cs +++ b/Covid19Radar/Covid19Radar.iOS/Services/DataMaintainanceBackgroundService.cs @@ -6,6 +6,7 @@ using System.Threading; using System.Threading.Tasks; using BackgroundTasks; +using Covid19Radar.Common; using Covid19Radar.Services; using Covid19Radar.Services.Logs; using Foundation; @@ -17,7 +18,7 @@ public class DataMaintainanceBackgroundService : AbsDataMaintainanceBackgroundSe { #region Constants - private const double ONE_DAY_IN_SECONDS = 1 * 24 * 60 * 60; + private const int TASK_INTERVAL_IN_DAYS = 1; #endregion @@ -29,15 +30,19 @@ public class DataMaintainanceBackgroundService : AbsDataMaintainanceBackgroundSe #region Instance Fields + private readonly IDateTimeUtility _dateTimeUtility; + #endregion #region Constructors public DataMaintainanceBackgroundService( ILoggerService loggerService, - ILogFileService logFileService + ILogFileService logFileService, + IDateTimeUtility dateTimeUtility ) : base(logFileService, loggerService) { + _dateTimeUtility = dateTimeUtility; } #endregion @@ -105,9 +110,12 @@ private void ScheduleBgTask() try { - BGAppRefreshTaskRequest bgTaskRequest = new BGAppRefreshTaskRequest(BGTASK_IDENTIFIER) + DateTime tommorow = _dateTimeUtility.UtcNow.Date.AddDays(TASK_INTERVAL_IN_DAYS); + var interval = tommorow - _dateTimeUtility.UtcNow; + + BGProcessingTaskRequest bgTaskRequest = new BGProcessingTaskRequest(BGTASK_IDENTIFIER) { - EarliestBeginDate = NSDate.FromTimeIntervalSinceNow(ONE_DAY_IN_SECONDS) + EarliestBeginDate = NSDate.FromTimeIntervalSinceNow(interval.TotalSeconds) }; BGTaskScheduler.Shared.Submit(bgTaskRequest, out var error); diff --git a/Covid19Radar/Covid19Radar.iOS/Services/EventLogSubmissionBackgroundService.cs b/Covid19Radar/Covid19Radar.iOS/Services/EventLogSubmissionBackgroundService.cs index 9d9fa4978..569ca3709 100644 --- a/Covid19Radar/Covid19Radar.iOS/Services/EventLogSubmissionBackgroundService.cs +++ b/Covid19Radar/Covid19Radar.iOS/Services/EventLogSubmissionBackgroundService.cs @@ -16,20 +16,23 @@ namespace Covid19Radar.iOS.Services { public class EventLogSubmissionBackgroundService : AbsEventLogSubmissionBackgroundService { - private static readonly string BGTASK_IDENTIFIER = AppInfo.PackageName + ".eventlog-submission"; + private const int TASK_INTERVAL_IN_DAYS = 1; - private const double ONE_DAY_IN_SECONDS = 1 * 24 * 60 * 60; + private static readonly string BGTASK_IDENTIFIER = AppInfo.PackageName + ".eventlog-submission"; private readonly IEventLogService _eventLogService; private readonly ILoggerService _loggerService; + private readonly IDateTimeUtility _dateTimeUtility; public EventLogSubmissionBackgroundService( IEventLogService eventLogService, - ILoggerService loggerService + ILoggerService loggerService, + IDateTimeUtility dateTimeUtility ) : base() { _eventLogService = eventLogService; _loggerService = loggerService; + _dateTimeUtility = dateTimeUtility; } public override void Schedule() @@ -91,10 +94,13 @@ private void ScheduleBgTask() try { + DateTime tommorow = _dateTimeUtility.UtcNow.Date.AddDays(TASK_INTERVAL_IN_DAYS); + var interval = tommorow - _dateTimeUtility.UtcNow; + BGProcessingTaskRequest bgTaskRequest = new BGProcessingTaskRequest(BGTASK_IDENTIFIER) { RequiresNetworkConnectivity = true, - EarliestBeginDate = NSDate.FromTimeIntervalSinceNow(ONE_DAY_IN_SECONDS) + EarliestBeginDate = NSDate.FromTimeIntervalSinceNow(interval.TotalSeconds) }; BGTaskScheduler.Shared.Submit(bgTaskRequest, out var error); From 2ac3d64945e89ee5c69f12a487f39318a856d32a Mon Sep 17 00:00:00 2001 From: ARIYAMA Keiji Date: Tue, 28 Jun 2022 12:26:42 +0900 Subject: [PATCH 18/23] Add handling AbsEventLogSubmissionBackgroundService to WorkManagerMigrator. --- .../Services/Migration/WorkManagerMigrator.cs | 4 ++++ 1 file changed, 4 insertions(+) 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(); From cb7607cf1def6234464222335accb4270de9a7fe Mon Sep 17 00:00:00 2001 From: ARIYAMA Keiji Date: Tue, 28 Jun 2022 12:32:59 +0900 Subject: [PATCH 19/23] Fix build. --- .../Services/Migration/MigrationProcessService.cs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Covid19Radar/Covid19Radar.Android/Services/Migration/MigrationProcessService.cs b/Covid19Radar/Covid19Radar.Android/Services/Migration/MigrationProcessService.cs index 7751a5dba..e771af87b 100644 --- a/Covid19Radar/Covid19Radar.Android/Services/Migration/MigrationProcessService.cs +++ b/Covid19Radar/Covid19Radar.Android/Services/Migration/MigrationProcessService.cs @@ -70,16 +70,19 @@ 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; } @@ -90,6 +93,7 @@ public async Task SetupAsync() await new WorkManagerMigrator( _exposureDetectionBackgroundService, _dataMaintainanceBackgroundService, + _eventLogSubmissionBackgroundService, _loggerService ).ExecuteAsync(); From b4734b4bbc91bb7ff7b4039ba7625d781c6f0ec8 Mon Sep 17 00:00:00 2001 From: ARIYAMA Keiji Date: Tue, 28 Jun 2022 16:26:51 +0900 Subject: [PATCH 20/23] Move Rotate execution from App to SplashPageViewModel. --- Covid19Radar/Covid19Radar/App.xaml.cs | 11 ----------- .../ViewModels/HomePage/SplashPageViewModel.cs | 10 +++++++++- 2 files changed, 9 insertions(+), 12 deletions(-) diff --git a/Covid19Radar/Covid19Radar/App.xaml.cs b/Covid19Radar/Covid19Radar/App.xaml.cs index 1464fc2d4..0296db4f3 100644 --- a/Covid19Radar/Covid19Radar/App.xaml.cs +++ b/Covid19Radar/Covid19Radar/App.xaml.cs @@ -229,17 +229,6 @@ private static void RegisterCommonTypes(IContainer container) container.Register(Reuse.Singleton); } - protected override void OnStart() - { - LogFileService.Rotate(); - } - - protected override void OnResume() - { - base.OnResume(); - LogFileService.Rotate(); - } - protected override void OnSleep() { base.OnSleep(); diff --git a/Covid19Radar/Covid19Radar/ViewModels/HomePage/SplashPageViewModel.cs b/Covid19Radar/Covid19Radar/ViewModels/HomePage/SplashPageViewModel.cs index cbc5ea5c6..8d9d77f72 100644 --- a/Covid19Radar/Covid19Radar/ViewModels/HomePage/SplashPageViewModel.cs +++ b/Covid19Radar/Covid19Radar/ViewModels/HomePage/SplashPageViewModel.cs @@ -2,6 +2,7 @@ * 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.Threading.Tasks; using Covid19Radar.Model; using Covid19Radar.Repository; using Covid19Radar.Services; @@ -19,6 +20,7 @@ public class SplashPageViewModel : ViewModelBase private readonly IUserDataService _userDataService; private readonly IMigrationService _migrationService; private readonly IUserDataRepository _userDataRepository; + private readonly ILogFileService _logFileService; public SplashPageViewModel( INavigationService navigationService, @@ -26,7 +28,8 @@ public SplashPageViewModel( ILoggerService loggerService, IUserDataRepository userDataRepository, IUserDataService userDataService, - IMigrationService migrationService + IMigrationService migrationService, + ILogFileService logFileService ) : base(navigationService) { _termsUpdateService = termsUpdateService; @@ -34,6 +37,7 @@ IMigrationService migrationService _userDataRepository = userDataRepository; _userDataService = userDataService; _migrationService = migrationService; + _logFileService = logFileService; } public override async void OnNavigatedTo(INavigationParameters parameters) @@ -44,6 +48,10 @@ public override async void OnNavigatedTo(INavigationParameters parameters) await _migrationService.MigrateAsync(); + await Task.Run(() => { + _logFileService.Rotate(); + }); + var destination = Destination.HomePage; if (parameters.ContainsKey(SplashPage.DestinationKey)) { From 28a3cfc8d520df5c179b65258a83eee6934a9365 Mon Sep 17 00:00:00 2001 From: ARIYAMA Keiji Date: Tue, 28 Jun 2022 16:28:28 +0900 Subject: [PATCH 21/23] Adjust .SetPeriodStartTime from 24 hours later to 00:00 in UTC. --- .../DataMaintainanceBackgroundService.cs | 19 ++++++++++++------- .../EventLogSubmissionBackgroundService.cs | 9 ++++++++- 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/Covid19Radar/Covid19Radar.Android/Services/DataMaintainanceBackgroundService.cs b/Covid19Radar/Covid19Radar.Android/Services/DataMaintainanceBackgroundService.cs index 4c33a3d47..9a6790e65 100644 --- a/Covid19Radar/Covid19Radar.Android/Services/DataMaintainanceBackgroundService.cs +++ b/Covid19Radar/Covid19Radar.Android/Services/DataMaintainanceBackgroundService.cs @@ -7,6 +7,7 @@ using Android.Content; using Android.Runtime; using AndroidX.Work; +using Covid19Radar.Common; using Covid19Radar.Services; using Covid19Radar.Services.Logs; using Java.Util.Concurrent; @@ -22,11 +23,15 @@ public class DataMaintainanceBackgroundService : AbsDataMaintainanceBackgroundSe private static readonly long INTERVAL_IN_HOURS = 24; private static readonly long BACKOFF_DELAY_IN_MINUTES = 60; + private readonly IDateTimeUtility _dateTimeUtility; + public DataMaintainanceBackgroundService( ILogFileService logFileService, - ILoggerService loggerService + ILoggerService loggerService, + IDateTimeUtility dateTimeUtility ) : base(logFileService, loggerService) { + _dateTimeUtility = dateTimeUtility; } public override void Schedule() @@ -45,12 +50,16 @@ public override void Schedule() loggerService.EndMethod(); } - private static PeriodicWorkRequest CreatePeriodicWorkRequest() + private PeriodicWorkRequest CreatePeriodicWorkRequest() { + DateTime tommorow = _dateTimeUtility.UtcNow.Date.AddDays(1); + var interval = tommorow - _dateTimeUtility.UtcNow; + var workRequestBuilder = new PeriodicWorkRequest.Builder( typeof(BackgroundWorker), INTERVAL_IN_HOURS, TimeUnit.Hours ) + .SetPeriodStartTime((long)interval.TotalSeconds, TimeUnit.Seconds) .SetConstraints(new Constraints.Builder() .SetRequiresBatteryNotLow(true) .Build()) @@ -69,6 +78,7 @@ private Lazy _dataMaintainanceBackgroundSe public BackgroundWorker(Context context, WorkerParameters workerParameters) : base(context, workerParameters) { + // do nothing } public override Result DoWork() @@ -83,11 +93,6 @@ public override Result DoWork() dataMaintainanceBackgroundService.ExecuteAsync().GetAwaiter().GetResult(); return Result.InvokeSuccess(); } - catch (IOException exception) - { - loggerService.Exception("IOException", exception); - return Result.InvokeRetry(); - } catch (Exception exception) { loggerService.Exception("Exception", exception); diff --git a/Covid19Radar/Covid19Radar.Android/Services/EventLogSubmissionBackgroundService.cs b/Covid19Radar/Covid19Radar.Android/Services/EventLogSubmissionBackgroundService.cs index 50b49bf37..94eed41f3 100644 --- a/Covid19Radar/Covid19Radar.Android/Services/EventLogSubmissionBackgroundService.cs +++ b/Covid19Radar/Covid19Radar.Android/Services/EventLogSubmissionBackgroundService.cs @@ -22,12 +22,15 @@ public class EventLogSubmissionBackgroundService : AbsEventLogSubmissionBackgrou private const long INTERVAL_IN_HOURS = 24; private const long BACKOFF_DELAY_IN_MINUTES = 60; + private readonly IDateTimeUtility _dateTimeUtility; private readonly ILoggerService _loggerService; public EventLogSubmissionBackgroundService( + IDateTimeUtility dateTimeUtility, ILoggerService loggerService ) : base() { + _dateTimeUtility = dateTimeUtility; _loggerService = loggerService; } @@ -47,12 +50,16 @@ public override void Schedule() _loggerService.EndMethod(); } - private static PeriodicWorkRequest CreatePeriodicWorkRequest() + private PeriodicWorkRequest CreatePeriodicWorkRequest() { + DateTime tommorow = _dateTimeUtility.UtcNow.Date.AddDays(1); + var interval = tommorow - _dateTimeUtility.UtcNow; + var workRequestBuilder = new PeriodicWorkRequest.Builder( typeof(BackgroundWorker), INTERVAL_IN_HOURS, TimeUnit.Hours ) + .SetPeriodStartTime((long)interval.TotalSeconds, TimeUnit.Seconds) .SetConstraints(new Constraints.Builder() .SetRequiresBatteryNotLow(true) .SetRequiredNetworkType(NetworkType.Connected) From 034b4992ca56178bbbebabd24f3fab613f5a2d8f Mon Sep 17 00:00:00 2001 From: ARIYAMA Keiji Date: Wed, 29 Jun 2022 10:27:08 +0900 Subject: [PATCH 22/23] Avoid using SetPeriodStartTime. --- .../Services/DataMaintainanceBackgroundService.cs | 13 ++----------- .../Services/EventLogSubmissionBackgroundService.cs | 7 ------- 2 files changed, 2 insertions(+), 18 deletions(-) diff --git a/Covid19Radar/Covid19Radar.Android/Services/DataMaintainanceBackgroundService.cs b/Covid19Radar/Covid19Radar.Android/Services/DataMaintainanceBackgroundService.cs index 9a6790e65..9be4e2586 100644 --- a/Covid19Radar/Covid19Radar.Android/Services/DataMaintainanceBackgroundService.cs +++ b/Covid19Radar/Covid19Radar.Android/Services/DataMaintainanceBackgroundService.cs @@ -3,11 +3,9 @@ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ using System; -using System.IO; using Android.Content; using Android.Runtime; using AndroidX.Work; -using Covid19Radar.Common; using Covid19Radar.Services; using Covid19Radar.Services.Logs; using Java.Util.Concurrent; @@ -23,15 +21,12 @@ public class DataMaintainanceBackgroundService : AbsDataMaintainanceBackgroundSe private static readonly long INTERVAL_IN_HOURS = 24; private static readonly long BACKOFF_DELAY_IN_MINUTES = 60; - private readonly IDateTimeUtility _dateTimeUtility; - public DataMaintainanceBackgroundService( ILogFileService logFileService, - ILoggerService loggerService, - IDateTimeUtility dateTimeUtility + ILoggerService loggerService ) : base(logFileService, loggerService) { - _dateTimeUtility = dateTimeUtility; + // do nothing } public override void Schedule() @@ -52,14 +47,10 @@ public override void Schedule() private PeriodicWorkRequest CreatePeriodicWorkRequest() { - DateTime tommorow = _dateTimeUtility.UtcNow.Date.AddDays(1); - var interval = tommorow - _dateTimeUtility.UtcNow; - var workRequestBuilder = new PeriodicWorkRequest.Builder( typeof(BackgroundWorker), INTERVAL_IN_HOURS, TimeUnit.Hours ) - .SetPeriodStartTime((long)interval.TotalSeconds, TimeUnit.Seconds) .SetConstraints(new Constraints.Builder() .SetRequiresBatteryNotLow(true) .Build()) diff --git a/Covid19Radar/Covid19Radar.Android/Services/EventLogSubmissionBackgroundService.cs b/Covid19Radar/Covid19Radar.Android/Services/EventLogSubmissionBackgroundService.cs index 94eed41f3..c5701b866 100644 --- a/Covid19Radar/Covid19Radar.Android/Services/EventLogSubmissionBackgroundService.cs +++ b/Covid19Radar/Covid19Radar.Android/Services/EventLogSubmissionBackgroundService.cs @@ -22,15 +22,12 @@ public class EventLogSubmissionBackgroundService : AbsEventLogSubmissionBackgrou private const long INTERVAL_IN_HOURS = 24; private const long BACKOFF_DELAY_IN_MINUTES = 60; - private readonly IDateTimeUtility _dateTimeUtility; private readonly ILoggerService _loggerService; public EventLogSubmissionBackgroundService( - IDateTimeUtility dateTimeUtility, ILoggerService loggerService ) : base() { - _dateTimeUtility = dateTimeUtility; _loggerService = loggerService; } @@ -52,14 +49,10 @@ public override void Schedule() private PeriodicWorkRequest CreatePeriodicWorkRequest() { - DateTime tommorow = _dateTimeUtility.UtcNow.Date.AddDays(1); - var interval = tommorow - _dateTimeUtility.UtcNow; - var workRequestBuilder = new PeriodicWorkRequest.Builder( typeof(BackgroundWorker), INTERVAL_IN_HOURS, TimeUnit.Hours ) - .SetPeriodStartTime((long)interval.TotalSeconds, TimeUnit.Seconds) .SetConstraints(new Constraints.Builder() .SetRequiresBatteryNotLow(true) .SetRequiredNetworkType(NetworkType.Connected) From 669860b5d7c77c38062500eef76c575cb1f499b7 Mon Sep 17 00:00:00 2001 From: ARIYAMA Keiji Date: Wed, 29 Jun 2022 13:22:46 +0900 Subject: [PATCH 23/23] Run background task immediately at make first scheduling from AppDelegate. --- .../Services/DataMaintainanceBackgroundService.cs | 12 +++++------- .../Services/EventLogSubmissionBackgroundService.cs | 12 +++++------- 2 files changed, 10 insertions(+), 14 deletions(-) diff --git a/Covid19Radar/Covid19Radar.iOS/Services/DataMaintainanceBackgroundService.cs b/Covid19Radar/Covid19Radar.iOS/Services/DataMaintainanceBackgroundService.cs index 2f59ca24a..61fd5a28f 100644 --- a/Covid19Radar/Covid19Radar.iOS/Services/DataMaintainanceBackgroundService.cs +++ b/Covid19Radar/Covid19Radar.iOS/Services/DataMaintainanceBackgroundService.cs @@ -57,7 +57,8 @@ public override void Schedule() { loggerService.Info("Background task has been started."); - ScheduleBgTask(); + DateTime nextDateTime = _dateTimeUtility.UtcNow.Date.AddDays(TASK_INTERVAL_IN_DAYS); + ScheduleBgTask(nextDateTime); var cancellationTokenSource = new CancellationTokenSource(); task.ExpirationHandler = cancellationTokenSource.Cancel; @@ -95,7 +96,7 @@ public override void Schedule() loggerService.Info("BGTaskScheduler.Shared.Register failed."); } - ScheduleBgTask(); + ScheduleBgTask(_dateTimeUtility.UtcNow); loggerService.EndMethod(); } @@ -104,18 +105,15 @@ public override void Schedule() #region Other Private Methods - private void ScheduleBgTask() + private void ScheduleBgTask(DateTime nextDateTime) { loggerService.StartMethod(); try { - DateTime tommorow = _dateTimeUtility.UtcNow.Date.AddDays(TASK_INTERVAL_IN_DAYS); - var interval = tommorow - _dateTimeUtility.UtcNow; - BGProcessingTaskRequest bgTaskRequest = new BGProcessingTaskRequest(BGTASK_IDENTIFIER) { - EarliestBeginDate = NSDate.FromTimeIntervalSinceNow(interval.TotalSeconds) + EarliestBeginDate = NSDate.FromTimeIntervalSince1970(nextDateTime.ToUnixEpoch()) }; BGTaskScheduler.Shared.Submit(bgTaskRequest, out var error); diff --git a/Covid19Radar/Covid19Radar.iOS/Services/EventLogSubmissionBackgroundService.cs b/Covid19Radar/Covid19Radar.iOS/Services/EventLogSubmissionBackgroundService.cs index 569ca3709..4d1516b41 100644 --- a/Covid19Radar/Covid19Radar.iOS/Services/EventLogSubmissionBackgroundService.cs +++ b/Covid19Radar/Covid19Radar.iOS/Services/EventLogSubmissionBackgroundService.cs @@ -43,7 +43,8 @@ public override void Schedule() { _loggerService.Info("Background task has been started."); - ScheduleBgTask(); + DateTime nextDateTime = _dateTimeUtility.UtcNow.Date.AddDays(TASK_INTERVAL_IN_DAYS); + ScheduleBgTask(nextDateTime); var cancellationTokenSource = new CancellationTokenSource(); task.ExpirationHandler = cancellationTokenSource.Cancel; @@ -83,24 +84,21 @@ await _eventLogService.SendAllAsync( _loggerService.Info("BGTaskScheduler.Shared.Register failed."); } - ScheduleBgTask(); + ScheduleBgTask(_dateTimeUtility.UtcNow); _loggerService.EndMethod(); } - private void ScheduleBgTask() + private void ScheduleBgTask(DateTime nextDateTime) { _loggerService.StartMethod(); try { - DateTime tommorow = _dateTimeUtility.UtcNow.Date.AddDays(TASK_INTERVAL_IN_DAYS); - var interval = tommorow - _dateTimeUtility.UtcNow; - BGProcessingTaskRequest bgTaskRequest = new BGProcessingTaskRequest(BGTASK_IDENTIFIER) { RequiresNetworkConnectivity = true, - EarliestBeginDate = NSDate.FromTimeIntervalSinceNow(interval.TotalSeconds) + EarliestBeginDate = NSDate.FromTimeIntervalSince1970(nextDateTime.ToUnixEpoch()) }; BGTaskScheduler.Shared.Submit(bgTaskRequest, out var error);