From 08b4a8f17a58b97f6d52e0bfc6115d077f469380 Mon Sep 17 00:00:00 2001 From: ahall Date: Sat, 11 Jul 2026 12:15:23 +0100 Subject: [PATCH 1/2] fix: opencode-issue for docs validation --- .opencode/commands/issue.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.opencode/commands/issue.md b/.opencode/commands/issue.md index ffdb70a..a1d47de 100644 --- a/.opencode/commands/issue.md +++ b/.opencode/commands/issue.md @@ -128,8 +128,9 @@ If that value is blank, stop and ask the user for an issue number before doing a - For library/test changes (`src/**`, `tests/**`), trigger `build-library.yml`. - For sample changes (`samples/**`), trigger `build-samples.yml`. - For template changes (`templates/**`), trigger `build-template.yml`. + - For docs changes (`docs/**`, `mkdocs.yml`, `mkdocs.shared.yml`, `mkdocs.production.yml`), trigger `build-docs.yml`. - Do **not** dispatch `build-docs.yml`. Its `deploy` job has no branch guard, so any `workflow_dispatch` — including from a feature branch — publishes straight to the live GitHub Pages site. + `build-docs.yml`'s `deploy` job only runs for a `release` event, or for `workflow_dispatch` when `github.ref` starts with `refs/tags/`. Dispatching it with `--ref issues/$1` (a branch ref, not a tag) only runs its `build`/`validate` jobs — it is safe to dispatch from a feature branch and will never publish to the live GitHub Pages site. Do not pass a tag ref to `--ref` when dispatching `build-docs.yml` for pre-PR validation. If none of the changed paths match any of the above, state that no CI workflow applies and continue with local test results only. From 02cb14e4579d8e7c652c1e6f2f278dfe4fd2018b Mon Sep 17 00:00:00 2001 From: ahall Date: Sat, 11 Jul 2026 12:34:02 +0100 Subject: [PATCH 2/2] feat: bump TodoApp.Avalonia sample from Avalonia 11 to 12 (12.1.0) Bumps the shared AvaloniaVersion property (Directory.Build.props) from 11.3.18 to 12.1.0 and updates the sample for Avalonia 12's breaking changes: - Avalonia.Diagnostics package removed in v12: drop the Debug-only PackageReference from TodoApp.Avalonia and TodoApp.Avalonia.Desktop (no AttachDevTools() call exists in the sample). - Binding plugins removed in v12: drop the BindingPlugins.DataValidators.RemoveAt(0) call and its Avalonia.Data.Core* usings from App.axaml.cs; behavior is preserved since v12 disables the data-annotations validation plugin by default. - Android now implements IActivityApplicationLifetime instead of ISingleViewApplicationLifetime: add a MainViewFactory branch before the existing ISingleViewApplicationLifetime check (still required for iOS/browser/embedded Linux) in App.axaml.cs. - Android app initialization reworked: add TodoApp.Avalonia.Android/Application.cs (AvaloniaAndroidApplication with the [Application] attribute, hosting the CustomizeAppBuilder override moved from MainActivity), change MainActivity to the non-generic AvaloniaMainActivity (CreateAppBuilder/CustomizeAppBuilder were removed from the generic base class), and wire up android:name=".Application" in AndroidManifest.xml. - Rename TextBox.Watermark to the non-obsolete PlaceholderText in MainView.axaml. - Drop the now-stale BindingPlugins.DataValidators mention from the SuppressTrimAnalysisWarnings comment in the Android/iOS csproj files (EF Core's DbContext(DbContextOptions) ctor remains the relevant trim-analyzer noise source). The TodoApp.Avalonia.iOS AppDelegate requires no changes: its CustomizeAppBuilder override was not removed for iOS in Avalonia 12. Verified locally: dotnet build succeeds (Debug and Release) for the shared TodoApp.Avalonia and TodoApp.Avalonia.Desktop projects. The Android and iOS heads require their respective mobile workloads, which are validated via the build-samples.yml CI workflow rather than locally. Fixes #507 --- .../TodoApp.Avalonia/Directory.Build.props | 7 +++--- .../TodoApp.Avalonia.Android/Application.cs | 23 +++++++++++++++++++ .../TodoApp.Avalonia.Android/MainActivity.cs | 8 +------ .../Properties/AndroidManifest.xml | 2 +- .../TodoApp.Avalonia.Android.csproj | 6 ++--- .../TodoApp.Avalonia.Desktop.csproj | 2 -- .../TodoApp.Avalonia.iOS.csproj | 6 ++--- .../TodoApp.Avalonia/App.axaml.cs | 13 ++++++----- .../TodoApp.Avalonia/TodoApp.Avalonia.csproj | 2 -- .../TodoApp.Avalonia/Views/MainView.axaml | 2 +- 10 files changed, 43 insertions(+), 28 deletions(-) create mode 100644 samples/todoapp/TodoApp.Avalonia/TodoApp.Avalonia.Android/Application.cs diff --git a/samples/todoapp/TodoApp.Avalonia/Directory.Build.props b/samples/todoapp/TodoApp.Avalonia/Directory.Build.props index 5732b26..3c58333 100644 --- a/samples/todoapp/TodoApp.Avalonia/Directory.Build.props +++ b/samples/todoapp/TodoApp.Avalonia/Directory.Build.props @@ -2,8 +2,9 @@ enable - - 11.3.18 + + 12.1.0 diff --git a/samples/todoapp/TodoApp.Avalonia/TodoApp.Avalonia.Android/Application.cs b/samples/todoapp/TodoApp.Avalonia/TodoApp.Avalonia.Android/Application.cs new file mode 100644 index 0000000..3b70f4d --- /dev/null +++ b/samples/todoapp/TodoApp.Avalonia/TodoApp.Avalonia.Android/Application.cs @@ -0,0 +1,23 @@ +using Android.App; +using Android.Runtime; +using Avalonia; +using Avalonia.Android; + +namespace TodoApp.Avalonia.Android; + +// Avalonia 12 changed Android app initialization so that CreateAppBuilder()/CustomizeAppBuilder() +// are handled by an AvaloniaAndroidApplication subclass instead of AvaloniaMainActivity. +// See https://docs.avaloniaui.net/docs/avalonia12-breaking-changes#android. +[Application] +public class Application : AvaloniaAndroidApplication +{ + protected Application(nint javaReference, JniHandleOwnership transfer) : base(javaReference, transfer) + { + } + + protected override AppBuilder CustomizeAppBuilder(AppBuilder builder) + { + return base.CustomizeAppBuilder(builder) + .WithInterFont(); + } +} diff --git a/samples/todoapp/TodoApp.Avalonia/TodoApp.Avalonia.Android/MainActivity.cs b/samples/todoapp/TodoApp.Avalonia/TodoApp.Avalonia.Android/MainActivity.cs index 5ad2643..d2cb490 100644 --- a/samples/todoapp/TodoApp.Avalonia/TodoApp.Avalonia.Android/MainActivity.cs +++ b/samples/todoapp/TodoApp.Avalonia/TodoApp.Avalonia.Android/MainActivity.cs @@ -1,6 +1,5 @@ using Android.App; using Android.Content.PM; -using Avalonia; using Avalonia.Android; namespace TodoApp.Avalonia.Android; @@ -11,11 +10,6 @@ namespace TodoApp.Avalonia.Android; Icon = "@drawable/icon", MainLauncher = true, ConfigurationChanges = ConfigChanges.Orientation | ConfigChanges.ScreenSize | ConfigChanges.UiMode)] -public class MainActivity : AvaloniaMainActivity +public class MainActivity : AvaloniaMainActivity { - protected override AppBuilder CustomizeAppBuilder(AppBuilder builder) - { - return base.CustomizeAppBuilder(builder) - .WithInterFont(); - } } \ No newline at end of file diff --git a/samples/todoapp/TodoApp.Avalonia/TodoApp.Avalonia.Android/Properties/AndroidManifest.xml b/samples/todoapp/TodoApp.Avalonia/TodoApp.Avalonia.Android/Properties/AndroidManifest.xml index 7d86d68..b7a8b08 100644 --- a/samples/todoapp/TodoApp.Avalonia/TodoApp.Avalonia.Android/Properties/AndroidManifest.xml +++ b/samples/todoapp/TodoApp.Avalonia/TodoApp.Avalonia.Android/Properties/AndroidManifest.xml @@ -1,5 +1,5 @@  - + diff --git a/samples/todoapp/TodoApp.Avalonia/TodoApp.Avalonia.Android/TodoApp.Avalonia.Android.csproj b/samples/todoapp/TodoApp.Avalonia/TodoApp.Avalonia.Android/TodoApp.Avalonia.Android.csproj index 1012992..41f42f7 100644 --- a/samples/todoapp/TodoApp.Avalonia/TodoApp.Avalonia.Android/TodoApp.Avalonia.Android.csproj +++ b/samples/todoapp/TodoApp.Avalonia/TodoApp.Avalonia.Android/TodoApp.Avalonia.Android.csproj @@ -15,9 +15,9 @@ `dotnet build` (not just `dotnet publish`) by SDK default. This CI pipeline only ever runs `dotnet build` (see build-samples-todoapp-avalonia.yml) - it never publishes with PublishTrimmed, so no actual IL trimming/linking happens here; the analyzer is purely - diagnostic noise on framework APIs (Avalonia's BindingPlugins.DataValidators, EF Core's - DbContext(DbContextOptions) ctor) that their own maintainers have marked - [RequiresUnreferencedCode]. Setting this also sets EnableTrimAnalyzer=false (see + diagnostic noise on framework APIs (e.g. EF Core's DbContext(DbContextOptions) ctor) + that their own maintainers have marked [RequiresUnreferencedCode]. Setting this also + sets EnableTrimAnalyzer=false (see Microsoft.NET.ILLink.targets), which disables the analyzer pass itself, not just its warning output. See https://github.com/CommunityToolkit/Datasync/issues/521. --> diff --git a/samples/todoapp/TodoApp.Avalonia/TodoApp.Avalonia.Desktop/TodoApp.Avalonia.Desktop.csproj b/samples/todoapp/TodoApp.Avalonia/TodoApp.Avalonia.Desktop/TodoApp.Avalonia.Desktop.csproj index 719c5fb..a5ed319 100644 --- a/samples/todoapp/TodoApp.Avalonia/TodoApp.Avalonia.Desktop/TodoApp.Avalonia.Desktop.csproj +++ b/samples/todoapp/TodoApp.Avalonia/TodoApp.Avalonia.Desktop/TodoApp.Avalonia.Desktop.csproj @@ -14,8 +14,6 @@ - - diff --git a/samples/todoapp/TodoApp.Avalonia/TodoApp.Avalonia.iOS/TodoApp.Avalonia.iOS.csproj b/samples/todoapp/TodoApp.Avalonia/TodoApp.Avalonia.iOS/TodoApp.Avalonia.iOS.csproj index 24c2d93..94f5ae7 100644 --- a/samples/todoapp/TodoApp.Avalonia/TodoApp.Avalonia.iOS/TodoApp.Avalonia.iOS.csproj +++ b/samples/todoapp/TodoApp.Avalonia/TodoApp.Avalonia.iOS/TodoApp.Avalonia.iOS.csproj @@ -10,9 +10,9 @@ because iOS app projects are marked trimmable by the SDK by default. This CI pipeline only ever runs `dotnet build` (see build-samples-todoapp-avalonia.yml) - it never publishes with PublishTrimmed, so no actual IL trimming/linking happens here; the analyzer is purely - diagnostic noise on framework APIs (Avalonia's BindingPlugins.DataValidators, EF Core's - DbContext(DbContextOptions) ctor) that their own maintainers have marked - [RequiresUnreferencedCode]. Setting this also sets EnableTrimAnalyzer=false (see + diagnostic noise on framework APIs (e.g. EF Core's DbContext(DbContextOptions) ctor) + that their own maintainers have marked [RequiresUnreferencedCode]. Setting this also + sets EnableTrimAnalyzer=false (see Microsoft.NET.ILLink.targets), which disables the analyzer pass itself, not just its warning output. See https://github.com/CommunityToolkit/Datasync/issues/521. --> diff --git a/samples/todoapp/TodoApp.Avalonia/TodoApp.Avalonia/App.axaml.cs b/samples/todoapp/TodoApp.Avalonia/TodoApp.Avalonia/App.axaml.cs index b3444e8..c9f33c4 100644 --- a/samples/todoapp/TodoApp.Avalonia/TodoApp.Avalonia/App.axaml.cs +++ b/samples/todoapp/TodoApp.Avalonia/TodoApp.Avalonia/App.axaml.cs @@ -2,8 +2,6 @@ using System.IO; using Avalonia; using Avalonia.Controls.ApplicationLifetimes; -using Avalonia.Data.Core; -using Avalonia.Data.Core.Plugins; using Avalonia.Markup.Xaml; using Avalonia.Threading; using Microsoft.Data.Sqlite; @@ -52,16 +50,19 @@ public override void Initialize() /// public override void OnFrameworkInitializationCompleted() { - // Line below is needed to remove Avalonia data validation. - // Without this line you will get duplicate validations from both Avalonia and CT - BindingPlugins.DataValidators.RemoveAt(0); - if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop) { desktop.MainWindow = new MainWindow { DataContext = GetRequiredService() }; } + else if (ApplicationLifetime is IActivityApplicationLifetime activityLifetime) + { + // Android now uses IActivityApplicationLifetime instead of ISingleViewApplicationLifetime. + // See https://docs.avaloniaui.net/docs/avalonia12-breaking-changes#android. + activityLifetime.MainViewFactory = () => new MainView { DataContext = GetRequiredService() }; + } else if (ApplicationLifetime is ISingleViewApplicationLifetime singleViewPlatform) { + // ISingleViewApplicationLifetime is still used by iOS, browser, and embedded Linux platforms. singleViewPlatform.MainView = new MainView { DataContext = GetRequiredService() }; } diff --git a/samples/todoapp/TodoApp.Avalonia/TodoApp.Avalonia/TodoApp.Avalonia.csproj b/samples/todoapp/TodoApp.Avalonia/TodoApp.Avalonia/TodoApp.Avalonia.csproj index 93253b0..3610583 100644 --- a/samples/todoapp/TodoApp.Avalonia/TodoApp.Avalonia/TodoApp.Avalonia.csproj +++ b/samples/todoapp/TodoApp.Avalonia/TodoApp.Avalonia/TodoApp.Avalonia.csproj @@ -14,8 +14,6 @@ - - diff --git a/samples/todoapp/TodoApp.Avalonia/TodoApp.Avalonia/Views/MainView.axaml b/samples/todoapp/TodoApp.Avalonia/TodoApp.Avalonia/Views/MainView.axaml index 86ffb4c..65426cd 100644 --- a/samples/todoapp/TodoApp.Avalonia/TodoApp.Avalonia/Views/MainView.axaml +++ b/samples/todoapp/TodoApp.Avalonia/TodoApp.Avalonia/Views/MainView.axaml @@ -62,7 +62,7 @@ + PlaceholderText="Add a new Item">