Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Semantics and some structure changes #635

Merged
merged 50 commits into from Apr 6, 2021
Merged
Show file tree
Hide file tree
Changes from 37 commits
Commits
Show all changes
50 commits
Select commit Hold shift + click to select a range
8930868
Initial Semantics accessibility APIs
rachelkang Mar 26, 2021
8ecb2bb
Test run and try to debug
rachelkang Mar 29, 2021
bd0ead6
Initial Semantics accessibility APIs
rachelkang Mar 26, 2021
48ef14a
Test run and try to debug
rachelkang Mar 29, 2021
80e234d
Merge branch 'semantics' of github.com:dotnet/maui into semantics
rachelkang Mar 29, 2021
01a52bb
Implement semantics in stubs
rachelkang Mar 31, 2021
fa169a8
Initial Semantics accessibility APIs
rachelkang Mar 26, 2021
96e109c
Test run and try to debug
rachelkang Mar 29, 2021
d50782e
Implement semantics in stubs
rachelkang Mar 31, 2021
f9f4b89
Change to hint to use AccessibilityDelegate and node info; add initia…
rachelkang Mar 31, 2021
f20ab5f
Fix merge conflicts
rachelkang Mar 31, 2021
6e0e885
Fix outstanding merge conflicts
rachelkang Mar 31, 2021
080e732
- fix up VE
PureWeen Mar 31, 2021
8346034
Fix merge conflicts
rachelkang Mar 31, 2021
53d4492
remove unused usings
rachelkang Mar 31, 2021
2393d39
- move delegate to new type
PureWeen Apr 1, 2021
f49d34b
- compat
PureWeen Apr 1, 2021
c7d5c26
- check for delegate
PureWeen Apr 1, 2021
6c21e42
- make view handler a base class?
PureWeen Apr 1, 2021
b892939
- rename handler
PureWeen Apr 1, 2021
0eff1a7
- ViewHandler
PureWeen Apr 1, 2021
8dfea60
- Change is coming through my shadow
PureWeen Apr 2, 2021
5264203
- change object to Native type
PureWeen Apr 2, 2021
f547e43
- fix up semantics
PureWeen Apr 2, 2021
138cc90
- add tests
PureWeen Apr 2, 2021
ddf73dc
- fix gallery
PureWeen Apr 2, 2021
d5b4eaa
Merge branch 'main' into semantics
PureWeen Apr 3, 2021
c359588
- rename winui
PureWeen Apr 3, 2021
0afd7c7
- cleanup
PureWeen Apr 3, 2021
0d1dc2a
- fix winui
PureWeen Apr 3, 2021
b6aae45
- fix gallery
PureWeen Apr 3, 2021
a9b375e
- fix up connect handler
PureWeen Apr 4, 2021
bdd6f3a
- fix android
PureWeen Apr 4, 2021
7cf0ed2
- simplify
PureWeen Apr 4, 2021
c27fad7
- fix disconnect call
PureWeen Apr 5, 2021
939c82c
- clean up
PureWeen Apr 5, 2021
5e13b4b
Merge branch 'main' into semantics
PureWeen Apr 5, 2021
8d68f2f
Merge branch 'main' into semantics
PureWeen Apr 5, 2021
70cc2a0
- fix merge
PureWeen Apr 5, 2021
97c1037
Merge branch 'main' into semantics
Redth Apr 6, 2021
5f210be
Merge branch 'main' into semantics
PureWeen Apr 6, 2021
dc58b78
- fix merge conflicts
PureWeen Apr 6, 2021
52e24d4
- cleanup
PureWeen Apr 6, 2021
f350dca
- add heading level to attached property
PureWeen Apr 6, 2021
60cc690
- add tests
PureWeen Apr 6, 2021
c9c6e5b
- fix typos
PureWeen Apr 6, 2021
8997a6b
- fix CG
PureWeen Apr 6, 2021
f065b74
Merge remote-tracking branch 'origin/main' into semantics
mattleibow Apr 6, 2021
cb2b12f
Merge remote-tracking branch 'origin/main' into semantics
mattleibow Apr 6, 2021
3852493
Conflictos
mattleibow Apr 6, 2021
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
Expand Up @@ -59,8 +59,7 @@ protected override void OnCreate(Bundle bundle)
Handlers.ViewHandler
.ViewMapper[nameof(IView.AutomationId)] = (h, v) =>
{
(h.NativeView as global::Android.Views.View).ContentDescription =
v.AutomationId;
h.NativeView.ContentDescription = v.AutomationId;
};
#endif

