From 9e0202ca8888ad53b32ad9d82fd5f554d296f991 Mon Sep 17 00:00:00 2001 From: Shane Neuville Date: Fri, 22 Aug 2025 16:26:13 -0500 Subject: [PATCH 1/2] Remove AnnouncementHelper --- .../.template.config/template.json | 1 - .../src/templates/maui-mobile/MauiProgram.cs | 3 - .../PageModels/ManageMetaPageModel.cs | 12 ++-- .../PageModels/ProjectDetailPageModel.cs | 6 +- ...SemanticScreenReaderAsyncImplementation.cs | 62 ------------------- .../Services/AnnouncementHelper.cs | 25 -------- .../Services/IAsyncAnnouncement.cs | 6 -- 7 files changed, 9 insertions(+), 106 deletions(-) delete mode 100644 src/Templates/src/templates/maui-mobile/Platforms/iOS/SemanticScreenReaderAsyncImplementation.cs delete mode 100644 src/Templates/src/templates/maui-mobile/Services/AnnouncementHelper.cs delete mode 100644 src/Templates/src/templates/maui-mobile/Services/IAsyncAnnouncement.cs diff --git a/src/Templates/src/templates/maui-mobile/.template.config/template.json b/src/Templates/src/templates/maui-mobile/.template.config/template.json index 74c1c8604ed0..1848c8cb7b5b 100644 --- a/src/Templates/src/templates/maui-mobile/.template.config/template.json +++ b/src/Templates/src/templates/maui-mobile/.template.config/template.json @@ -74,7 +74,6 @@ "Services/**", "Resources/Styles/AppStyles.xaml", "Utilities/**", - "Platforms/iOS/SemanticScreenReaderAsyncImplementation.cs" ] }, { diff --git a/src/Templates/src/templates/maui-mobile/MauiProgram.cs b/src/Templates/src/templates/maui-mobile/MauiProgram.cs index 799e32ebd0ae..32ebbe27ed96 100644 --- a/src/Templates/src/templates/maui-mobile/MauiProgram.cs +++ b/src/Templates/src/templates/maui-mobile/MauiProgram.cs @@ -50,9 +50,6 @@ public static MauiApp CreateMauiApp() builder.Services.AddSingleton(); builder.Services.AddSingleton(); builder.Services.AddSingleton(); -#if IOS - builder.Services.AddSingleton(); -#endif builder.Services.AddTransientWithShellRoute("project"); builder.Services.AddTransientWithShellRoute("task"); diff --git a/src/Templates/src/templates/maui-mobile/PageModels/ManageMetaPageModel.cs b/src/Templates/src/templates/maui-mobile/PageModels/ManageMetaPageModel.cs index 8bbf668c2fe9..b009e3ef6228 100644 --- a/src/Templates/src/templates/maui-mobile/PageModels/ManageMetaPageModel.cs +++ b/src/Templates/src/templates/maui-mobile/PageModels/ManageMetaPageModel.cs @@ -47,7 +47,7 @@ private async Task SaveCategories() } await AppShell.DisplayToastAsync("Categories saved"); - await AnnouncementHelper.Announce("Categories saved"); + SemanticScreenReader.Announce("Categories saved"); } [RelayCommand] @@ -56,7 +56,7 @@ private async Task DeleteCategory(Category category) Categories.Remove(category); await _categoryRepository.DeleteItemAsync(category); await AppShell.DisplayToastAsync("Category deleted"); - await AnnouncementHelper.Announce("Category deleted"); + SemanticScreenReader.Announce("Category deleted"); } [RelayCommand] @@ -66,7 +66,7 @@ private async Task AddCategory() Categories.Add(category); await _categoryRepository.SaveItemAsync(category); await AppShell.DisplayToastAsync("Category added"); - await AnnouncementHelper.Announce("Category added"); + SemanticScreenReader.Announce("Category added"); } [RelayCommand] @@ -78,7 +78,7 @@ private async Task SaveTags() } await AppShell.DisplayToastAsync("Tags saved"); - await AnnouncementHelper.Announce("Tags saved"); + SemanticScreenReader.Announce("Tags saved"); } [RelayCommand] @@ -87,7 +87,7 @@ private async Task DeleteTag(Tag tag) Tags.Remove(tag); await _tagRepository.DeleteItemAsync(tag); await AppShell.DisplayToastAsync("Tag deleted"); - await AnnouncementHelper.Announce("Tags deleted"); + SemanticScreenReader.Announce("Tags deleted"); } [RelayCommand] @@ -97,7 +97,7 @@ private async Task AddTag() Tags.Add(tag); await _tagRepository.SaveItemAsync(tag); await AppShell.DisplayToastAsync("Tag added"); - await AnnouncementHelper.Announce("Tags added"); + SemanticScreenReader.Announce("Tags added"); } [RelayCommand] diff --git a/src/Templates/src/templates/maui-mobile/PageModels/ProjectDetailPageModel.cs b/src/Templates/src/templates/maui-mobile/PageModels/ProjectDetailPageModel.cs index fa3fd4d3b829..85e13668d53b 100644 --- a/src/Templates/src/templates/maui-mobile/PageModels/ProjectDetailPageModel.cs +++ b/src/Templates/src/templates/maui-mobile/PageModels/ProjectDetailPageModel.cs @@ -259,13 +259,13 @@ private async Task ToggleTag(Tag tag) { await _tagRepository.SaveItemAsync(tag, _project.ID); AllTags = new(AllTags); - await AnnouncementHelper.Announce($"{tag.Title} selected"); + SemanticScreenReader.Announce($"{tag.Title} selected"); } else { await _tagRepository.DeleteItemAsync(tag, _project.ID); AllTags = new(AllTags); - await AnnouncementHelper.Announce($"{tag.Title} unselected"); + SemanticScreenReader.Announce($"{tag.Title} unselected"); } } else @@ -277,7 +277,7 @@ private async Task ToggleTag(Tag tag) [RelayCommand] private async Task IconSelected(IconData icon) { - await AnnouncementHelper.Announce($"{icon.Description} selected"); + SemanticScreenReader.Announce($"{icon.Description} selected"); } [RelayCommand] diff --git a/src/Templates/src/templates/maui-mobile/Platforms/iOS/SemanticScreenReaderAsyncImplementation.cs b/src/Templates/src/templates/maui-mobile/Platforms/iOS/SemanticScreenReaderAsyncImplementation.cs deleted file mode 100644 index af7da484744c..000000000000 --- a/src/Templates/src/templates/maui-mobile/Platforms/iOS/SemanticScreenReaderAsyncImplementation.cs +++ /dev/null @@ -1,62 +0,0 @@ -using Foundation; -using UIKit; - -[assembly: Dependency(typeof(MauiApp1.SemanticScreenReaderAsyncImplementation))] -namespace MauiApp1; - -public class SemanticScreenReaderAsyncImplementation : IAsyncAnnouncement -{ - static NSObject? Token; - private TaskCompletionSource? announcementCompletionSource; - - public void AddNotification() - { - if (Token != null) - return; - - Token = NSNotificationCenter.DefaultCenter.AddObserver( - new NSString("UIAccessibilityAnnouncementDidFinishNotification"), - AnnouncementDidFinish); - } - - public void RemoveNotification() - { - if (Token == null) - return; - - NSNotificationCenter.DefaultCenter.RemoveObserver(Token); - Token = null; - announcementCompletionSource = null; - } - - private void AnnouncementDidFinish(NSNotification notification) - { - announcementCompletionSource?.TrySetResult(true); - } - - public void Announce(string text) - { - if (!UIAccessibility.IsVoiceOverRunning) - return; - - UIAccessibility.PostNotification(UIAccessibilityPostNotification.Announcement, new NSString(text)); - } - - public async Task AnnounceAsync(string text) - { - AddNotification(); - - if (!UIAccessibility.IsVoiceOverRunning) - return; - - announcementCompletionSource = new TaskCompletionSource(); - - await Task.Delay(100); - UIAccessibility.PostNotification(UIAccessibilityPostNotification.Announcement, new NSString(text)); - - // Wait until the announcement is finished - await announcementCompletionSource.Task; - - RemoveNotification(); - } -} diff --git a/src/Templates/src/templates/maui-mobile/Services/AnnouncementHelper.cs b/src/Templates/src/templates/maui-mobile/Services/AnnouncementHelper.cs deleted file mode 100644 index cd73eae800b0..000000000000 --- a/src/Templates/src/templates/maui-mobile/Services/AnnouncementHelper.cs +++ /dev/null @@ -1,25 +0,0 @@ -namespace MauiApp._1.Services; - -public static class AnnouncementHelper -{ -#pragma warning disable CS1998 // Async method lacks 'await' operators and will run synchronously - public static async Task Announce(string recipeName) - { -#if IOS - var _serviceProvider = IPlatformApplication.Current?.Services; - var _semanticScreenReader = _serviceProvider?.GetService(); - if (_semanticScreenReader is not null) - { - await _semanticScreenReader.AnnounceAsync(recipeName); - } - else - { - SemanticScreenReader.Announce(recipeName); - } -#else - SemanticScreenReader.Announce(recipeName); -#endif - } -#pragma warning restore CS1998 // Async method lacks 'await' operators and will run synchronously - -} diff --git a/src/Templates/src/templates/maui-mobile/Services/IAsyncAnnouncement.cs b/src/Templates/src/templates/maui-mobile/Services/IAsyncAnnouncement.cs deleted file mode 100644 index 652ee3d5a60b..000000000000 --- a/src/Templates/src/templates/maui-mobile/Services/IAsyncAnnouncement.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace MauiApp._1.Services; - -public interface IAsyncAnnouncement -{ - Task AnnounceAsync(string text); -} From 26ac3341fb14bd3df5d33ce2114d2f1377c2fc70 Mon Sep 17 00:00:00 2001 From: Shane Neuville Date: Fri, 22 Aug 2025 16:30:46 -0500 Subject: [PATCH 2/2] - fix async --- .../templates/maui-mobile/PageModels/ProjectDetailPageModel.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Templates/src/templates/maui-mobile/PageModels/ProjectDetailPageModel.cs b/src/Templates/src/templates/maui-mobile/PageModels/ProjectDetailPageModel.cs index 85e13668d53b..0d51bd25204a 100644 --- a/src/Templates/src/templates/maui-mobile/PageModels/ProjectDetailPageModel.cs +++ b/src/Templates/src/templates/maui-mobile/PageModels/ProjectDetailPageModel.cs @@ -275,7 +275,7 @@ private async Task ToggleTag(Tag tag) } [RelayCommand] - private async Task IconSelected(IconData icon) + private void IconSelected(IconData icon) { SemanticScreenReader.Announce($"{icon.Description} selected"); }