Skip to content

Commit

Permalink
Merge pull request #94 from IeuanWalker/master
Browse files Browse the repository at this point in the history
Fixes android accessibility handling
  • Loading branch information
LuckyDucko authored Nov 30, 2023
2 parents 6ab0275 + 567f29d commit a060c43
Show file tree
Hide file tree
Showing 2 changed files with 41 additions and 35 deletions.
14 changes: 6 additions & 8 deletions Mopups/Mopups.Maui/Pages/PopupPage.cs
Original file line number Diff line number Diff line change
@@ -1,11 +1,9 @@
using System.Windows.Input;

using AsyncAwaitBestPractices;

using AsyncAwaitBestPractices;
using Mopups.Animations;
using Mopups.Animations.Base;
using Mopups.Enums;
using Mopups.Services;
using System.Windows.Input;

namespace Mopups.Pages;

Expand Down Expand Up @@ -108,12 +106,12 @@ public object BackgroundClickedCommandParameter
set => SetValue(BackgroundClickedCommandParameterProperty, value);
}

public static readonly BindableProperty AndroidTalkbackAccessibilityWorkaroundProperty = BindableProperty.Create(nameof(AndroidTalkbackAccessibilityWorkaround), typeof(bool), typeof(PopupPage), false);
public static readonly BindableProperty DisableAndroidAccessibilityHandlingProperty = BindableProperty.Create(nameof(DisableAndroidAccessibilityHandling), typeof(bool), typeof(PopupPage), false);

public bool AndroidTalkbackAccessibilityWorkaround
public bool DisableAndroidAccessibilityHandling
{
get => (bool)GetValue(AndroidTalkbackAccessibilityWorkaroundProperty);
set => SetValue(AndroidTalkbackAccessibilityWorkaroundProperty, value);
get => (bool)GetValue(DisableAndroidAccessibilityHandlingProperty);
set => SetValue(DisableAndroidAccessibilityHandlingProperty, value);
}

public PopupPage()
Expand Down
62 changes: 35 additions & 27 deletions Mopups/Mopups.Maui/Platforms/Android/Impl/AndroidMopups.cs
Original file line number Diff line number Diff line change
Expand Up @@ -36,20 +36,13 @@ public static bool SendBackPressed(Action? backPressedHandler = null)

public Task AddAsync(PopupPage page)
{
try
{
HandleAccessibility(true);
HandleAccessibility(true, page.DisableAndroidAccessibilityHandling);

page.Parent = MauiApplication.Current.Application.Windows[0].Content as Element;
var AndroidNativeView = IPopupPlatform.GetOrCreateHandler<PopupPageHandler>(page).PlatformView as Android.Views.View;
DecoreView?.AddView(AndroidNativeView);
page.Parent = MauiApplication.Current.Application.Windows[0].Content as Element;
var AndroidNativeView = IPopupPlatform.GetOrCreateHandler<PopupPageHandler>(page).PlatformView as Android.Views.View;
DecoreView?.AddView(AndroidNativeView);

return PostAsync(AndroidNativeView);
}
catch (Exception)
{
throw;
}
return PostAsync(AndroidNativeView);
}

public Task RemoveAsync(PopupPage page)
Expand All @@ -58,7 +51,7 @@ public Task RemoveAsync(PopupPage page)

if (renderer != null)
{
HandleAccessibility(false);
HandleAccessibility(false, page.DisableAndroidAccessibilityHandling);

DecoreView?.RemoveView(renderer.PlatformView as Android.Views.View);
renderer.DisconnectHandler(); //?? no clue if works
Expand All @@ -70,35 +63,50 @@ public Task RemoveAsync(PopupPage page)
return Task.CompletedTask;
}

static void HandleAccessibility(bool showPopup)
//! important keeps reference to pages that accessibility has applied to. This is so accessibility can be removed properly when popup is removed. #https://github.com/LuckyDucko/Mopups/issues/93
readonly List<Android.Views.View?> views = new();
void HandleAccessibility(bool showPopup, bool disableAccessibilityHandling)
{
Page? mainPage = Application.Current?.MainPage;

if (mainPage is null)
if (disableAccessibilityHandling)
{
return;
}

int navCount = mainPage.Navigation.NavigationStack.Count;
int modalCount = mainPage.Navigation.ModalStack.Count;
if (showPopup)
{
Page? mainPage = Application.Current?.MainPage;

if (mainPage is null)
{
return;
}

views.Add(mainPage.Handler?.PlatformView as Android.Views.View);

ProcessView(showPopup, mainPage.Handler?.PlatformView as Android.Views.View);
int navCount = mainPage.Navigation.NavigationStack.Count;
int modalCount = mainPage.Navigation.ModalStack.Count;

if (navCount > 0)
{
ProcessView(showPopup, mainPage.Navigation?.NavigationStack[navCount - 1]?.Handler?.PlatformView as Android.Views.View);
if (navCount > 0)
{
views.Add(mainPage.Navigation?.NavigationStack[navCount - 1]?.Handler?.PlatformView as Android.Views.View);
}

if (modalCount > 0)
{
views.Add(mainPage.Navigation?.ModalStack[modalCount - 1]?.Handler?.PlatformView as Android.Views.View);
}
}

if (modalCount > 0)
foreach (var view in views)
{
ProcessView(showPopup, mainPage.Navigation?.ModalStack[modalCount - 1]?.Handler?.PlatformView as Android.Views.View);
ProcessView(showPopup, view);
}

static void ProcessView(bool showPopup, Android.Views.View? view)
{
if (view is null)
{
return;
return;
}

// Screen reader
Expand All @@ -110,7 +118,7 @@ static void ProcessView(bool showPopup, Android.Views.View? view)
}
}

Task<bool> PostAsync(Android.Views.View? nativeView)
static Task<bool> PostAsync(Android.Views.View? nativeView)
{
if (nativeView == null)
{
Expand Down

0 comments on commit a060c43

Please sign in to comment.