Expand Down
4 changes: 2 additions & 2 deletions src/Compatibility/Core/src/Android/RendererToHandlerShim.cs
@@ -1,13 +1,13 @@
using System;
using Android.Views;
using Microsoft.Maui.Controls.Compatibility.Platform.Android;
using AbstractViewHandler = Microsoft.Maui.Handlers.AbstractViewHandler<Microsoft.Maui.IView, Android.Views.View>;
using ViewHandler = Microsoft.Maui.Handlers.ViewHandler<Microsoft.Maui.IView, Android.Views.View>;
using IVisualElementRenderer = Microsoft.Maui.Controls.Compatibility.Platform.Android.IVisualElementRenderer;
using VisualElementChangedEventArgs = Microsoft.Maui.Controls.Compatibility.Platform.Android.VisualElementChangedEventArgs;

namespace Microsoft.Maui.Controls.Compatibility
{
public class RendererToHandlerShim : AbstractViewHandler
public class RendererToHandlerShim : ViewHandler
{
internal IVisualElementRenderer VisualElementRenderer { get; private set; }

Expand Down
4 changes: 2 additions & 2 deletions src/Compatibility/Core/src/Windows/RendererToHandlerShim.cs
@@ -1,12 +1,12 @@
using System;
using AbstractViewHandler = Microsoft.Maui.Handlers.AbstractViewHandler<Microsoft.Maui.IView, Microsoft.UI.Xaml.FrameworkElement>;
using ViewHandler = Microsoft.Maui.Handlers.ViewHandler<Microsoft.Maui.IView, Microsoft.UI.Xaml.FrameworkElement>;
using Microsoft.Maui.Handlers;
using Microsoft.Maui.Controls.Compatibility.Platform.UWP;
using Microsoft.UI.Xaml;

namespace Microsoft.Maui.Controls.Compatibility
{
public class RendererToHandlerShim : AbstractViewHandler
public class RendererToHandlerShim : ViewHandler
{
internal IVisualElementRenderer VisualElementRenderer { get; private set; }

Expand Down
6 changes: 3 additions & 3 deletions src/Compatibility/Core/src/iOS/RendererToHandlerShim.cs
@@ -1,12 +1,12 @@
using System;
using AbstractViewHandler = Microsoft.Maui.Handlers.AbstractViewHandler<Microsoft.Maui.IView, UIKit.UIView>;
using ViewHandler = Microsoft.Maui.Handlers.ViewHandler<Microsoft.Maui.IView, UIKit.UIView>;
using UIKit;
using Microsoft.Maui.Controls.Compatibility.Platform.iOS;
using Microsoft.Maui.Handlers;

namespace Microsoft.Maui.Controls.Compatibility
{
public class RendererToHandlerShim : AbstractViewHandler
public class RendererToHandlerShim : ViewHandler
{
internal IVisualElementRenderer VisualElementRenderer { get; private set; }

Expand All @@ -21,7 +21,7 @@ public static IViewHandler CreateShim(object renderer)
return new RendererToHandlerShim();
}

public RendererToHandlerShim() : base(ViewHandler.ViewMapper)
public RendererToHandlerShim() : base(Handlers.ViewHandler.ViewMapper)
{
}

Expand Down
3 changes: 3 additions & 0 deletions src/Controls/samples/Controls.Sample/Pages/MainPage.cs
Expand Up @@ -41,6 +41,9 @@ void SetupMauiLayout()
var label = new Label { Text = "End-aligned text", BackgroundColor = Color.Fuchsia, HorizontalTextAlignment = TextAlignment.End };
label.Margin = new Thickness(15, 10, 20, 15);

SemanticProperties.SetHint(label, "Hint Text");
SemanticProperties.SetDescription(label, "Description Text");

verticalStack.Add(label);
verticalStack.Add(new Label { Text = "This should be BIG text!", FontSize = 24, HorizontalOptions = LayoutOptions.End });
verticalStack.Add(new Label { Text = "This should be BOLD text!", FontAttributes = FontAttributes.Bold, HorizontalOptions = LayoutOptions.Center });
Expand Down
3 changes: 2 additions & 1 deletion src/Controls/samples/Controls.Sample/Pages/XamlPage.xaml
Expand Up @@ -4,7 +4,8 @@
x:Class="Maui.Controls.Sample.Pages.XamlPage">

<StackLayout>
<Label Text="Welcome to Microsoft MAUI!"
<Label
Text="Welcome to Microsoft MAUI!"
VerticalOptions="CenterAndExpand"
HorizontalOptions="CenterAndExpand" />
</StackLayout>
Expand Down
12 changes: 12 additions & 0 deletions src/Controls/src/Core/HandlerImpl/VisualElement.Impl.cs
Expand Up @@ -125,5 +125,17 @@ protected virtual Size MeasureOverride(double widthConstraint, double heightCons
Maui.FlowDirection IFrameworkElement.FlowDirection => FlowDirection.ToPlatformFlowDirection();
Primitives.LayoutAlignment IFrameworkElement.HorizontalLayoutAlignment => default;
Primitives.LayoutAlignment IFrameworkElement.VerticalLayoutAlignment => default;

Maui.Semantics _semantics;
Maui.Semantics IFrameworkElement.Semantics
{
get => _semantics;
}

internal Semantics SetupSemantics()
{
_semantics = _semantics ?? new Semantics();
return _semantics;
}
}
}
56 changes: 56 additions & 0 deletions src/Controls/src/Core/SemanticProperties.cs
@@ -0,0 +1,56 @@
using System;

namespace Microsoft.Maui.Controls
{
public class SemanticProperties
{
public static readonly BindableProperty DescriptionProperty = BindableProperty.CreateAttached("Description", typeof(string), typeof(SemanticProperties), default(string), propertyChanged : OnHintPropertyChanged);

public static readonly BindableProperty HintProperty = BindableProperty.CreateAttached("Hint", typeof(string), typeof(SemanticProperties), default(string), propertyChanged: OnDescriptionPropertyChanged);

static void OnDescriptionPropertyChanged(BindableObject bindable, object oldValue, object newValue)
{
SetupSemanticsProperty(bindable)
.Description = SemanticProperties.GetHint(bindable);

UpdateSemanticsProperty(bindable);
}

static void OnHintPropertyChanged(BindableObject bindable, object oldValue, object newValue)
{
SetupSemanticsProperty(bindable)
.Hint = SemanticProperties.GetHint(bindable);

UpdateSemanticsProperty(bindable);
}

static Semantics SetupSemanticsProperty(BindableObject bindable) =>
((VisualElement)bindable).SetupSemantics();

static void UpdateSemanticsProperty(BindableObject bindable)
{
if (bindable is IFrameworkElement fe)
fe.Handler?.UpdateValue(nameof(IView.Semantics));
}

public static string GetDescription(BindableObject bindable)
{
return (string)bindable.GetValue(DescriptionProperty);
}

public static void SetDescription(BindableObject bindable, string value)
{
bindable.SetValue(DescriptionProperty, value);
}

public static string GetHint(BindableObject bindable)
{
return (string)bindable.GetValue(HintProperty);
}

public static void SetHint(BindableObject bindable, string value)
{
bindable.SetValue(HintProperty, value);
}
}
}
5 changes: 5 additions & 0 deletions src/Core/src/Core/IFrameworkElement.cs
Expand Up @@ -100,5 +100,10 @@ public interface IFrameworkElement
/// Determines the vertical aspect of this element's arrangement in a container
/// </summary>
LayoutAlignment VerticalLayoutAlignment { get; }

/// <summary>
/// Adds semantics to every FrameworkElement for accessibility
/// </summary>
Semantics Semantics { get; }
}
}
Expand Up @@ -2,7 +2,7 @@

namespace Microsoft.Maui.Handlers
{
public partial class ActivityIndicatorHandler : AbstractViewHandler<IActivityIndicator, ProgressBar>
public partial class ActivityIndicatorHandler : ViewHandler<IActivityIndicator, ProgressBar>
{
protected override ProgressBar CreateNativeView() => new ProgressBar(Context) { Indeterminate = true };
}
Expand Down
Expand Up @@ -2,7 +2,7 @@

namespace Microsoft.Maui.Handlers
{
public partial class ActivityIndicatorHandler : AbstractViewHandler<IActivityIndicator, object>
public partial class ActivityIndicatorHandler : ViewHandler<IActivityIndicator, object>
{
protected override object CreateNativeView() => throw new NotImplementedException();
}
Expand Down
Expand Up @@ -3,7 +3,7 @@

namespace Microsoft.Maui.Handlers
{
public partial class ActivityIndicatorHandler : AbstractViewHandler<IActivityIndicator, ProgressBar>
public partial class ActivityIndicatorHandler : ViewHandler<IActivityIndicator, ProgressBar>
{
protected override ProgressBar CreateNativeView() => new ProgressBar();
}
Expand Down
Expand Up @@ -10,12 +10,12 @@ public partial class ActivityIndicatorHandler

public static void MapIsRunning(ActivityIndicatorHandler handler, IActivityIndicator activityIndicator)
{
handler.TypedNativeView?.UpdateIsRunning(activityIndicator);
handler.NativeView?.UpdateIsRunning(activityIndicator);
}

public static void MapColor(ActivityIndicatorHandler handler, IActivityIndicator activityIndicator)
{
handler.TypedNativeView?.UpdateColor(activityIndicator);
handler.NativeView?.UpdateColor(activityIndicator);
}

public ActivityIndicatorHandler() : base(ActivityIndicatorMapper)
Expand Down
Expand Up @@ -3,7 +3,7 @@

namespace Microsoft.Maui.Handlers
{
public partial class ActivityIndicatorHandler : AbstractViewHandler<IActivityIndicator, MauiActivityIndicator>
public partial class ActivityIndicatorHandler : ViewHandler<IActivityIndicator, MauiActivityIndicator>
{
protected override MauiActivityIndicator CreateNativeView() => new MauiActivityIndicator(CGRect.Empty, VirtualView)
{
Expand Down
12 changes: 6 additions & 6 deletions src/Core/src/Handlers/Button/ButtonHandler.Android.cs
Expand Up @@ -6,7 +6,7 @@

namespace Microsoft.Maui.Handlers
{
public partial class ButtonHandler : AbstractViewHandler<IButton, AppCompatButton>
public partial class ButtonHandler : ViewHandler<IButton, AppCompatButton>
{
ButtonClickListener ClickListener { get; } = new ButtonClickListener();
ButtonTouchListener TouchListener { get; } = new ButtonTouchListener();
Expand Down Expand Up @@ -45,17 +45,17 @@ protected override void DisconnectHandler(AppCompatButton nativeView)

public static void MapBackgroundColor(ButtonHandler handler, IButton button)
{
handler.TypedNativeView?.UpdateBackgroundColor(button);
handler.NativeView?.UpdateBackgroundColor(button);
}

public static void MapText(ButtonHandler handler, IButton button)
{
handler.TypedNativeView?.UpdateText(button);
handler.NativeView?.UpdateText(button);
}

public static void MapTextColor(ButtonHandler handler, IButton button)
{
handler.TypedNativeView?.UpdateTextColor(button);
handler.NativeView?.UpdateTextColor(button);
}

public static void MapFont(ButtonHandler handler, IButton button)
Expand All @@ -64,12 +64,12 @@ public static void MapFont(ButtonHandler handler, IButton button)

var fontManager = handler.Services.GetRequiredService<IFontManager>();

handler.TypedNativeView?.UpdateFont(button, fontManager);
handler.NativeView?.UpdateFont(button, fontManager);
}

public static void MapPadding(ButtonHandler handler, IButton button)
{
handler.TypedNativeView?.UpdatePadding(button);
handler.NativeView?.UpdatePadding(button);
}

public bool OnTouch(IButton? button, AView? v, MotionEvent? e)
Expand Down
2 changes: 1 addition & 1 deletion src/Core/src/Handlers/Button/ButtonHandler.Standard.cs
Expand Up @@ -2,7 +2,7 @@

namespace Microsoft.Maui.Handlers
{
public partial class ButtonHandler : AbstractViewHandler<IButton, object>
public partial class ButtonHandler : ViewHandler<IButton, object>
{
protected override object CreateNativeView() => throw new NotImplementedException();

Expand Down
12 changes: 6 additions & 6 deletions src/Core/src/Handlers/Button/ButtonHandler.Windows.cs
Expand Up @@ -5,7 +5,7 @@

namespace Microsoft.Maui.Handlers
{
public partial class ButtonHandler : AbstractViewHandler<IButton, Button>
public partial class ButtonHandler : ViewHandler<IButton, Button>
{
static UI.Xaml.Thickness? DefaultPadding;
static UI.Xaml.Media.Brush? DefaultForeground;
Expand Down Expand Up @@ -46,17 +46,17 @@ protected override void DisconnectHandler(Button nativeView)

public static void MapBackgroundColor(ButtonHandler handler, IButton button)
{
handler.TypedNativeView?.UpdateBackgroundColor(button, DefaultBackground);
handler.NativeView?.UpdateBackgroundColor(button, DefaultBackground);
}

public static void MapText(ButtonHandler handler, IButton button)
{
handler.TypedNativeView?.UpdateText(button);
handler.NativeView?.UpdateText(button);
}

public static void MapTextColor(ButtonHandler handler, IButton button)
{
handler.TypedNativeView?.UpdateTextColor(button, DefaultForeground);
handler.NativeView?.UpdateTextColor(button, DefaultForeground);
}

public static void MapFont(ButtonHandler handler, IButton button)
Expand All @@ -65,12 +65,12 @@ public static void MapFont(ButtonHandler handler, IButton button)

var fontManager = handler.Services.GetRequiredService<IFontManager>();

handler.TypedNativeView?.UpdateFont(button, fontManager);
handler.NativeView?.UpdateFont(button, fontManager);
}

public static void MapPadding(ButtonHandler handler, IButton button)
{
handler.TypedNativeView?.UpdatePadding(button, DefaultPadding);
handler.NativeView?.UpdatePadding(button, DefaultPadding);
}

void OnClick(object sender, UI.Xaml.RoutedEventArgs e)
Expand Down
20 changes: 10 additions & 10 deletions src/Core/src/Handlers/Button/ButtonHandler.iOS.cs
Expand Up @@ -4,7 +4,7 @@

namespace Microsoft.Maui.Handlers
{
public partial class ButtonHandler : AbstractViewHandler<IButton, UIButton>
public partial class ButtonHandler : ViewHandler<IButton, UIButton>
{
static readonly UIControlState[] ControlStates = { UIControlState.Normal, UIControlState.Highlighted, UIControlState.Disabled };

Expand Down Expand Up @@ -47,21 +47,21 @@ protected override void SetupDefaults(UIButton nativeView)

public static void MapBackgroundColor(ButtonHandler handler, IButton button)
{
handler.TypedNativeView?.UpdateBackgroundColor(button);
handler.NativeView?.UpdateBackgroundColor(button);
}

public static void MapText(ButtonHandler handler, IButton button)
{
handler.TypedNativeView?.UpdateText(button);
handler.NativeView?.UpdateText(button);
}

public static void MapTextColor(ButtonHandler handler, IButton button)
{
handler.TypedNativeView?.UpdateTextColor(button, ButtonTextColorDefaultNormal, ButtonTextColorDefaultHighlighted, ButtonTextColorDefaultDisabled);
handler.NativeView?.UpdateTextColor(button, ButtonTextColorDefaultNormal, ButtonTextColorDefaultHighlighted, ButtonTextColorDefaultDisabled);
}
public static void MapPadding(ButtonHandler handler, IButton button)
{
handler.TypedNativeView?.UpdatePadding(button);
handler.NativeView?.UpdatePadding(button);
}

public static void MapFont(ButtonHandler handler, IButton button)
Expand All @@ -70,19 +70,19 @@ public static void MapFont(ButtonHandler handler, IButton button)

var fontManager = handler.Services.GetRequiredService<IFontManager>();

handler.TypedNativeView?.UpdateFont(button, fontManager);
handler.NativeView?.UpdateFont(button, fontManager);
}

void SetControlPropertiesFromProxy()
{
if (TypedNativeView == null)
if (NativeView == null)
return;

foreach (UIControlState uiControlState in ControlStates)
{
TypedNativeView.SetTitleColor(UIButton.Appearance.TitleColor(uiControlState), uiControlState); // If new values are null, old values are preserved.
TypedNativeView.SetTitleShadowColor(UIButton.Appearance.TitleShadowColor(uiControlState), uiControlState);
TypedNativeView.SetBackgroundImage(UIButton.Appearance.BackgroundImageForState(uiControlState), uiControlState);
NativeView.SetTitleColor(UIButton.Appearance.TitleColor(uiControlState), uiControlState); // If new values are null, old values are preserved.
NativeView.SetTitleShadowColor(UIButton.Appearance.TitleShadowColor(uiControlState), uiControlState);
NativeView.SetBackgroundImage(UIButton.Appearance.BackgroundImageForState(uiControlState), uiControlState);
}
}

Expand Down
4 changes: 2 additions & 2 deletions src/Core/src/Handlers/CheckBox/CheckBoxHandler.Android.cs
Expand Up @@ -3,14 +3,14 @@

namespace Microsoft.Maui.Handlers
{
public partial class CheckBoxHandler : AbstractViewHandler<ICheckBox, AppCompatCheckBox>
public partial class CheckBoxHandler : ViewHandler<ICheckBox, AppCompatCheckBox>
{
CheckedChangeListener ChangeListener { get; } = new CheckedChangeListener();

// This is an Android-specific mapping
public static void MapBackgroundColor(CheckBoxHandler handler, ICheckBox check)
{
handler.TypedNativeView?.UpdateBackgroundColor(check);
handler.NativeView?.UpdateBackgroundColor(check);
}

protected override AppCompatCheckBox CreateNativeView()
Expand Down