diff --git a/.github/workflows/conventional-commits.yml b/.github/workflows/conventional-commits.yml index 54143ef9d..a27188b04 100644 --- a/.github/workflows/conventional-commits.yml +++ b/.github/workflows/conventional-commits.yml @@ -1,10 +1,12 @@ -name: Conventional Commits +name: Conventional Commits on: [pull_request] env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} +# We are setting the version to 0.20.0 because of bug happening with the current version of the action. +# To see more details and know when it will be fixed, please visit: https://github.com/aevea/commitsar/issues/583 jobs: validate-commits: runs-on: ubuntu-latest @@ -12,4 +14,4 @@ jobs: - name: Check out code into the Go module directory uses: actions/checkout@v1 - name: Commitsar check - uses: docker://aevea/commitsar + uses: docker://aevea/commitsar:0.20.0 diff --git a/CHANGELOG.md b/CHANGELOG.md index e9bf18f14..021e2daeb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,15 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) Prefix your items with `(Template)` if the change is about the template and not the resulting application. +## 3.12.X +- Updated from .NET 9 to .NET 10. +- Updated Android target SDK version to 36. +- Updated android aot profile and profiling packages to 10.0.0-preview1. +- Set MtouchUseLlvm to false for iOS release build to fix build time issue. +- Changed the way that iOS app icons are added to the project. +- Updated external dependencies packages versions. +- Added [Bindable(true)] to all properties in the presentation layer that are used in bindings to remove runtime errors. + ## 3.11.X - Added API Client tests project. - Removed all references to Uno.SourceGenerationTasks packages and adjusted the dependency injection recipe in ViewModels accordingly. diff --git a/Directory.Build.props b/Directory.Build.props index 32b303f9e..01aa3990c 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -1,15 +1,15 @@  - + all runtime; build; native; contentfiles; analyzers - + all runtime; build; native; contentfiles; analyzers - + diff --git a/build/stage-build.yml b/build/stage-build.yml index 6fd0d60ab..2e060cd22 100644 --- a/build/stage-build.yml +++ b/build/stage-build.yml @@ -68,7 +68,7 @@ jobs: - name: ApplicationEnvironment value: ${{ parameters.applicationEnvironment }} - name: BuildTargetFramework - value: net9.0-windows10.0.22621.0 + value: net10.0-windows10.0.22621.0 # For optimization, if we are on light build, we only build the project else we publish it. - name: dotNetCommand ${{ if eq(variables['IsLightBuild'], 'true') }}: @@ -107,7 +107,7 @@ jobs: - name: ApplicationPlatform value: AnyCPU - name: BuildTargetFramework - value: net9.0-android35.0 + value: net10.0-android36.0 # For optimization, if we are on light build, we only build the project else we publish it. - name: dotNetCommand @@ -133,7 +133,7 @@ jobs: - name: ApplicationEnvironment value: ${{ parameters.applicationEnvironment }} - name: BuildTargetFramework - value: net9.0-ios + value: net10.0-ios - name: ArtifactName value: $(iOSArtifactName)_${{ parameters.applicationEnvironment }} diff --git a/build/steps-build-android.yml b/build/steps-build-android.yml index 4d72e3ee5..8885fd75f 100644 --- a/build/steps-build-android.yml +++ b/build/steps-build-android.yml @@ -71,7 +71,7 @@ steps: displayName: 'Copy Binary Files' retryCountOnTaskFailure: 3 inputs: - SourceFolder: '${{ parameters.pathToSrc }}/app/${{ parameters.solutionName }}.Mobile/bin/Release/net9.0-android35.0' + SourceFolder: '${{ parameters.pathToSrc }}/app/${{ parameters.solutionName }}.Mobile/bin/Release/net10.0-android36.0' Contents: | **/*.aab **/*.apk diff --git a/build/steps-build-ios.yml b/build/steps-build-ios.yml index cd9e89123..2dbf604a9 100644 --- a/build/steps-build-ios.yml +++ b/build/steps-build-ios.yml @@ -26,6 +26,13 @@ steps: parameters: installAppleWorkload: true +- task: Bash@3 + displayName: Select Xcode 26.1 + inputs: + targetType: inline + script: | + sudo xcode-select -s "/Applications/Xcode_26.1.1.app/Contents/Developer" + #-if false - download: current condition: eq('GeneratedApp', '${{ parameters.solutionName }}') @@ -83,7 +90,7 @@ steps: inputs: Contents: '**/*.ipa' flattenFolders : true - SourceFolder: '${{ parameters.pathToSrc }}/app/${{ parameters.solutionName }}.Mobile/bin/Release/net9.0-ios' + SourceFolder: '${{ parameters.pathToSrc }}/app/${{ parameters.solutionName }}.Mobile/bin/Release/net10.0-ios' TargetFolder: '$(Build.ArtifactStagingDirectory)' - task: CopyFiles@2 @@ -91,7 +98,7 @@ steps: inputs: Contents: '**/*.dSYM/**' flattenFolders : true - SourceFolder: '${{ parameters.pathToSrc }}/app/${{ parameters.solutionName }}.Mobile/bin/Release/net9.0-ios' + SourceFolder: '${{ parameters.pathToSrc }}/app/${{ parameters.solutionName }}.Mobile/bin/Release/net10.0-ios' TargetFolder: '$(Build.ArtifactStagingDirectory)/${{ parameters.solutionName }}.Mobile.dSYM' - publish: $(Build.ArtifactStagingDirectory) diff --git a/build/templates/dotnet-install.yml b/build/templates/dotnet-install.yml index b3e19c39c..d0b656604 100644 --- a/build/templates/dotnet-install.yml +++ b/build/templates/dotnet-install.yml @@ -1,11 +1,11 @@ parameters: - name: UnoCheck_Version type: string - default: '1.27.4' + default: '1.33.1' - name: UnoCheck_Manifest type: string - default: 'https://raw.githubusercontent.com/unoplatform/uno.check/870b2615fc2783e9355374c12015597a92dd242a/manifests/uno.ui.manifest.json' + default: 'https://raw.githubusercontent.com/unoplatform/uno.check/d80cfb2e37941bfbb8d9d7bd9cc6599567382cff/manifests/uno.ui.manifest.json' # Whether the Android workload should be installed. - name: installAndroidWorkload diff --git a/build/variables.yml b/build/variables.yml index 1ee960551..f0e590878 100644 --- a/build/variables.yml +++ b/build/variables.yml @@ -59,7 +59,7 @@ macOSHostedAgentImage: 'macOS-15' # SDK versions - DotNetVersion: '9.0.102' + DotNetVersion: '10.0.101' # Name of the folder where the artefacts will be placed. Variable used in build and release phases. # We make seperate folders so that releases can each download only the folder they need. diff --git a/doc/Architecture.md b/doc/Architecture.md index bfd45c263..a9f2bfbb3 100644 --- a/doc/Architecture.md +++ b/doc/Architecture.md @@ -109,7 +109,7 @@ See [Logging.md](Logging.md) for more details. ### Testing The architecture of application was designed with automated testing in mind. Automated testing explains why the application is divided in layers that are not multi-targeted. -> i.e. The Access, Business, and Presentation libs target only `.net9.0`, and **not** `.net9.0-ios` nor `.net9.0-android35.0`. +> i.e. The Access, Business, and Presentation libs target only `.net10.0`, and **not** `.net10.0-ios` nor `.net10.0-android36.0`. It also explains the separation of `Startup` and `CoreStartup`. `CoreStartup` can setup all the services that are non-UI dependent which can then be used to run simulations of the application using ViewModels that aren't attached to any UI. diff --git a/doc/PlatformSpecifics.md b/doc/PlatformSpecifics.md index cf8e0800d..08b658542 100644 --- a/doc/PlatformSpecifics.md +++ b/doc/PlatformSpecifics.md @@ -21,12 +21,12 @@ To generate this file, following the following steps: 1. Open a command prompt or terminal against your Android project’s directory that contains the .csproj. 2. Ensure only one Android device is attached. -3. Execute the following command: `dotnet build -f net9.0-android35.0 -t:BuildAndStartAotProfiling` +3. Execute the following command: `dotnet build -f net10.0-android36.0 -t:BuildAndStartAotProfiling` - The dotnet version targeted must match the one specified in the mobile csproj. - If you have a custom Android SDK path, you can specify it with the `AndroidSdkPath` property. > 💡 `-p:AndroidSdkDirectory=path/to/android/sdk` 4. Let your application run until it’s loaded. -5. Execute the following command: `dotnet build -f net9.0-android35.0 -t:FinishAotProfiling`. +5. Execute the following command: `dotnet build -f net10.0-android36.0 -t:FinishAotProfiling`. - The dotnet version targeted must match the one specified in the mobile csproj. - If you have a custom Android SDK path, you can specify it with the `AndroidSdkPath` property. > 💡 `-p:AndroidSdkDirectory=path/to/android/sdk` @@ -36,7 +36,7 @@ To generate this file, following the following steps: True True False - + ``` diff --git a/src/app/ApplicationTemplate.Access/ApplicationTemplate.Access.csproj b/src/app/ApplicationTemplate.Access/ApplicationTemplate.Access.csproj index 00b06adcc..c38ca68a8 100644 --- a/src/app/ApplicationTemplate.Access/ApplicationTemplate.Access.csproj +++ b/src/app/ApplicationTemplate.Access/ApplicationTemplate.Access.csproj @@ -1,8 +1,8 @@  - net9.0 - 13.0 + net10.0 + 14.0 ApplicationTemplate.DataAccess true true @@ -18,18 +18,17 @@ - - - - - + + + + + - - - + + - + diff --git a/src/app/ApplicationTemplate.Access/PlatformServices/Email/MockedEmailService.cs b/src/app/ApplicationTemplate.Access/PlatformServices/Email/MockedEmailService.cs index 7cd05f18d..e7434a9d0 100644 --- a/src/app/ApplicationTemplate.Access/PlatformServices/Email/MockedEmailService.cs +++ b/src/app/ApplicationTemplate.Access/PlatformServices/Email/MockedEmailService.cs @@ -15,7 +15,10 @@ public MockedEmailService(ILogger logger) public Task Compose(CancellationToken ct, Email email) { - _logger.LogInformation("Email composed: {Email}", email); + if (_logger.IsEnabled(LogLevel.Information)) + { + _logger.LogInformation("Email composed: {Email}", email); + } return Task.CompletedTask; } } diff --git a/src/app/ApplicationTemplate.Business/ApplicationTemplate.Business.csproj b/src/app/ApplicationTemplate.Business/ApplicationTemplate.Business.csproj index f90a4ffd7..fc79e21c9 100644 --- a/src/app/ApplicationTemplate.Business/ApplicationTemplate.Business.csproj +++ b/src/app/ApplicationTemplate.Business/ApplicationTemplate.Business.csproj @@ -1,7 +1,7 @@  - net9.0 - 13.0 + net10.0 + 14.0 true true diff --git a/src/app/ApplicationTemplate.Business/DadJokes/DadJokesQuote.cs b/src/app/ApplicationTemplate.Business/DadJokes/DadJokesQuote.cs index 907d40a9b..cc61f7d93 100644 --- a/src/app/ApplicationTemplate.Business/DadJokes/DadJokesQuote.cs +++ b/src/app/ApplicationTemplate.Business/DadJokes/DadJokesQuote.cs @@ -1,10 +1,12 @@ using System; using System.Collections.Generic; +using System.ComponentModel; using System.Text; using ApplicationTemplate.DataAccess; namespace ApplicationTemplate.Business; +[Bindable(true)] public record DadJokesQuote { public DadJokesQuote(DadJokeContentData data, bool isFavorite) diff --git a/src/app/ApplicationTemplate.Business/KillSwitch/KillSwitchService.cs b/src/app/ApplicationTemplate.Business/KillSwitch/KillSwitchService.cs index c50aeab38..70f8d7f43 100644 --- a/src/app/ApplicationTemplate.Business/KillSwitch/KillSwitchService.cs +++ b/src/app/ApplicationTemplate.Business/KillSwitch/KillSwitchService.cs @@ -26,5 +26,11 @@ public KillSwitchService(IKillSwitchDataSource killSwitchDataSource, ILogger public IObservable ObserveKillSwitchActivation() => _killSwitchDataSource.ObserveKillSwitchActivation() - .Do(isActive => _logger.LogInformation("Kill switch is now {IsActive}.", isActive)); + .Do(isActive => + { + if (_logger.IsEnabled(LogLevel.Information)) + { + _logger.LogInformation("Kill switch is now {IsActive}.", isActive); + } + }); } diff --git a/src/app/ApplicationTemplate.Business/Posts/Post.cs b/src/app/ApplicationTemplate.Business/Posts/Post.cs index 629b43c86..9f04db924 100644 --- a/src/app/ApplicationTemplate.Business/Posts/Post.cs +++ b/src/app/ApplicationTemplate.Business/Posts/Post.cs @@ -1,10 +1,12 @@ using System; using System.Collections.Generic; +using System.ComponentModel; using System.Text; using ApplicationTemplate.DataAccess; namespace ApplicationTemplate.Business; +[Bindable(true)] public record Post { public long Id { get; init; } diff --git a/src/app/ApplicationTemplate.Mobile/Android/AndroidManifest.xml b/src/app/ApplicationTemplate.Mobile/Android/AndroidManifest.xml index 4f5bf3f95..54e02a20b 100644 --- a/src/app/ApplicationTemplate.Mobile/Android/AndroidManifest.xml +++ b/src/app/ApplicationTemplate.Mobile/Android/AndroidManifest.xml @@ -5,7 +5,7 @@ android:versionName="1.0.0"> + android:targetSdkVersion="36" /> diff --git a/src/app/ApplicationTemplate.Mobile/ApplicationTemplate.Mobile.csproj b/src/app/ApplicationTemplate.Mobile/ApplicationTemplate.Mobile.csproj index e2e761a0f..75cd6a517 100644 --- a/src/app/ApplicationTemplate.Mobile/ApplicationTemplate.Mobile.csproj +++ b/src/app/ApplicationTemplate.Mobile/ApplicationTemplate.Mobile.csproj @@ -1,13 +1,13 @@  - 13.0 - net9.0-android35.0;net9.0-ios + 14.0 + net10.0-android36.0;net10.0-ios true true Exe true - 29.0 - 14.2 + 29.0 + 14.2 Uno0001 @@ -16,29 +16,29 @@ partial - - - - - - - - - - - + + + + + + + + + + + - - + + - - - - - - + + + + + + - + @@ -49,7 +49,7 @@ - + False False @@ -103,11 +103,8 @@ - + - - - @@ -148,11 +145,11 @@ - + $(MtouchExtraArgs) --setenv=MONO_GC_PARAMS=soft-heap-limit=512m,nursery-size=64m,evacuation-threshold=66,major=marksweep,concurrent-sweep $(MtouchExtraArgs) --xml=./iOS/LinkerExclusions.xml --linkskip=$(AssemblyName) - -all,ByteSize,Uno.Core.Extensions,Uno.Core.Extensions.Collections,Uno.Core.Extensions.Equality,Uno.Core.Extensions.Threading,Uno.Core.Extensions.Disposables,Uno.Core.Extensions.Logging,Nventive.Persistence.Reactive,Reactive.Annex,ReviewService.Abstractions,MallardMessageHandlers,FluentValidation,Chinook.DataLoader.Abstractions,Chinook.DynamicMvvm.Abstractions,Chinook.SectionsNavigation.Abstractions,Chinook.StackNavigation.Abstractions,Chinook.BackButtonManager.Abstractions,ApplicationTemplate.Business,Chinook.DynamicMvvm.FluentValidation,Chinook.DataLoader.DynamicMvvm,Chinook.DataLoader,Microsoft.Maui.Controls.HotReload.Forms + -all,Microsoft.Maui.Controls.HotReload.Forms $(MtouchExtraArgs) --registrar:static @@ -160,6 +157,7 @@ iOS\Entitlements.plist true + AppIcons @@ -198,7 +196,22 @@ True - True + + False True False True @@ -208,7 +221,7 @@ - + diff --git a/src/app/ApplicationTemplate.Mobile/custom.aprof b/src/app/ApplicationTemplate.Mobile/custom.aprof index 1e1cd75f6..eefde229d 100644 Binary files a/src/app/ApplicationTemplate.Mobile/custom.aprof and b/src/app/ApplicationTemplate.Mobile/custom.aprof differ diff --git a/src/app/ApplicationTemplate.Mobile/iOS/Info.plist b/src/app/ApplicationTemplate.Mobile/iOS/Info.plist index 25ad68f3a..ec53fb88f 100644 --- a/src/app/ApplicationTemplate.Mobile/iOS/Info.plist +++ b/src/app/ApplicationTemplate.Mobile/iOS/Info.plist @@ -42,8 +42,6 @@ UIViewControllerBasedStatusBarAppearance - XSAppIconAssets - Media.xcassets/AppIcons.appiconset UIApplicationSupportsIndirectInputEvents diff --git a/src/app/ApplicationTemplate.Presentation/ApplicationTemplate.Presentation.csproj b/src/app/ApplicationTemplate.Presentation/ApplicationTemplate.Presentation.csproj index 3d1bf9ff6..b96434345 100644 --- a/src/app/ApplicationTemplate.Presentation/ApplicationTemplate.Presentation.csproj +++ b/src/app/ApplicationTemplate.Presentation/ApplicationTemplate.Presentation.csproj @@ -1,8 +1,8 @@  - net9.0 - 13.0 + net10.0 + 14.0 true true @@ -17,24 +17,24 @@ - - - - - - + + + + + + - - - - - - - - - - + + + + + + + + + + diff --git a/src/app/ApplicationTemplate.Presentation/Configuration/ErrorConfiguration.cs b/src/app/ApplicationTemplate.Presentation/Configuration/ErrorConfiguration.cs index 0192c0481..dba0ba7da 100644 --- a/src/app/ApplicationTemplate.Presentation/Configuration/ErrorConfiguration.cs +++ b/src/app/ApplicationTemplate.Presentation/Configuration/ErrorConfiguration.cs @@ -41,7 +41,11 @@ public static void OnUnhandledException(Exception exception, bool isTerminating, } var logger = services.GetRequiredService>(); - logger.LogError(exception, "An unhandled exception occurred. StackTrace: {StackTrace}", exception.StackTrace); + + if (logger.IsEnabled(LogLevel.Error)) + { + logger.LogError(exception, "An unhandled exception occurred. StackTrace: {StackTrace}", exception.StackTrace); + } } private static async Task HandleCommandException(CancellationToken ct, IDynamicCommand command, Exception exception, IServiceProvider services) diff --git a/src/app/ApplicationTemplate.Presentation/Configuration/ReviewConfiguration.cs b/src/app/ApplicationTemplate.Presentation/Configuration/ReviewConfiguration.cs index aa537c2d6..217d2c191 100644 --- a/src/app/ApplicationTemplate.Presentation/Configuration/ReviewConfiguration.cs +++ b/src/app/ApplicationTemplate.Presentation/Configuration/ReviewConfiguration.cs @@ -49,7 +49,7 @@ public ReviewServiceAdapter(IReviewService reviewService) public Task GetAreConditionsSatisfied(CancellationToken ct) => _reviewService.GetAreConditionsSatisfied(ct); - public Task TryRequestReview(CancellationToken ct) => _reviewService.TryRequestReview(ct); + public Task TryRequestReview(CancellationToken ct) => _reviewService.TryRequestReview(ct); public Task UpdateReviewSettings(CancellationToken ct, Func updateFunction) => _reviewService.UpdateReviewSettings(ct, updateFunction); } diff --git a/src/app/ApplicationTemplate.Presentation/CoreStartup.cs b/src/app/ApplicationTemplate.Presentation/CoreStartup.cs index 8c04e9cd0..4fb8529c0 100644 --- a/src/app/ApplicationTemplate.Presentation/CoreStartup.cs +++ b/src/app/ApplicationTemplate.Presentation/CoreStartup.cs @@ -229,7 +229,10 @@ private void SuscribeToKillSwitch(IServiceProvider serviceProvider) killSwitchService.ObserveKillSwitchActivation() .SelectManyDisposePrevious(async (activated, ct) => { - Logger.LogTrace("Kill switch activation changed to {Activated}.", activated); + if (Logger.IsEnabled(LogLevel.Trace)) + { + Logger.LogTrace("Kill switch activation changed to {Activated}.", activated); + } if (activated) { diff --git a/src/app/ApplicationTemplate.Presentation/Framework/DataLoader/LogErrorDataLoaderStrategy.cs b/src/app/ApplicationTemplate.Presentation/Framework/DataLoader/LogErrorDataLoaderStrategy.cs index 3ac4cb8bb..ca3752dd3 100644 --- a/src/app/ApplicationTemplate.Presentation/Framework/DataLoader/LogErrorDataLoaderStrategy.cs +++ b/src/app/ApplicationTemplate.Presentation/Framework/DataLoader/LogErrorDataLoaderStrategy.cs @@ -31,7 +31,10 @@ public override async Task Load(CancellationToken ct, IDataLoaderRequest } catch (Exception error) { - _logger.LogError(error, "Failed to load request '{RequestSequenceId}' in DataLoader '{DataLoaderName}'.", request.SequenceId, request.Context.GetDataLoaderName()); + if (_logger.IsEnabled(LogLevel.Error)) + { + _logger.LogError(error, "Failed to load request '{RequestSequenceId}' in DataLoader '{DataLoaderName}'.", request.SequenceId, request.Context.GetDataLoaderName()); + } throw; } diff --git a/src/app/ApplicationTemplate.Presentation/Framework/Startup/CoreStartupBase.cs b/src/app/ApplicationTemplate.Presentation/Framework/Startup/CoreStartupBase.cs index 73dbbe2e5..4b9d59dc8 100644 --- a/src/app/ApplicationTemplate.Presentation/Framework/Startup/CoreStartupBase.cs +++ b/src/app/ApplicationTemplate.Presentation/Framework/Startup/CoreStartupBase.cs @@ -150,7 +150,10 @@ public async Task Start() var isFirstStart = !State.IsStarted; - Logger.LogDebug("Starting services (isFirstStart: {IsFirstStart}).", isFirstStart); + if (Logger.IsEnabled(LogLevel.Debug)) + { + Logger.LogDebug("Starting services (isFirstStart: {IsFirstStart}).", isFirstStart); + } await StartServices(ServiceProvider, isFirstStart); diff --git a/src/app/ApplicationTemplate.Presentation/Framework/Startup/StartupBase.cs b/src/app/ApplicationTemplate.Presentation/Framework/Startup/StartupBase.cs index 32831c202..712395369 100644 --- a/src/app/ApplicationTemplate.Presentation/Framework/Startup/StartupBase.cs +++ b/src/app/ApplicationTemplate.Presentation/Framework/Startup/StartupBase.cs @@ -152,7 +152,10 @@ public async Task Start() async Task StartViewServicesWithLogs(IServiceProvider services, bool isFirstStart) { - Logger.LogDebug("Starting view services (isFirstStart: {IsFirstStart}).", isFirstStart); + if (Logger.IsEnabled(LogLevel.Debug)) + { + Logger.LogDebug("Starting view services (isFirstStart: {IsFirstStart}).", isFirstStart); + } await StartViewServices(services, isFirstStart); diff --git a/src/app/ApplicationTemplate.Presentation/Framework/Startup/WritableJsonConfigurationProvider.cs b/src/app/ApplicationTemplate.Presentation/Framework/Startup/WritableJsonConfigurationProvider.cs index 518937efe..c9ca6ac5d 100644 --- a/src/app/ApplicationTemplate.Presentation/Framework/Startup/WritableJsonConfigurationProvider.cs +++ b/src/app/ApplicationTemplate.Presentation/Framework/Startup/WritableJsonConfigurationProvider.cs @@ -50,8 +50,10 @@ public override void Set(string key, string value) } } - _logger.LogDebug("Serialized ­­­­{PairCount} key-value-pairs in {ElapsedMilliseconds}ms.", Data.Count, stopwatch.ElapsedMilliseconds); - + if (_logger.IsEnabled(LogLevel.Debug)) + { + _logger.LogDebug("Serialized ­­­­{PairCount} key-value-pairs in {ElapsedMilliseconds}ms.", Data.Count, stopwatch.ElapsedMilliseconds); + } OnReload(); } } diff --git a/src/app/ApplicationTemplate.Presentation/Framework/ViewModels/IViewModel.Extensions.Options.cs b/src/app/ApplicationTemplate.Presentation/Framework/ViewModels/IViewModel.Extensions.Options.cs index b6814ad0a..0a87f6f44 100644 --- a/src/app/ApplicationTemplate.Presentation/Framework/ViewModels/IViewModel.Extensions.Options.cs +++ b/src/app/ApplicationTemplate.Presentation/Framework/ViewModels/IViewModel.Extensions.Options.cs @@ -126,7 +126,12 @@ string GetValueAsString(TValue value) { if (value is not string && value is not bool) { - viewModel.GetService>().LogWarning("Serialization of type {TypeName} may be wrong. Consider using the valueToString parameter from the GetFromOptionsMonitor method.", typeof(TValue).Name); + var logger = viewModel.GetService(); + + if (logger.IsEnabled(LogLevel.Warning)) + { + logger.LogWarning("Serialization of type {TypeName} may be wrong. Consider using the valueToString parameter from the GetFromOptionsMonitor method.", typeof(TValue).Name); + } } return value.ToString(); diff --git a/src/app/ApplicationTemplate.Presentation/ViewModels/Authentication/CreateAccountFormViewModel.cs b/src/app/ApplicationTemplate.Presentation/ViewModels/Authentication/CreateAccountFormViewModel.cs index 4694b0ade..f4695e03b 100644 --- a/src/app/ApplicationTemplate.Presentation/ViewModels/Authentication/CreateAccountFormViewModel.cs +++ b/src/app/ApplicationTemplate.Presentation/ViewModels/Authentication/CreateAccountFormViewModel.cs @@ -1,4 +1,5 @@ using System; +using System.ComponentModel; using Chinook.DynamicMvvm; using FluentValidation; using Microsoft.Extensions.Localization; @@ -6,6 +7,7 @@ namespace ApplicationTemplate.Presentation; +[Bindable(true)] public sealed class CreateAccountFormViewModel : ViewModel { public CreateAccountFormViewModel() diff --git a/src/app/ApplicationTemplate.Presentation/ViewModels/Authentication/CreateAccountPageViewModel.cs b/src/app/ApplicationTemplate.Presentation/ViewModels/Authentication/CreateAccountPageViewModel.cs index 7bd8b592a..949c28ef2 100644 --- a/src/app/ApplicationTemplate.Presentation/ViewModels/Authentication/CreateAccountPageViewModel.cs +++ b/src/app/ApplicationTemplate.Presentation/ViewModels/Authentication/CreateAccountPageViewModel.cs @@ -1,4 +1,5 @@ using System; +using System.ComponentModel; using System.Threading; using System.Threading.Tasks; using ApplicationTemplate.Business; @@ -8,6 +9,7 @@ namespace ApplicationTemplate.Presentation; +[Bindable(true)] public class CreateAccountPageViewModel : ViewModel { public CreateAccountFormViewModel Form => this.GetChild(() => new CreateAccountFormViewModel()); diff --git a/src/app/ApplicationTemplate.Presentation/ViewModels/Authentication/ForgotPasswordFormViewModel.cs b/src/app/ApplicationTemplate.Presentation/ViewModels/Authentication/ForgotPasswordFormViewModel.cs index a46bf5494..a2f140388 100644 --- a/src/app/ApplicationTemplate.Presentation/ViewModels/Authentication/ForgotPasswordFormViewModel.cs +++ b/src/app/ApplicationTemplate.Presentation/ViewModels/Authentication/ForgotPasswordFormViewModel.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.ComponentModel; using System.Text; using Chinook.DynamicMvvm; using FluentValidation; @@ -8,6 +9,7 @@ namespace ApplicationTemplate.Presentation; +[Bindable(true)] public class ForgotPasswordFormViewModel : ViewModel { public ForgotPasswordFormViewModel() diff --git a/src/app/ApplicationTemplate.Presentation/ViewModels/Authentication/ForgotPasswordPageViewModel.cs b/src/app/ApplicationTemplate.Presentation/ViewModels/Authentication/ForgotPasswordPageViewModel.cs index 09bc67fe0..150fcb9f2 100644 --- a/src/app/ApplicationTemplate.Presentation/ViewModels/Authentication/ForgotPasswordPageViewModel.cs +++ b/src/app/ApplicationTemplate.Presentation/ViewModels/Authentication/ForgotPasswordPageViewModel.cs @@ -1,4 +1,5 @@ using System; +using System.ComponentModel; using System.Threading; using System.Threading.Tasks; using ApplicationTemplate.Business; @@ -8,6 +9,7 @@ namespace ApplicationTemplate.Presentation; +[Bindable(true)] public class ForgotPasswordPageViewModel : ViewModel { public ForgotPasswordFormViewModel Form => this.GetChild(() => new ForgotPasswordFormViewModel()); diff --git a/src/app/ApplicationTemplate.Presentation/ViewModels/Authentication/LoginFormViewModel.cs b/src/app/ApplicationTemplate.Presentation/ViewModels/Authentication/LoginFormViewModel.cs index 3ed7948a5..7e32e2c02 100644 --- a/src/app/ApplicationTemplate.Presentation/ViewModels/Authentication/LoginFormViewModel.cs +++ b/src/app/ApplicationTemplate.Presentation/ViewModels/Authentication/LoginFormViewModel.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.ComponentModel; using System.Text; using Chinook.DynamicMvvm; using FluentValidation; @@ -8,6 +9,7 @@ namespace ApplicationTemplate.Presentation; +[Bindable(true)] public class LoginFormViewModel : ViewModel { public string Email diff --git a/src/app/ApplicationTemplate.Presentation/ViewModels/Authentication/LoginPageViewModel.cs b/src/app/ApplicationTemplate.Presentation/ViewModels/Authentication/LoginPageViewModel.cs index 402e5cc26..79614cac8 100644 --- a/src/app/ApplicationTemplate.Presentation/ViewModels/Authentication/LoginPageViewModel.cs +++ b/src/app/ApplicationTemplate.Presentation/ViewModels/Authentication/LoginPageViewModel.cs @@ -1,4 +1,5 @@ using System; +using System.ComponentModel; using System.Threading; using System.Threading.Tasks; using ApplicationTemplate.Business; @@ -10,6 +11,7 @@ namespace ApplicationTemplate.Presentation; +[Bindable(true)] public class LoginPageViewModel : ViewModel { public LoginPageViewModel(bool isFirstLogin) diff --git a/src/app/ApplicationTemplate.Presentation/ViewModels/Authentication/PasswordFormViewModel.cs b/src/app/ApplicationTemplate.Presentation/ViewModels/Authentication/PasswordFormViewModel.cs index 164ce3741..8c7fa8757 100644 --- a/src/app/ApplicationTemplate.Presentation/ViewModels/Authentication/PasswordFormViewModel.cs +++ b/src/app/ApplicationTemplate.Presentation/ViewModels/Authentication/PasswordFormViewModel.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.ComponentModel; using System.Linq; using System.Reactive.Linq; using System.Text; @@ -8,6 +9,7 @@ namespace ApplicationTemplate.Presentation; +[Bindable(true)] public class PasswordFormViewModel : ViewModel { public string Password diff --git a/src/app/ApplicationTemplate.Presentation/ViewModels/Authentication/ResetPasswordPageViewModel.cs b/src/app/ApplicationTemplate.Presentation/ViewModels/Authentication/ResetPasswordPageViewModel.cs index 3a7684c5f..6940a5a11 100644 --- a/src/app/ApplicationTemplate.Presentation/ViewModels/Authentication/ResetPasswordPageViewModel.cs +++ b/src/app/ApplicationTemplate.Presentation/ViewModels/Authentication/ResetPasswordPageViewModel.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.ComponentModel; using System.Linq; using System.Reactive.Linq; using System.Text; @@ -10,6 +11,7 @@ namespace ApplicationTemplate.Presentation; +[Bindable(true)] public class ResetPasswordPageViewModel : ViewModel { public PasswordFormViewModel PasswordForm => this.GetChild(() => new PasswordFormViewModel()); diff --git a/src/app/ApplicationTemplate.Presentation/ViewModels/Authentication/SentEmailConfirmationPageViewModel.cs b/src/app/ApplicationTemplate.Presentation/ViewModels/Authentication/SentEmailConfirmationPageViewModel.cs index cb84118d6..ad04ae16f 100644 --- a/src/app/ApplicationTemplate.Presentation/ViewModels/Authentication/SentEmailConfirmationPageViewModel.cs +++ b/src/app/ApplicationTemplate.Presentation/ViewModels/Authentication/SentEmailConfirmationPageViewModel.cs @@ -1,9 +1,11 @@ using System; using System.Collections.Generic; +using System.ComponentModel; using System.Text; namespace ApplicationTemplate.Presentation; +[Bindable(true)] public class SentEmailConfirmationPageViewModel : ViewModel { } diff --git a/src/app/ApplicationTemplate.Presentation/ViewModels/DadJokes/DadJokesFiltersPageViewModel.cs b/src/app/ApplicationTemplate.Presentation/ViewModels/DadJokes/DadJokesFiltersPageViewModel.cs index f704fe3d6..31dc5a14d 100644 --- a/src/app/ApplicationTemplate.Presentation/ViewModels/DadJokes/DadJokesFiltersPageViewModel.cs +++ b/src/app/ApplicationTemplate.Presentation/ViewModels/DadJokes/DadJokesFiltersPageViewModel.cs @@ -1,4 +1,5 @@ using System; +using System.ComponentModel; using System.Reactive.Linq; using ApplicationTemplate.Business; using Chinook.DynamicMvvm; @@ -6,6 +7,7 @@ namespace ApplicationTemplate.Presentation; +[Bindable(true)] public sealed class DadJokesFiltersPageViewModel : ViewModel { public IDynamicCommand HandleCheck => this.GetCommand((string pt) => diff --git a/src/app/ApplicationTemplate.Presentation/ViewModels/DadJokes/DadJokesItemViewModel.cs b/src/app/ApplicationTemplate.Presentation/ViewModels/DadJokes/DadJokesItemViewModel.cs index bd6641974..52cb4be7a 100644 --- a/src/app/ApplicationTemplate.Presentation/ViewModels/DadJokes/DadJokesItemViewModel.cs +++ b/src/app/ApplicationTemplate.Presentation/ViewModels/DadJokes/DadJokesItemViewModel.cs @@ -1,11 +1,13 @@ using System; using System.Collections.Generic; +using System.ComponentModel; using System.Text; using ApplicationTemplate.Business; using Chinook.DynamicMvvm; namespace ApplicationTemplate.Presentation; +[Bindable(true)] public class DadJokesItemViewModel : ViewModel { public DadJokesItemViewModel(IViewModel parent, DadJokesQuote quote) diff --git a/src/app/ApplicationTemplate.Presentation/ViewModels/DadJokes/DadJokesPageViewModel.cs b/src/app/ApplicationTemplate.Presentation/ViewModels/DadJokes/DadJokesPageViewModel.cs index 9c2e00d4d..9a873c81d 100644 --- a/src/app/ApplicationTemplate.Presentation/ViewModels/DadJokes/DadJokesPageViewModel.cs +++ b/src/app/ApplicationTemplate.Presentation/ViewModels/DadJokes/DadJokesPageViewModel.cs @@ -1,4 +1,5 @@ using System; +using System.ComponentModel; using System.Linq; using System.Reactive.Linq; using System.Threading; @@ -16,6 +17,7 @@ namespace ApplicationTemplate.Presentation; +[Bindable(true)] public sealed class DadJokesPageViewModel : ViewModel { private readonly IDadJokesService _dadJokesService; diff --git a/src/app/ApplicationTemplate.Presentation/ViewModels/Diagnostics/Configuration/ConfigurationDebuggerViewModel.cs b/src/app/ApplicationTemplate.Presentation/ViewModels/Diagnostics/Configuration/ConfigurationDebuggerViewModel.cs index 02815639b..c44041ead 100644 --- a/src/app/ApplicationTemplate.Presentation/ViewModels/Diagnostics/Configuration/ConfigurationDebuggerViewModel.cs +++ b/src/app/ApplicationTemplate.Presentation/ViewModels/Diagnostics/Configuration/ConfigurationDebuggerViewModel.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.ComponentModel; using System.Linq; using System.Reactive.Disposables; using System.Reflection; @@ -14,6 +15,7 @@ namespace ApplicationTemplate.Presentation; +[Bindable(true)] public sealed class ConfigurationDebuggerViewModel : TabViewModel { private static readonly JsonSerializerOptions _jsonOptions = new JsonSerializerOptions diff --git a/src/app/ApplicationTemplate.Presentation/ViewModels/Diagnostics/CultureDiagnosticsViewModel.cs b/src/app/ApplicationTemplate.Presentation/ViewModels/Diagnostics/CultureDiagnosticsViewModel.cs index e9b79d631..fe0fb3baf 100644 --- a/src/app/ApplicationTemplate.Presentation/ViewModels/Diagnostics/CultureDiagnosticsViewModel.cs +++ b/src/app/ApplicationTemplate.Presentation/ViewModels/Diagnostics/CultureDiagnosticsViewModel.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.ComponentModel; using System.Globalization; using System.Text; using System.Threading; @@ -9,6 +10,7 @@ namespace ApplicationTemplate.Presentation; +[Bindable(true)] public class CultureDiagnosticsViewModel : ViewModel { public string Culture diff --git a/src/app/ApplicationTemplate.Presentation/ViewModels/Diagnostics/DiagnosticsOverlayViewModel.cs b/src/app/ApplicationTemplate.Presentation/ViewModels/Diagnostics/DiagnosticsOverlayViewModel.cs index db54b13f0..788a389d5 100644 --- a/src/app/ApplicationTemplate.Presentation/ViewModels/Diagnostics/DiagnosticsOverlayViewModel.cs +++ b/src/app/ApplicationTemplate.Presentation/ViewModels/Diagnostics/DiagnosticsOverlayViewModel.cs @@ -1,4 +1,5 @@ using System; +using System.ComponentModel; using System.Diagnostics; using System.Globalization; using System.Reactive.Linq; @@ -10,6 +11,7 @@ namespace ApplicationTemplate.Presentation; +[Bindable(true)] public sealed class DiagnosticsOverlayViewModel : ViewModel { private readonly IMemoryProvider _memoryProvider; diff --git a/src/app/ApplicationTemplate.Presentation/ViewModels/Diagnostics/DiagnosticsPageViewModel.cs b/src/app/ApplicationTemplate.Presentation/ViewModels/Diagnostics/DiagnosticsPageViewModel.cs index f34d8404c..2e404758a 100644 --- a/src/app/ApplicationTemplate.Presentation/ViewModels/Diagnostics/DiagnosticsPageViewModel.cs +++ b/src/app/ApplicationTemplate.Presentation/ViewModels/Diagnostics/DiagnosticsPageViewModel.cs @@ -1,10 +1,12 @@ -using Chinook.DynamicMvvm; +using System.ComponentModel; +using Chinook.DynamicMvvm; using Chinook.SectionsNavigation; using Chinook.StackNavigation; using Uno; namespace ApplicationTemplate.Presentation; +[Bindable(true)] public sealed class DiagnosticsPageViewModel : ViewModel { private readonly IEnvironmentManager _environmentManager; diff --git a/src/app/ApplicationTemplate.Presentation/ViewModels/Diagnostics/EnvironmentPickerPageViewModel.cs b/src/app/ApplicationTemplate.Presentation/ViewModels/Diagnostics/EnvironmentPickerPageViewModel.cs index 20264777c..f92c129f9 100644 --- a/src/app/ApplicationTemplate.Presentation/ViewModels/Diagnostics/EnvironmentPickerPageViewModel.cs +++ b/src/app/ApplicationTemplate.Presentation/ViewModels/Diagnostics/EnvironmentPickerPageViewModel.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.ComponentModel; using System.Threading; using System.Threading.Tasks; using Chinook.DynamicMvvm; @@ -9,6 +10,7 @@ namespace ApplicationTemplate.Presentation; +[Bindable(true)] public sealed class EnvironmentPickerPageViewModel : ViewModel { private readonly string _currentEnvironment; diff --git a/src/app/ApplicationTemplate.Presentation/ViewModels/Diagnostics/ExceptionsDiagnosticsViewModel.cs b/src/app/ApplicationTemplate.Presentation/ViewModels/Diagnostics/ExceptionsDiagnosticsViewModel.cs index 39fd36679..379cd705c 100644 --- a/src/app/ApplicationTemplate.Presentation/ViewModels/Diagnostics/ExceptionsDiagnosticsViewModel.cs +++ b/src/app/ApplicationTemplate.Presentation/ViewModels/Diagnostics/ExceptionsDiagnosticsViewModel.cs @@ -1,4 +1,5 @@ using System; +using System.ComponentModel; using System.Reactive.Concurrency; using System.Threading; using System.Threading.Tasks; @@ -7,6 +8,7 @@ namespace ApplicationTemplate.Presentation; +[Bindable(true)] [System.Diagnostics.CodeAnalysis.SuppressMessage("Usage", "CA2201:Do not raise reserved exception types", Justification = "Those are diagnostics exception to test how the app reacts to exceptions.")] public class ExceptionsDiagnosticsViewModel : ViewModel { diff --git a/src/app/ApplicationTemplate.Presentation/ViewModels/Diagnostics/HttpDebugger/HttpDebuggerViewModel.cs b/src/app/ApplicationTemplate.Presentation/ViewModels/Diagnostics/HttpDebugger/HttpDebuggerViewModel.cs index 2c1422fbf..39fc46c53 100644 --- a/src/app/ApplicationTemplate.Presentation/ViewModels/Diagnostics/HttpDebugger/HttpDebuggerViewModel.cs +++ b/src/app/ApplicationTemplate.Presentation/ViewModels/Diagnostics/HttpDebugger/HttpDebuggerViewModel.cs @@ -1,5 +1,6 @@ using System; using System.Collections.ObjectModel; +using System.ComponentModel; using System.Globalization; using System.Reactive.Concurrency; using System.Reactive.Disposables; @@ -14,6 +15,7 @@ namespace ApplicationTemplate.Presentation; +[Bindable(true)] public sealed class HttpDebuggerViewModel : TabViewModel { private static readonly JsonSerializerOptions _jsonSerializerOptions = new JsonSerializerOptions { WriteIndented = true }; diff --git a/src/app/ApplicationTemplate.Presentation/ViewModels/Diagnostics/HttpDebugger/HttpTraceItemViewModel.cs b/src/app/ApplicationTemplate.Presentation/ViewModels/Diagnostics/HttpDebugger/HttpTraceItemViewModel.cs index 7587c31af..bd06e5f2e 100644 --- a/src/app/ApplicationTemplate.Presentation/ViewModels/Diagnostics/HttpDebugger/HttpTraceItemViewModel.cs +++ b/src/app/ApplicationTemplate.Presentation/ViewModels/Diagnostics/HttpDebugger/HttpTraceItemViewModel.cs @@ -1,11 +1,13 @@ using System; using System.Collections.Generic; +using System.ComponentModel; using System.Text; using ApplicationTemplate.DataAccess; using Chinook.DynamicMvvm; namespace ApplicationTemplate.Presentation; +[Bindable(true)] public sealed class HttpTraceItemViewModel : ViewModel { private readonly HttpTrace _trace; diff --git a/src/app/ApplicationTemplate.Presentation/ViewModels/Diagnostics/LoggersDiagnosticsViewModel.cs b/src/app/ApplicationTemplate.Presentation/ViewModels/Diagnostics/LoggersDiagnosticsViewModel.cs index 760178242..31743410e 100644 --- a/src/app/ApplicationTemplate.Presentation/ViewModels/Diagnostics/LoggersDiagnosticsViewModel.cs +++ b/src/app/ApplicationTemplate.Presentation/ViewModels/Diagnostics/LoggersDiagnosticsViewModel.cs @@ -1,4 +1,5 @@ using System; +using System.ComponentModel; using System.Reactive.Linq; using System.Threading; using System.Threading.Tasks; @@ -9,6 +10,7 @@ namespace ApplicationTemplate.Presentation; +[Bindable(true)] public class LoggersDiagnosticsViewModel : ViewModel { public LoggersDiagnosticsViewModel() @@ -83,7 +85,12 @@ await this.GetService().ShowMessage(ct, mb => mb private async Task OnConsoleLoggingChanged(CancellationToken ct, bool isEnabled) { - this.GetService>().LogInformation("{IsEnabled} console logging.", isEnabled ? "Enabling" : "Disabling"); + var logger = this.GetService>(); + + if (logger.IsEnabled(LogLevel.Information)) + { + logger.LogInformation("{IsEnabled} console logging.", isEnabled ? "Enabling" : "Disabling"); + } await this.GetService().ShowMessage(ct, mb => mb .Title("Diagnostics") @@ -94,7 +101,12 @@ await this.GetService().ShowMessage(ct, mb => mb private async Task OnFileLoggingChanged(CancellationToken ct, bool isEnabled) { - this.GetService>().LogInformation("{IsEnabled} file logging.", isEnabled ? "Enabling" : "Disabling"); + var logger = this.GetService>(); + + if (logger.IsEnabled(LogLevel.Information)) + { + logger.LogInformation("{IsEnabled} file logging.", isEnabled ? "Enabling" : "Disabling"); + } await this.GetService().ShowMessage(ct, mb => mb .Title("Diagnostics") diff --git a/src/app/ApplicationTemplate.Presentation/ViewModels/Diagnostics/Navigation/NavigationDebuggerViewModel.cs b/src/app/ApplicationTemplate.Presentation/ViewModels/Diagnostics/Navigation/NavigationDebuggerViewModel.cs index 00f85123f..726c951e7 100644 --- a/src/app/ApplicationTemplate.Presentation/ViewModels/Diagnostics/Navigation/NavigationDebuggerViewModel.cs +++ b/src/app/ApplicationTemplate.Presentation/ViewModels/Diagnostics/Navigation/NavigationDebuggerViewModel.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.ComponentModel; using System.Text; using ApplicationTemplate.DataAccess; using Chinook.DynamicMvvm; @@ -8,6 +9,7 @@ namespace ApplicationTemplate.Presentation; +[Bindable(true)] public sealed class NavigationDebuggerViewModel : TabViewModel { private readonly ISectionsNavigator _sectionsNavigator; diff --git a/src/app/ApplicationTemplate.Presentation/ViewModels/Diagnostics/NetworkDiagnosticsViewModel.cs b/src/app/ApplicationTemplate.Presentation/ViewModels/Diagnostics/NetworkDiagnosticsViewModel.cs index 11e6a3a8d..5bc826130 100644 --- a/src/app/ApplicationTemplate.Presentation/ViewModels/Diagnostics/NetworkDiagnosticsViewModel.cs +++ b/src/app/ApplicationTemplate.Presentation/ViewModels/Diagnostics/NetworkDiagnosticsViewModel.cs @@ -1,7 +1,9 @@ using System; +using System.ComponentModel; namespace ApplicationTemplate.Presentation; +[Bindable(true)] public class NetworkDiagnosticsViewModel : ViewModel { public NetworkDiagnosticsViewModel() diff --git a/src/app/ApplicationTemplate.Presentation/ViewModels/Diagnostics/SettingsDiagnosticsViewModel.cs b/src/app/ApplicationTemplate.Presentation/ViewModels/Diagnostics/SettingsDiagnosticsViewModel.cs index 16587ec1f..dbfff7c54 100644 --- a/src/app/ApplicationTemplate.Presentation/ViewModels/Diagnostics/SettingsDiagnosticsViewModel.cs +++ b/src/app/ApplicationTemplate.Presentation/ViewModels/Diagnostics/SettingsDiagnosticsViewModel.cs @@ -1,4 +1,5 @@ using System; +using System.ComponentModel; using System.Reactive.Concurrency; using System.Reactive.Linq; using System.Threading; @@ -10,6 +11,7 @@ namespace ApplicationTemplate.Presentation; +[Bindable(true)] public class SettingsDiagnosticsViewModel : ViewModel { public SettingsDiagnosticsViewModel() diff --git a/src/app/ApplicationTemplate.Presentation/ViewModels/Diagnostics/SummaryDiagnosticsViewModel.cs b/src/app/ApplicationTemplate.Presentation/ViewModels/Diagnostics/SummaryDiagnosticsViewModel.cs index f245f9369..4a470c391 100644 --- a/src/app/ApplicationTemplate.Presentation/ViewModels/Diagnostics/SummaryDiagnosticsViewModel.cs +++ b/src/app/ApplicationTemplate.Presentation/ViewModels/Diagnostics/SummaryDiagnosticsViewModel.cs @@ -1,7 +1,9 @@ -using Chinook.DynamicMvvm; +using System.ComponentModel; +using Chinook.DynamicMvvm; namespace ApplicationTemplate.Presentation; +[Bindable(true)] public sealed class SummaryDiagnosticsViewModel : ViewModel { public string Summary => this.Get(this.GetService().GetSummary); diff --git a/src/app/ApplicationTemplate.Presentation/ViewModels/ForcedUpdatePageViewModel.cs b/src/app/ApplicationTemplate.Presentation/ViewModels/ForcedUpdatePageViewModel.cs index 60f05a50d..c1562f4cc 100644 --- a/src/app/ApplicationTemplate.Presentation/ViewModels/ForcedUpdatePageViewModel.cs +++ b/src/app/ApplicationTemplate.Presentation/ViewModels/ForcedUpdatePageViewModel.cs @@ -1,4 +1,5 @@ -using ApplicationTemplate.DataAccess.PlatformServices; +using System.ComponentModel; +using ApplicationTemplate.DataAccess.PlatformServices; using Chinook.DynamicMvvm; namespace ApplicationTemplate.Presentation; @@ -6,6 +7,7 @@ namespace ApplicationTemplate.Presentation; /// /// The ViewModel for the forced update page. /// +[Bindable(true)] public sealed class ForcedUpdatePageViewModel : ViewModel { /// diff --git a/src/app/ApplicationTemplate.Presentation/ViewModels/KillSwitchPageViewModel.cs b/src/app/ApplicationTemplate.Presentation/ViewModels/KillSwitchPageViewModel.cs index 449e423c0..c1599f4b9 100644 --- a/src/app/ApplicationTemplate.Presentation/ViewModels/KillSwitchPageViewModel.cs +++ b/src/app/ApplicationTemplate.Presentation/ViewModels/KillSwitchPageViewModel.cs @@ -1,8 +1,11 @@ -namespace ApplicationTemplate.Presentation; +using System.ComponentModel; + +namespace ApplicationTemplate.Presentation; /// /// ViewModel for the kill switch page. /// +[Bindable(true)] public sealed class KillSwitchPageViewModel : ViewModel { } diff --git a/src/app/ApplicationTemplate.Presentation/ViewModels/MenuViewModel.cs b/src/app/ApplicationTemplate.Presentation/ViewModels/MenuViewModel.cs index b28177ed9..5025b8eff 100644 --- a/src/app/ApplicationTemplate.Presentation/ViewModels/MenuViewModel.cs +++ b/src/app/ApplicationTemplate.Presentation/ViewModels/MenuViewModel.cs @@ -1,4 +1,5 @@ using System; +using System.ComponentModel; using System.Linq; using System.Reactive.Concurrency; using System.Reactive.Linq; @@ -10,6 +11,7 @@ namespace ApplicationTemplate.Presentation; +[Bindable(true)] public sealed class MenuViewModel : ViewModel { public enum Section diff --git a/src/app/ApplicationTemplate.Presentation/ViewModels/Posts/EditPostPageViewModel.cs b/src/app/ApplicationTemplate.Presentation/ViewModels/Posts/EditPostPageViewModel.cs index 38dd6b65c..fa9f7076c 100644 --- a/src/app/ApplicationTemplate.Presentation/ViewModels/Posts/EditPostPageViewModel.cs +++ b/src/app/ApplicationTemplate.Presentation/ViewModels/Posts/EditPostPageViewModel.cs @@ -1,4 +1,5 @@ -using System.Threading; +using System.ComponentModel; +using System.Threading; using System.Threading.Tasks; using ApplicationTemplate.Business; using Chinook.DynamicMvvm; @@ -8,6 +9,7 @@ namespace ApplicationTemplate.Presentation; +[Bindable(true)] public class EditPostPageViewModel : ViewModel { public EditPostPageViewModel(Post post = null) diff --git a/src/app/ApplicationTemplate.Presentation/ViewModels/Posts/PostFormViewModel.cs b/src/app/ApplicationTemplate.Presentation/ViewModels/Posts/PostFormViewModel.cs index 8bd0df815..fe90abef2 100644 --- a/src/app/ApplicationTemplate.Presentation/ViewModels/Posts/PostFormViewModel.cs +++ b/src/app/ApplicationTemplate.Presentation/ViewModels/Posts/PostFormViewModel.cs @@ -1,10 +1,12 @@ using System; +using System.ComponentModel; using ApplicationTemplate.Business; using Chinook.DynamicMvvm; using FluentValidation; namespace ApplicationTemplate.Presentation; +[Bindable(true)] public class PostFormViewModel : ViewModel { private readonly Post _post; diff --git a/src/app/ApplicationTemplate.Presentation/ViewModels/Posts/PostItemViewModel.cs b/src/app/ApplicationTemplate.Presentation/ViewModels/Posts/PostItemViewModel.cs index e2729caea..948afb0aa 100644 --- a/src/app/ApplicationTemplate.Presentation/ViewModels/Posts/PostItemViewModel.cs +++ b/src/app/ApplicationTemplate.Presentation/ViewModels/Posts/PostItemViewModel.cs @@ -1,4 +1,5 @@ -using ApplicationTemplate.Business; +using System.ComponentModel; +using ApplicationTemplate.Business; using Chinook.DynamicMvvm; using Chinook.StackNavigation; @@ -7,6 +8,7 @@ namespace ApplicationTemplate.Presentation; /// /// Post item view model. /// +[Bindable(true)] public sealed class PostItemViewModel : ViewModel { /// diff --git a/src/app/ApplicationTemplate.Presentation/ViewModels/Posts/PostsPageViewModel.cs b/src/app/ApplicationTemplate.Presentation/ViewModels/Posts/PostsPageViewModel.cs index 8737e62d9..08edab1a2 100644 --- a/src/app/ApplicationTemplate.Presentation/ViewModels/Posts/PostsPageViewModel.cs +++ b/src/app/ApplicationTemplate.Presentation/ViewModels/Posts/PostsPageViewModel.cs @@ -1,4 +1,5 @@ using System.Collections.Immutable; +using System.ComponentModel; using System.Diagnostics.CodeAnalysis; using System.Globalization; using System.Linq; @@ -11,6 +12,7 @@ namespace ApplicationTemplate.Presentation; +[Bindable(true)] public sealed class PostsPageViewModel : ViewModel { [SuppressMessage("Usage", "CA2213:Disposable fields should be disposed", Justification = "It will be disposed by the DataLoader when passed via WithTrigger.")] diff --git a/src/app/ApplicationTemplate.Presentation/ViewModels/Settings/EditProfileFormViewModel.cs b/src/app/ApplicationTemplate.Presentation/ViewModels/Settings/EditProfileFormViewModel.cs index caa2282df..1370b7bb7 100644 --- a/src/app/ApplicationTemplate.Presentation/ViewModels/Settings/EditProfileFormViewModel.cs +++ b/src/app/ApplicationTemplate.Presentation/ViewModels/Settings/EditProfileFormViewModel.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.ComponentModel; using System.Text; using ApplicationTemplate.Business; using Chinook.DynamicMvvm; @@ -7,6 +8,7 @@ namespace ApplicationTemplate.Presentation; +[Bindable(true)] public class EditProfileFormViewModel : ViewModel { private readonly UserProfile _userProfileData; diff --git a/src/app/ApplicationTemplate.Presentation/ViewModels/Settings/EditProfilePageViewModel.cs b/src/app/ApplicationTemplate.Presentation/ViewModels/Settings/EditProfilePageViewModel.cs index 721421f1d..fa1fed341 100644 --- a/src/app/ApplicationTemplate.Presentation/ViewModels/Settings/EditProfilePageViewModel.cs +++ b/src/app/ApplicationTemplate.Presentation/ViewModels/Settings/EditProfilePageViewModel.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.ComponentModel; using System.Text; using ApplicationTemplate.Business; using Chinook.DynamicMvvm; @@ -7,6 +8,7 @@ namespace ApplicationTemplate.Presentation; +[Bindable(true)] public class EditProfilePageViewModel : ViewModel { private readonly UserProfile _userProfile; diff --git a/src/app/ApplicationTemplate.Presentation/ViewModels/Settings/LicensesPageViewModel.cs b/src/app/ApplicationTemplate.Presentation/ViewModels/Settings/LicensesPageViewModel.cs index 1d94738e7..2eba8ec6d 100644 --- a/src/app/ApplicationTemplate.Presentation/ViewModels/Settings/LicensesPageViewModel.cs +++ b/src/app/ApplicationTemplate.Presentation/ViewModels/Settings/LicensesPageViewModel.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.ComponentModel; using System.IO; using System.Linq; using System.Text; @@ -9,6 +10,7 @@ namespace ApplicationTemplate.Presentation; +[Bindable(true)] public class LicensesPageViewModel : ViewModel { private const string LicensesFileName = "ThirdPartySoftwareLicenses.txt"; diff --git a/src/app/ApplicationTemplate.Presentation/ViewModels/Settings/SettingsPageViewModel.cs b/src/app/ApplicationTemplate.Presentation/ViewModels/Settings/SettingsPageViewModel.cs index cc2804271..b239114f9 100644 --- a/src/app/ApplicationTemplate.Presentation/ViewModels/Settings/SettingsPageViewModel.cs +++ b/src/app/ApplicationTemplate.Presentation/ViewModels/Settings/SettingsPageViewModel.cs @@ -1,4 +1,5 @@ using System; +using System.ComponentModel; using System.Reactive.Linq; using System.Threading; using System.Threading.Tasks; @@ -14,6 +15,7 @@ namespace ApplicationTemplate.Presentation; +[Bindable(true)] public sealed class SettingsPageViewModel : ViewModel { private readonly ILauncherService _browserService; diff --git a/src/app/ApplicationTemplate.Presentation/ViewModels/ShellViewModel.cs b/src/app/ApplicationTemplate.Presentation/ViewModels/ShellViewModel.cs index ce5797721..ebbe13842 100644 --- a/src/app/ApplicationTemplate.Presentation/ViewModels/ShellViewModel.cs +++ b/src/app/ApplicationTemplate.Presentation/ViewModels/ShellViewModel.cs @@ -1,7 +1,9 @@ -using Chinook.DynamicMvvm; +using System.ComponentModel; +using Chinook.DynamicMvvm; namespace ApplicationTemplate.Presentation; +[Bindable(true)] public class ShellViewModel : ViewModel { public DiagnosticsOverlayViewModel DiagnosticsOverlay => this.GetChild(); diff --git a/src/app/ApplicationTemplate.Presentation/ViewModels/Welcome/OnboardingItemViewModel.cs b/src/app/ApplicationTemplate.Presentation/ViewModels/Welcome/OnboardingItemViewModel.cs index d3863e947..3d3302158 100644 --- a/src/app/ApplicationTemplate.Presentation/ViewModels/Welcome/OnboardingItemViewModel.cs +++ b/src/app/ApplicationTemplate.Presentation/ViewModels/Welcome/OnboardingItemViewModel.cs @@ -1,7 +1,9 @@ using System; +using System.ComponentModel; namespace ApplicationTemplate.Presentation; +[Bindable(true)] public class OnboardingItemViewModel { public OnboardingItemViewModel(string primaryText, string imageUrl) diff --git a/src/app/ApplicationTemplate.Presentation/ViewModels/Welcome/OnboardingPageViewModel.cs b/src/app/ApplicationTemplate.Presentation/ViewModels/Welcome/OnboardingPageViewModel.cs index 45c1320e6..c5edffc95 100644 --- a/src/app/ApplicationTemplate.Presentation/ViewModels/Welcome/OnboardingPageViewModel.cs +++ b/src/app/ApplicationTemplate.Presentation/ViewModels/Welcome/OnboardingPageViewModel.cs @@ -1,4 +1,5 @@ using System; +using System.ComponentModel; using System.Threading; using System.Threading.Tasks; using ApplicationTemplate.DataAccess; @@ -9,6 +10,7 @@ namespace ApplicationTemplate.Presentation; +[Bindable(true)] public sealed class OnboardingPageViewModel : ViewModel { private bool _isFromSettingsPage = false; diff --git a/src/app/ApplicationTemplate.Presentation/ViewModels/Welcome/WelcomePageViewModel.cs b/src/app/ApplicationTemplate.Presentation/ViewModels/Welcome/WelcomePageViewModel.cs index 77f28416f..4ae139e55 100644 --- a/src/app/ApplicationTemplate.Presentation/ViewModels/Welcome/WelcomePageViewModel.cs +++ b/src/app/ApplicationTemplate.Presentation/ViewModels/Welcome/WelcomePageViewModel.cs @@ -1,9 +1,11 @@ -using Chinook.DynamicMvvm; +using System.ComponentModel; +using Chinook.DynamicMvvm; using Chinook.SectionsNavigation; using Chinook.StackNavigation; namespace ApplicationTemplate.Presentation; +[Bindable(true)] public sealed class WelcomePageViewModel : ViewModel { public IDynamicCommand NavigateToOnboarding => this.GetCommandFromTask(async ct => diff --git a/src/app/ApplicationTemplate.Shared.Views/Configuration/NavigationConfiguration.cs b/src/app/ApplicationTemplate.Shared.Views/Configuration/NavigationConfiguration.cs index 896bf404f..185349b28 100644 --- a/src/app/ApplicationTemplate.Shared.Views/Configuration/NavigationConfiguration.cs +++ b/src/app/ApplicationTemplate.Shared.Views/Configuration/NavigationConfiguration.cs @@ -16,10 +16,16 @@ public static class NavigationConfiguration public static IServiceCollection AddNavigation(this IServiceCollection services) { return services.AddSingleton(s => - new FrameSectionsNavigator( - App.Instance.NavigationMultiFrame, - GetPageRegistrations() - ) + { + var frameSectionNavigator = new FrameSectionsNavigator( + App.Instance.NavigationMultiFrame, + GetPageRegistrations() + ); + + DisableAnimations(frameSectionNavigator); + + return frameSectionNavigator; + } ); } @@ -47,7 +53,7 @@ public static IServiceCollection AddNavigation(this IServiceCollection services) }; /// - /// Disable navigation animations. + /// Disable navigation animations. This is necessary after the update to .NET 10 because navigation stops working on the iOS platform. /// /// /// Do not remove even if it's not used by default. diff --git a/src/app/ApplicationTemplate.Shared.Views/Controls/Validation/DataValidationState.cs b/src/app/ApplicationTemplate.Shared.Views/Controls/Validation/DataValidationState.cs index 2b0305a46..8bb5956dc 100644 --- a/src/app/ApplicationTemplate.Shared.Views/Controls/Validation/DataValidationState.cs +++ b/src/app/ApplicationTemplate.Shared.Views/Controls/Validation/DataValidationState.cs @@ -1,7 +1,9 @@ using System.Collections.Immutable; +using System.ComponentModel; namespace ApplicationTemplate; +[Bindable(true)] public sealed class DataValidationState { public DataValidationState(DataValidationStateType stateType, ImmutableList errors = null) diff --git a/src/app/ApplicationTemplate.Shared.Views/PlatformServices/Connectivity/ConnectivityProvider.cs b/src/app/ApplicationTemplate.Shared.Views/PlatformServices/Connectivity/ConnectivityProvider.cs index 14b8dee1c..bf927be37 100644 --- a/src/app/ApplicationTemplate.Shared.Views/PlatformServices/Connectivity/ConnectivityProvider.cs +++ b/src/app/ApplicationTemplate.Shared.Views/PlatformServices/Connectivity/ConnectivityProvider.cs @@ -87,6 +87,6 @@ private void UnsubscribeLocalEvent() private void OnNetworkStatusChanged(object sender) { - InnerConnectivityChanged.Invoke(this, new ConnectivityChangedEventArgs(State)); + InnerConnectivityChanged?.Invoke(this, new ConnectivityChangedEventArgs(State)); } } diff --git a/src/app/ApplicationTemplate.Tests.Api/ApiTestBase.cs b/src/app/ApplicationTemplate.Tests.Api/ApiTestBase.cs index 79e030fc9..c4c5dd1c4 100644 --- a/src/app/ApplicationTemplate.Tests.Api/ApiTestBase.cs +++ b/src/app/ApplicationTemplate.Tests.Api/ApiTestBase.cs @@ -15,6 +15,7 @@ protected ApiTestBase() _host = new HostBuilder() .AddConfiguration(string.Empty, new TestEnvironmentManager()) .ConfigureServices((context, s) => s + .AddSingleton(TimeProvider.System) .AddDiagnostics(context.Configuration) .AddMock(context.Configuration) .AddApi(context.Configuration) diff --git a/src/app/ApplicationTemplate.Tests.Api/ApplicationTemplate.Tests.Api.csproj b/src/app/ApplicationTemplate.Tests.Api/ApplicationTemplate.Tests.Api.csproj index 21279a392..4886a1f12 100644 --- a/src/app/ApplicationTemplate.Tests.Api/ApplicationTemplate.Tests.Api.csproj +++ b/src/app/ApplicationTemplate.Tests.Api/ApplicationTemplate.Tests.Api.csproj @@ -1,9 +1,9 @@  - net9.0 + net10.0 false True - 13.0 + 14.0 True @@ -13,7 +13,7 @@ all runtime; build; native; contentfiles; analyzers; buildtransitive - + all diff --git a/src/app/ApplicationTemplate.Tests.Functional/ApplicationTemplate.Tests.Functional.csproj b/src/app/ApplicationTemplate.Tests.Functional/ApplicationTemplate.Tests.Functional.csproj index ca22e921b..0e12508ae 100644 --- a/src/app/ApplicationTemplate.Tests.Functional/ApplicationTemplate.Tests.Functional.csproj +++ b/src/app/ApplicationTemplate.Tests.Functional/ApplicationTemplate.Tests.Functional.csproj @@ -1,9 +1,9 @@  - net9.0 + net10.0 false True - 13.0 + 14.0 True TESTS @@ -11,14 +11,14 @@ - + all runtime; build; native; contentfiles; analyzers; buildtransitive - + all diff --git a/src/app/ApplicationTemplate.Tests.Unit/ApplicationTemplate.Tests.Unit.csproj b/src/app/ApplicationTemplate.Tests.Unit/ApplicationTemplate.Tests.Unit.csproj index e92cd3f59..fa63e3f7f 100644 --- a/src/app/ApplicationTemplate.Tests.Unit/ApplicationTemplate.Tests.Unit.csproj +++ b/src/app/ApplicationTemplate.Tests.Unit/ApplicationTemplate.Tests.Unit.csproj @@ -1,23 +1,23 @@  - net9.0 + net10.0 false True - 13.0 + 14.0 True - + all runtime; build; native; contentfiles; analyzers; buildtransitive - + all diff --git a/src/app/ApplicationTemplate.Tests/ApplicationTemplate.Tests.csproj b/src/app/ApplicationTemplate.Tests/ApplicationTemplate.Tests.csproj index d0926b162..09b92c03d 100644 --- a/src/app/ApplicationTemplate.Tests/ApplicationTemplate.Tests.csproj +++ b/src/app/ApplicationTemplate.Tests/ApplicationTemplate.Tests.csproj @@ -1,9 +1,9 @@  - net9.0 + net10.0 - + diff --git a/src/app/ApplicationTemplate.Windows/ApplicationTemplate.Windows.csproj b/src/app/ApplicationTemplate.Windows/ApplicationTemplate.Windows.csproj index 70170e3d4..80dd2b66d 100644 --- a/src/app/ApplicationTemplate.Windows/ApplicationTemplate.Windows.csproj +++ b/src/app/ApplicationTemplate.Windows/ApplicationTemplate.Windows.csproj @@ -1,8 +1,8 @@  - 13.0 + 14.0 WinExe - net9.0-windows10.0.22621.0 + net10.0-windows10.0.22621.0 10.0.19041.0 10.0.20348.0 ApplicationTemplate @@ -68,27 +68,27 @@ - - - - + + + + - - - - - - - + + + + + + + - + - - - + + +