#if TEST_EXPERIMENTAL_RENDERERS
// CollectionView lets us test CollectionView stuff until it's officially released
- Forms.SetFlags("FastRenderers_Experimental"/*, "CollectionView_Experimental", "Visual_Experimental", "Shell_Experimental"*/);
+ Forms.SetFlags("FastRenderers_Experimental"/*, "CollectionView_Experimental", "Shell_Experimental"*/);
#else
// Fake_Flag is here so we can test for flag initialization issues
// CollectionView lets us test CollectionView stuff until it's officially released
- Forms.SetFlags("Fake_Flag"/*, "CollectionView_Experimental", "Visual_Experimental", "Shell_Experimental" */);
+ Forms.SetFlags("Fake_Flag"/*, "CollectionView_Experimental", "Shell_Experimental" */);
#endif
Forms.Init(this, bundle);
App.IOSVersion = int.Parse(versionPart[0]);
Xamarin.Calabash.Start();
- // Forms.SetFlags("CollectionView_Experimental", "Visual_Experimental", "Shell_Experimental");
+ // Forms.SetFlags("CollectionView_Experimental", "Shell_Experimental");
Forms.Init();
FormsMaps.Init();
FormsMaterial.Init();
<?xml version="1.0" encoding="UTF-8"?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
- x:Class="Xamarin.Forms.Controls.VisualGallery"
+ x:Class="Xamarin.Forms.Controls.Issues.VisualControlsPage"
Visual="Material">
<ContentPage.Resources>
--- /dev/null
+
+using System;
+using Xamarin.Forms.CustomAttributes;
+using Xamarin.Forms.Internals;
+#if UITEST
+using NUnit.Framework;
+using Xamarin.UITest;
+using Xamarin.Forms.Core.UITests;
+#endif
+
+namespace Xamarin.Forms.Controls.Issues
+{
+ public partial class VisualControlsPage : ContentPage
+ {
+ bool isVisible = false;
+ double percentage = 0.0;
+
+ public VisualControlsPage()
+ {
+#if APP
+ InitializeComponent();
+#endif
+
+ BindingContext = this;
+ }
+
+ public double PercentageCounter
+ {
+ get { return percentage; }
+ set
+ {
+ percentage = value;
+ OnPropertyChanged();
+ OnPropertyChanged(nameof(Counter));
+ }
+ }
+
+ public double Counter => percentage * 10;
+
+ protected override void OnAppearing()
+ {
+ isVisible = true;
+
+ base.OnAppearing();
+
+ Device.StartTimer(TimeSpan.FromSeconds(1), () =>
+ {
+ var progress = PercentageCounter + 0.1;
+ if (progress > 1)
+ progress = 0;
+
+ PercentageCounter = progress;
+
+ return isVisible;
+ });
+ }
+
+ protected override void OnDisappearing()
+ {
+ isVisible = false;
+
+ base.OnDisappearing();
+ }
+ }
+
+
+
+ [Preserve(AllMembers = true)]
+ [Issue(IssueTracker.Github, 4435, "Visual Gallery Loads",
+ PlatformAffected.iOS | PlatformAffected.Android)]
+#if UITEST
+ [NUnit.Framework.Category(UITestCategories.Visual)]
+#endif
+ public class Issue4435 : TestNavigationPage
+ {
+ const string Success = "Success";
+ Label successLabel;
+ protected override void Init()
+ {
+ var vg = new VisualControlsPage();
+ successLabel = new Label();
+ vg.Appearing += Vg_Appearing;
+ PushAsync(new ContentPage()
+ {
+ Content = new StackLayout()
+ {
+ Children =
+ {
+ successLabel
+ }
+ }
+ });
+
+ PushAsync(vg);
+ }
+
+ private void Vg_Appearing(object sender, EventArgs e)
+ {
+ Device.BeginInvokeOnMainThread(() =>
+ {
+ PopAsync();
+ successLabel.Text = Success;
+ });
+ }
+
+#if UITEST && !__WINDOWS__
+ [Test]
+ public void LoadingVisualGalleryPageDoesNotCrash()
+ {
+ RunningApp.WaitForElement(Success);
+ }
+#endif
+ }
+}
<Compile Include="$(MSBuildThisFileDirectory)Issue2580.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Issue4026.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Issue4748.cs" />
+ <Compile Include="$(MSBuildThisFileDirectory)VisualControlsPage.xaml.cs">
+ <SubType>Code</SubType>
+ <DependentUpon>%(Filename)</DependentUpon>
+ </Compile>
<Compile Include="$(MSBuildThisFileDirectory)_Template.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Bugzilla56298.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Bugzilla42620.cs" />
<EmbeddedResource Include="$(MSBuildThisFileDirectory)Issue4040.xaml">
<Generator>MSBuild:UpdateDesignTimeXaml</Generator>
</EmbeddedResource>
+ <EmbeddedResource Include="$(MSBuildThisFileDirectory)VisualControlsPage.xaml">
+ <SubType>Designer</SubType>
+ <Generator>MSBuild:UpdateDesignTimeXaml</Generator>
+ </EmbeddedResource>
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="$(MSBuildThisFileDirectory)Bugzilla27417Xaml.xaml">
<Generator>MSBuild:Compile</Generator>
</EmbeddedResource>
</ItemGroup>
+ <ItemGroup>
+ <Compile Update="H:\github\Xamarin.Forms\Xamarin.Forms.Controls.Issues\Xamarin.Forms.Controls.Issues.Shared\VisualGallery.xaml.cs">
+ <DependentUpon>VisualControlsPage.xaml</DependentUpon>
+ </Compile>
+ </ItemGroup>
</Project>
\ No newline at end of file
--- /dev/null
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+using Xamarin.Forms;
+using Xamarin.Forms.Controls.Issues;
+
+namespace Xamarin.Forms.Controls
+{
+ public class VisualGallery : VisualControlsPage
+ {
+ public VisualGallery()
+ {
+ }
+ }
+}
\ No newline at end of file
+++ /dev/null
-using System;
-
-namespace Xamarin.Forms.Controls
-{
- public partial class VisualGallery : ContentPage
- {
- bool isVisible = false;
- double percentage = 0.0;
-
- public VisualGallery()
- {
- InitializeComponent();
-
- BindingContext = this;
- }
-
- public double PercentageCounter
- {
- get { return percentage; }
- set
- {
- percentage = value;
- OnPropertyChanged();
- OnPropertyChanged(nameof(Counter));
- }
- }
-
- public double Counter => percentage * 10;
-
- protected override void OnAppearing()
- {
- isVisible = true;
-
- base.OnAppearing();
-
- Device.StartTimer(TimeSpan.FromSeconds(1), () =>
- {
- var progress = PercentageCounter + 0.1;
- if (progress > 1)
- progress = 0;
-
- PercentageCounter = progress;
-
- return isVisible;
- });
- }
-
- protected override void OnDisappearing()
- {
- isVisible = false;
-
- base.OnDisappearing();
- }
- }
-}
public const string ManualReview = "ManualReview";
public const string Performance = "Performance";
+ public const string Visual = "Visual";
}
}
\ No newline at end of file
[SetUp]
public override void Setup()
{
- Device.SetFlags(new List<string> { ExperimentalFlags.VisualExperimental, ExperimentalFlags.ShellExperimental });
+ Device.SetFlags(new List<string> { ExperimentalFlags.ShellExperimental });
base.Setup();
Device.PlatformServices = new MockPlatformServices();
public override void Setup()
{
base.Setup();
- Device.SetFlags(new List<string> { ExperimentalFlags.VisualExperimental });
Device.PlatformServices = new MockPlatformServices();
Internals.Registrar.RegisterAll(new[] {
typeof (TestHandlerAttribute)
[SetUp]
public override void Setup()
{
- Device.SetFlags(new List<string> { ExperimentalFlags.VisualExperimental, ExperimentalFlags.ShellExperimental });
+ Device.SetFlags(new List<string> { ExperimentalFlags.ShellExperimental });
base.Setup();
var mockDeviceInfo = new TestDeviceInfo();
Device.Info = mockDeviceInfo;
internal static class ExperimentalFlags
{
internal const string CollectionViewExperimental = "CollectionView_Experimental";
- internal const string VisualExperimental = "Visual_Experimental";
internal const string ShellExperimental = "Shell_Experimental";
[EditorBrowsable(EditorBrowsableState.Never)]
bool LookupHandlerType(Type viewType, Type visualType, out Type handlerType)
{
- if (_defaultVisualType != visualType)
- VisualElement.VerifyVisualFlagEnabled();
-
visualType = visualType ?? _defaultVisualType;
while (viewType != null && viewType != typeof(Element))
{
static void OnVisualChanged(BindableObject bindable, object oldValue, object newValue)
{
- if(newValue != Xamarin.Forms.VisualMarker.Default)
- VerifyVisualFlagEnabled();
-
var self = bindable as IVisualController;
var newVisual = (IVisual)newValue;
}
}
-
- [EditorBrowsable(EditorBrowsableState.Never)]
- public static void VerifyVisualFlagEnabled(
- string constructorHint = null,
- [CallerMemberName] string memberName = "")
- {
- ExperimentalFlags.VerifyFlagEnabled(nameof(Visual), ExperimentalFlags.VisualExperimental);
- }
}
}
using Foundation;
using UIKit;
-namespace Xamarin.Forms.Platform.iOS.Material
+namespace Xamarin.Forms.Material.iOS
{
public interface IMaterialEntryRenderer
{
--- /dev/null
+using MaterialComponents;
+using MTextInputControllerBase = MaterialComponents.TextInputControllerBase;
+
+namespace Xamarin.Forms.Material.iOS
+{
+ internal interface IMaterialTextField
+ {
+ SemanticColorScheme ColorScheme { get; set; }
+ TypographyScheme TypographyScheme { get; set; }
+ MTextInputControllerBase ActiveTextInputController { get; set; }
+ ITextInput TextInput { get; }
+ }
+}
\ No newline at end of file
using CoreGraphics;
using MaterialComponents;
using UIKit;
-using Xamarin.Forms;
+using Xamarin.Forms.Platform.iOS;
using MActivityIndicator = MaterialComponents.ActivityIndicator;
-namespace Xamarin.Forms.Platform.iOS.Material
+namespace Xamarin.Forms.Material.iOS
{
public class MaterialActivityIndicatorRenderer : ViewRenderer<ActivityIndicator, MActivityIndicator>
{
const float _defaultRadius = 22;
const float _defaultStrokeWidth = 4;
const float _defaultSize = 2 * _defaultRadius + _defaultStrokeWidth;
-
SemanticColorScheme _defaultColorScheme;
SemanticColorScheme _colorScheme;
-
CAShapeLayer _backgroundLayer;
- public MaterialActivityIndicatorRenderer()
- {
- VisualElement.VerifyVisualFlagEnabled();
- }
-
protected override void OnElementChanged(ElementChangedEventArgs<ActivityIndicator> e)
{
_colorScheme?.Dispose();
_backgroundLayer.StrokeColor = color.ToCGColor();
}
- void UpdateColor()
- {
- _colorScheme.PrimaryColor = Element.Color.IsDefault ? _defaultColorScheme.PrimaryColor : Element.Color.ToUIColor();
- }
+ void UpdateColor() => _colorScheme.PrimaryColor = Element.Color.IsDefault ? _defaultColorScheme.PrimaryColor : Element.Color.ToUIColor();
void UpdateIsRunning()
{
using System;
using System.ComponentModel;
-using System.Diagnostics;
using CoreGraphics;
-using Foundation;
using MaterialComponents;
using UIKit;
-using Xamarin.Forms;
-using Xamarin.Forms.PlatformConfiguration.iOSSpecific;
-using Specifics = Xamarin.Forms.PlatformConfiguration.iOSSpecific;
+using Xamarin.Forms.Platform.iOS;
using MButton = MaterialComponents.Button;
-namespace Xamarin.Forms.Platform.iOS.Material
+namespace Xamarin.Forms.Material.iOS
{
public class MaterialButtonRenderer : ViewRenderer<Button, MButton>, IImageVisualElementRenderer, IButtonLayoutRenderer
{
bool _isDisposed;
-
UIColor _defaultBorderColor;
nfloat _defaultBorderWidth = -1;
-
ButtonScheme _defaultButtonScheme;
ButtonScheme _buttonScheme;
-
ButtonLayoutManager _buttonLayoutManager;
public MaterialButtonRenderer()
{
- VisualElement.VerifyVisualFlagEnabled();
-
_buttonLayoutManager = new ButtonLayoutManager(this,
preserveInitialPadding: true,
spacingAdjustsPadding: false,
UpdateBorder();
UpdateTextColor();
_buttonLayoutManager?.Update();
-
ApplyTheme();
}
}
};
}
- protected virtual void ApplyTheme()
- {
- ContainedButtonThemer.ApplyScheme(_buttonScheme, Control);
- }
-
- protected override MButton CreateNativeControl()
- {
- return new MButton();
- }
+ protected virtual void ApplyTheme() => ContainedButtonThemer.ApplyScheme(_buttonScheme, Control);
+ protected override MButton CreateNativeControl() => new MButton();
protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
{
Element?.SendClicked();
}
- void OnButtonTouchDown(object sender, EventArgs eventArgs)
- {
- Element?.SendPressed();
- }
+ void OnButtonTouchDown(object sender, EventArgs eventArgs) => Element?.SendPressed();
protected override void SetBackgroundColor(Color color)
{
{
// NOTE: borders are not a "supported" style of the contained
// button, thus we don't use the themer here.
-
- // BorderColor
-
Color borderColor = Element.BorderColor;
if (_defaultBorderColor == null)
else
Control.SetBorderColor(borderColor.ToUIColor(), UIControlState.Normal);
- // BorderWidth
-
double borderWidth = Element.BorderWidth;
if (_defaultBorderWidth == -1)
}
// IImageVisualElementRenderer
-
bool IImageVisualElementRenderer.IsDisposed => _isDisposed;
-
void IImageVisualElementRenderer.SetImage(UIImage image) => _buttonLayoutManager.SetImage(image);
-
UIImageView IImageVisualElementRenderer.GetImage() => Control?.ImageView;
// IButtonLayoutRenderer
-
UIButton IButtonLayoutRenderer.Control => Control;
-
IImageVisualElementRenderer IButtonLayoutRenderer.ImageVisualElementRenderer => this;
-
nfloat IButtonLayoutRenderer.MinimumHeight => _buttonScheme?.MinimumHeight ?? -1;
}
}
using System.ComponentModel;
using UIKit;
+using Xamarin.Forms.Platform.iOS;
-namespace Xamarin.Forms.Platform.iOS.Material
+namespace Xamarin.Forms.Material.iOS
{
public class MaterialDatePickerRenderer : DatePickerRendererBase<MaterialTextField>, IMaterialEntryRenderer
{
- public MaterialDatePickerRenderer()
- {
- VisualElement.VerifyVisualFlagEnabled();
- }
-
- protected override MaterialTextField CreateNativeControl()
- {
- var field = new NoCaretMaterialTextField(this, Element);
- return field;
- }
-
- protected override void SetBackgroundColor(Color color)
- {
- ApplyTheme();
- }
+ protected override MaterialTextField CreateNativeControl() => new NoCaretMaterialTextField(this, Element);
+ protected override void SetBackgroundColor(Color color) => ApplyTheme();
+ protected internal override void UpdateTextColor() => Control?.UpdateTextColor(this);
+ protected virtual void ApplyTheme() => Control?.ApplyTheme(this);
protected internal override void UpdateFont()
{
base.UpdateFont();
Control?.ApplyTypographyScheme(Element);
}
-
-
- protected internal override void UpdateTextColor()
- {
- Control?.UpdateTextColor(this);
- }
-
-
- protected virtual void ApplyTheme()
- {
- Control?.ApplyTheme(this);
- }
-
- internal void UpdatePlaceholder()
- {
- Control?.UpdatePlaceholder(this);
- }
protected override void OnElementChanged(ElementChangedEventArgs<DatePicker> e)
{
UpdatePlaceholder();
}
+ void UpdatePlaceholder() => Control?.UpdatePlaceholder(this);
string IMaterialEntryRenderer.Placeholder => string.Empty;
Color IMaterialEntryRenderer.PlaceholderColor => Color.Default;
-
Color IMaterialEntryRenderer.TextColor => Element?.TextColor ?? Color.Default;
Color IMaterialEntryRenderer.BackgroundColor => Element?.BackgroundColor ?? Color.Default;
}
using UIKit;
using MaterialComponents;
using System;
+using Xamarin.Forms.Platform.iOS;
-namespace Xamarin.Forms.Platform.iOS.Material
+namespace Xamarin.Forms.Material.iOS
{
public class MaterialEditorRenderer : EditorRendererBase<MaterialMultilineTextField>, IMaterialEntryRenderer
{
bool _hackHasRan = false;
- protected override MaterialMultilineTextField CreateNativeControl()
- {
- return new MaterialMultilineTextField(this, Element);
- }
-
- protected override void SetBackgroundColor(Color color)
- {
- ApplyTheme();
- }
-
-
- protected internal override void UpdateTextColor()
- {
- Control?.UpdateTextColor(this);
- }
-
+ protected override MaterialMultilineTextField CreateNativeControl() => new MaterialMultilineTextField(this, Element);
+ protected IntrinsicHeightTextView IntrinsicHeightTextView => (IntrinsicHeightTextView)TextView;
+ protected override UITextView TextView => Control?.TextView;
+ protected override void SetBackgroundColor(Color color) => ApplyTheme();
- protected virtual void ApplyTheme()
- {
- Control?.ApplyTheme(this);
- }
+ protected internal override void UpdateTextColor() => Control?.UpdateTextColor(this);
+ protected virtual void ApplyTheme() => Control?.ApplyTheme(this);
protected internal override void UpdateFont()
{
});
}
-
- // Placeholder is currently broken upstream and doesn't animate to the correct scale
string IMaterialEntryRenderer.Placeholder => Element?.Placeholder;
- // string IMaterialEntryRenderer.Placeholder => String.Empty;
-
Color IMaterialEntryRenderer.TextColor => Element?.TextColor ?? Color.Default;
Color IMaterialEntryRenderer.PlaceholderColor => Element?.PlaceholderColor ?? Color.Default;
Color IMaterialEntryRenderer.BackgroundColor => Element?.BackgroundColor ?? Color.Default;
-
- protected IntrinsicHeightTextView IntrinsicHeightTextView => (IntrinsicHeightTextView)TextView;
- protected override UITextView TextView => Control?.TextView;
-
}
}
\ No newline at end of file
using CoreGraphics;
using UIKit;
+using Xamarin.Forms.Platform.iOS;
-namespace Xamarin.Forms.Platform.iOS.Material
+namespace Xamarin.Forms.Material.iOS
{
public class MaterialEntryRenderer : EntryRendererBase<MaterialTextField>, IMaterialEntryRenderer
{
-
- public MaterialEntryRenderer()
- {
- VisualElement.VerifyVisualFlagEnabled();
- }
-
- protected override MaterialTextField CreateNativeControl()
- {
- var field = new MaterialTextField(this, Element);
- return field;
- }
-
- protected override void SetBackgroundColor(Color color)
- {
- ApplyTheme();
- }
+ protected override MaterialTextField CreateNativeControl() => new MaterialTextField(this, Element);
+ protected override void SetBackgroundColor(Color color) => ApplyTheme();
+ protected internal override void UpdateColor() => Control?.UpdateTextColor(this);
+ protected virtual void ApplyTheme() => Control?.ApplyTheme(this);
+ protected internal override void UpdatePlaceholder() => Control?.UpdatePlaceholder(this);
protected internal override void UpdateFont()
{
Control?.ApplyTypographyScheme(Element);
}
-
- protected internal override void UpdateColor()
- {
- Control?.UpdateTextColor(this);
- }
-
-
- protected virtual void ApplyTheme()
- {
- Control?.ApplyTheme(this);
- }
-
- protected internal override void UpdatePlaceholder()
- {
- Control?.UpdatePlaceholder(this);
-
- }
-
Color IMaterialEntryRenderer.TextColor => Element?.TextColor ?? Color.Default;
Color IMaterialEntryRenderer.PlaceholderColor => Element?.PlaceholderColor ?? Color.Default;
Color IMaterialEntryRenderer.BackgroundColor => Element?.BackgroundColor ?? Color.Default;
using MaterialComponents;
using UIKit;
using Xamarin.Forms;
+using Xamarin.Forms.Platform.iOS;
using MCard = MaterialComponents.Card;
-namespace Xamarin.Forms.Platform.iOS.Material
+namespace Xamarin.Forms.Material.iOS
{
public class MaterialFrameRenderer : MCard,
IVisualElementRenderer
{
CardScheme _defaultCardScheme;
CardScheme _cardScheme;
-
nfloat _defaultCornerRadius = -1f;
-
VisualElementPackager _packager;
VisualElementTracker _tracker;
bool _disposed = false;
public event EventHandler<VisualElementChangedEventArgs> ElementChanged;
-
- public MaterialFrameRenderer()
- {
- VisualElement.VerifyVisualFlagEnabled();
- }
-
public Frame Element { get; private set; }
-
- protected override void Dispose(bool disposing)
- {
- if (disposing && !_disposed)
- {
- _disposed = true;
- if (_packager == null)
- return;
-
- SetElement(null);
-
- _packager.Dispose();
- _packager = null;
-
- _tracker.NativeControlUpdated -= OnNativeControlUpdated;
- _tracker.Dispose();
- _tracker = null;
- }
-
- base.Dispose(disposing);
- }
-
+
public override void WillRemoveSubview(UIView uiview)
{
var content = Element?.Content;
- if (content != null && uiview == Platform.GetRenderer(content))
+ if (content != null && uiview == Platform.iOS.Platform.GetRenderer(content))
{
uiview.Layer.Mask = null;
}
var content = Element?.Content;
if (content != null && Layer is ShapedShadowLayer shadowLayer && shadowLayer.ShapeLayer.Path is CGPath shapePath)
{
- var renderer = Platform.GetRenderer(content);
+ var renderer = Platform.iOS.Platform.GetRenderer(content);
if (renderer is UIView uiview)
{
var padding = Element.Padding;
}
}
- protected virtual CardScheme CreateCardScheme()
- {
- return new CardScheme
- {
- ColorScheme = MaterialColors.Light.CreateColorScheme(),
- ShapeScheme = new ShapeScheme(),
- };
- }
-
- protected virtual void ApplyTheme()
- {
- if (Element.BorderColor.IsDefault)
- CardThemer.ApplyScheme(_cardScheme, this);
- else
- CardThemer.ApplyOutlinedVariant(_cardScheme, this);
-
- // a special case for no shadow
- if (!Element.HasShadow)
- SetShadowElevation(0, UIControlState.Normal);
-
- // this is set in the theme, so we must always disable it
- Interactable = false;
- }
-
public void SetElement(VisualElement element)
{
_cardScheme?.Dispose();
_packager.Load();
_tracker = new VisualElementTracker(this);
- _tracker.NativeControlUpdated += OnNativeControlUpdated;
}
Element.PropertyChanged += OnElementPropertyChanged;
UpdateCornerRadius();
UpdateBorderColor();
UpdateBackgroundColor();
-
ApplyTheme();
}
OnElementChanged(new VisualElementChangedEventArgs(oldElement, element));
}
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && !_disposed)
+ {
+ _disposed = true;
+ if (_packager == null)
+ return;
+
+ SetElement(null);
+
+ _packager.Dispose();
+ _packager = null;
+
+ _tracker.Dispose();
+ _tracker = null;
+ }
+
+ base.Dispose(disposing);
+ }
+
+ protected virtual CardScheme CreateCardScheme()
+ {
+ return new CardScheme
+ {
+ ColorScheme = MaterialColors.Light.CreateColorScheme(),
+ ShapeScheme = new ShapeScheme(),
+ };
+ }
+
+ protected virtual void ApplyTheme()
+ {
+ if (Element.BorderColor.IsDefault)
+ CardThemer.ApplyScheme(_cardScheme, this);
+ else
+ CardThemer.ApplyOutlinedVariant(_cardScheme, this);
+
+ // a special case for no shadow
+ if (!Element.HasShadow)
+ SetShadowElevation(0, UIControlState.Normal);
+
+ // this is set in the theme, so we must always disable it
+ Interactable = false;
+ }
+
protected virtual void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
{
var updatedTheme = false;
ApplyTheme();
}
- protected virtual void OnElementChanged(VisualElementChangedEventArgs e)
- {
- ElementChanged?.Invoke(this, e);
- }
-
- void OnNativeControlUpdated(object sender, EventArgs eventArgs)
- {
- }
+ protected virtual void OnElementChanged(VisualElementChangedEventArgs e) => ElementChanged?.Invoke(this, e);
void UpdateCornerRadius()
{
}
// IVisualElementRenderer
-
VisualElement IVisualElementRenderer.Element => Element;
-
UIView IVisualElementRenderer.NativeView => this;
-
UIViewController IVisualElementRenderer.ViewController => null;
-
SizeRequest IVisualElementRenderer.GetDesiredSize(double widthConstraint, double heightConstraint) =>
this.GetSizeRequest(widthConstraint, heightConstraint, 44, 44);
-
void IVisualElementRenderer.SetElement(VisualElement element) =>
SetElement(element);
-
void IVisualElementRenderer.SetElementSize(Size size) =>
Layout.LayoutChildIntoBoundingRegion(Element, new Rectangle(Element.X, Element.Y, size.Width, size.Height));
}
using MTextInputControllerBase = MaterialComponents.TextInputControllerBase;
using Xamarin.Forms.Internals;
-namespace Xamarin.Forms.Platform.iOS.Material
+namespace Xamarin.Forms.Material.iOS
{
public class MaterialMultilineTextField : MMultilineTextField, IMaterialTextField
{
+ CGSize _contentSize;
+
+ public MaterialMultilineTextField(IMaterialEntryRenderer element, IFontElement fontElement) => MaterialTextManager.Init(element, this, fontElement);
+
public SemanticColorScheme ColorScheme { get; set; }
public TypographyScheme TypographyScheme { get; set; }
public MTextInputControllerBase ActiveTextInputController { get; set; }
public ITextInput TextInput => this;
- internal bool AutoSizeWithChanges { get; set; } = false;
- CGSize _contentSize;
-
- public MaterialMultilineTextField(IMaterialEntryRenderer element, IFontElement fontElement)
+ public override CGRect Frame
{
- VisualElement.VerifyVisualFlagEnabled();
- MaterialTextManager.Init(element, this, fontElement);
+ get => base.Frame;
+ set
+ {
+ base.Frame = value;
+ UpdateIfTextViewShouldStopExpanding();
+ }
}
public override CGSize SizeThatFits(CGSize size)
}
}
- public override CGRect Frame
- {
- get => base.Frame;
- set
- {
- base.Frame = value;
- UpdateIfTextViewShouldStopExpanding();
- }
- }
-
int NumberOfLines
{
get
}
}
+ internal bool AutoSizeWithChanges { get; set; } = false;
internal void ApplyTypographyScheme(IFontElement fontElement) => MaterialTextManager.ApplyTypographyScheme(this, fontElement);
-
internal void ApplyTheme(IMaterialEntryRenderer element) => MaterialTextManager.ApplyTheme(this, element);
-
internal void UpdatePlaceholder(IMaterialEntryRenderer element) => MaterialTextManager.UpdatePlaceholder(this, element);
-
internal void UpdateTextColor(IMaterialEntryRenderer element) => MaterialTextManager.UpdateTextColor(this, element);
-
-
}
}
using System.ComponentModel;
using UIKit;
+using Xamarin.Forms.Platform.iOS;
-namespace Xamarin.Forms.Platform.iOS.Material
+namespace Xamarin.Forms.Material.iOS
{
public class MaterialPickerRenderer : PickerRendererBase<MaterialTextField>, IMaterialEntryRenderer
{
- public MaterialPickerRenderer()
- {
- VisualElement.VerifyVisualFlagEnabled();
- }
-
- protected override MaterialTextField CreateNativeControl()
- {
- var field = new ReadOnlyMaterialTextField(this, Element);
- return field;
- }
-
- protected override void SetBackgroundColor(Color color)
- {
- ApplyTheme();
- }
+ protected override MaterialTextField CreateNativeControl() => new ReadOnlyMaterialTextField(this, Element);
+ protected override void SetBackgroundColor(Color color) => ApplyTheme();
protected internal override void UpdateFont()
{
base.UpdateFont();
Control?.ApplyTypographyScheme(Element);
}
-
- protected internal override void UpdateTextColor()
- {
- Control?.UpdateTextColor(this);
- }
-
-
- protected virtual void ApplyTheme()
- {
- Control?.ApplyTheme(this);
- }
-
- protected internal override void UpdatePlaceholder()
- {
- Control?.UpdatePlaceholder(this);
- }
+ protected internal override void UpdateTextColor() => Control?.UpdateTextColor(this);
+ protected virtual void ApplyTheme() => Control?.ApplyTheme(this);
+ protected internal override void UpdatePlaceholder() => Control?.UpdatePlaceholder(this);
protected override void OnElementChanged(ElementChangedEventArgs<Picker> e)
{
Color IMaterialEntryRenderer.PlaceholderColor => Color.Default;
Color IMaterialEntryRenderer.TextColor => Element?.TextColor ?? Color.Default;
Color IMaterialEntryRenderer.BackgroundColor => Element?.BackgroundColor ?? Color.Default;
-
}
}
\ No newline at end of file
using MaterialComponents;
using UIKit;
using Xamarin.Forms;
+using Xamarin.Forms.Platform.iOS;
using MProgressView = MaterialComponents.ProgressView;
-namespace Xamarin.Forms.Platform.iOS.Material
+namespace Xamarin.Forms.Material.iOS
{
public class MaterialProgressBarRenderer : ViewRenderer<ProgressBar, MProgressView>
{
BasicColorScheme _defaultColorScheme;
BasicColorScheme _colorScheme;
- public MaterialProgressBarRenderer()
- {
- VisualElement.VerifyVisualFlagEnabled();
- }
-
protected override void OnElementChanged(ElementChangedEventArgs<ProgressBar> e)
{
_colorScheme?.Dispose();
#pragma warning restore CS0618 // Type or member is obsolete
}
- protected override MProgressView CreateNativeControl()
- {
- return new MProgressView();
- }
+ protected override MProgressView CreateNativeControl() => new MProgressView();
public override CGSize SizeThatFits(CGSize size)
{
ApplyTheme();
}
- void UpdateProgressColor()
- {
- UpdateAllColors();
- }
+ void UpdateProgressColor() => UpdateAllColors();
void UpdateAllColors()
{
using MaterialComponents;
using UIKit;
using Xamarin.Forms;
+using Xamarin.Forms.Platform.iOS;
using MSlider = MaterialComponents.Slider;
-namespace Xamarin.Forms.Platform.iOS.Material
+namespace Xamarin.Forms.Material.iOS
{
public class MaterialSliderRenderer : ViewRenderer<Slider, MSlider>
{
SemanticColorScheme _defaultColorScheme;
SemanticColorScheme _colorScheme;
-
- public MaterialSliderRenderer()
- {
- VisualElement.VerifyVisualFlagEnabled();
- }
-
protected override void Dispose(bool disposing)
{
if (Control != null)
}
}
- protected virtual SemanticColorScheme CreateColorScheme()
- {
- return MaterialColors.Light.CreateColorScheme();
- }
-
protected virtual void ApplyTheme()
{
SliderColorThemer.ApplySemanticColorScheme(CreateColorScheme(), Control);
OverrideThemeColors();
}
- protected override MSlider CreateNativeControl()
- {
- return new MSlider { StatefulApiEnabled = true };
- }
public override CGSize SizeThatFits(CGSize size)
{
ApplyTheme();
}
- void UpdateMaximum()
- {
- Control.MaximumValue = (nfloat)Element.Maximum;
- }
+ protected override MSlider CreateNativeControl() => new MSlider { StatefulApiEnabled = true };
+ protected virtual SemanticColorScheme CreateColorScheme() => MaterialColors.Light.CreateColorScheme();
- void UpdateMinimum()
- {
- Control.MinimumValue = (nfloat)Element.Minimum;
- }
+ void UpdateMaximum() => Control.MaximumValue = (nfloat)Element.Maximum;
+ void UpdateMinimum() => Control.MinimumValue = (nfloat)Element.Minimum;
+ void OnControlValueChanged(object sender, EventArgs eventArgs) => Element.SetValueFromRenderer(Slider.ValueProperty, Control.Value);
void UpdateValue()
{
if (!thumbColor.IsDefault)
Control.SetThumbColor(thumbColor.ToUIColor(), UIControlState.Normal);
}
-
- void OnControlValueChanged(object sender, EventArgs eventArgs)
- {
- Element.SetValueFromRenderer(Slider.ValueProperty, Control.Value);
- }
}
}
\ No newline at end of file
using CoreGraphics;
using MaterialComponents;
using UIKit;
+using Xamarin.Forms.Platform.iOS;
using MButton = MaterialComponents.Button;
-namespace Xamarin.Forms.Platform.iOS.Material
+namespace Xamarin.Forms.Material.iOS
{
public class MaterialStepperRenderer : ViewRenderer<Stepper, MaterialStepper>
{
ButtonScheme _buttonScheme;
- public MaterialStepperRenderer()
- {
- VisualElement.VerifyVisualFlagEnabled();
- }
-
protected override void Dispose(bool disposing)
{
if (Control is MaterialStepper control)
using MTextField = MaterialComponents.TextField;
using MTextInputControllerFilled = MaterialComponents.TextInputControllerFilled;
using MTextInputControllerBase = MaterialComponents.TextInputControllerBase;
-using System.Collections.Generic;
-using ObjCRuntime;
-using Foundation;
using Xamarin.Forms.Internals;
-namespace Xamarin.Forms.Platform.iOS.Material
+namespace Xamarin.Forms.Material.iOS
{
- internal interface IMaterialTextField
- {
- SemanticColorScheme ColorScheme { get; set; }
- TypographyScheme TypographyScheme { get; set; }
- MTextInputControllerBase ActiveTextInputController { get; set; }
-
- ITextInput TextInput { get; }
- }
-
public class MaterialTextField : MTextField, IMaterialTextField
{
public SemanticColorScheme ColorScheme { get; set; }
public TypographyScheme TypographyScheme { get; set; }
public MTextInputControllerBase ActiveTextInputController { get; set; }
-
public ITextInput TextInput => this;
-
- public MaterialTextField(IMaterialEntryRenderer element, IFontElement fontElement)
- {
- VisualElement.VerifyVisualFlagEnabled();
- MaterialTextManager.Init(element, this, fontElement);
- }
+ public MaterialTextField(IMaterialEntryRenderer element, IFontElement fontElement) => MaterialTextManager.Init(element, this, fontElement);
public override CGSize SizeThatFits(CGSize size)
{
internal void ApplyTypographyScheme(IFontElement fontElement) =>
MaterialTextManager.ApplyTypographyScheme(this, fontElement);
-
internal void ApplyTheme(IMaterialEntryRenderer element) => MaterialTextManager.ApplyTheme(this, element);
-
internal void UpdatePlaceholder(IMaterialEntryRenderer element) => MaterialTextManager.UpdatePlaceholder(this, element);
-
-
internal void UpdateTextColor(IMaterialEntryRenderer element) => MaterialTextManager.UpdateTextColor(this, element);
}
-
-
- internal class NoCaretMaterialTextField : MaterialTextField
- {
- public NoCaretMaterialTextField(IMaterialEntryRenderer element, IFontElement fontElement) : base(element, fontElement)
- {
- SpellCheckingType = UITextSpellCheckingType.No;
- AutocorrectionType = UITextAutocorrectionType.No;
- AutocapitalizationType = UITextAutocapitalizationType.None;
- }
-
- public override CGRect GetCaretRectForPosition(UITextPosition position)
- {
- return new CGRect();
- }
- }
-
- internal class ReadOnlyMaterialTextField : NoCaretMaterialTextField
- {
- readonly HashSet<string> enableActions;
-
- public ReadOnlyMaterialTextField(IMaterialEntryRenderer element, IFontElement fontElement) : base(element, fontElement)
- {
- string[] actions = { "copy:", "select:", "selectAll:" };
- enableActions = new HashSet<string>(actions);
- }
-
- public override bool CanPerform(Selector action, NSObject withSender)
- => enableActions.Contains(action.Name);
- }
}
\ No newline at end of file
using ObjCRuntime;
using Foundation;
using Xamarin.Forms.Internals;
+using Xamarin.Forms.Platform.iOS;
-namespace Xamarin.Forms.Platform.iOS.Material
+namespace Xamarin.Forms.Material.iOS
{
internal static class MaterialTextManager
{
using System.ComponentModel;
using UIKit;
+using Xamarin.Forms.Platform.iOS;
-namespace Xamarin.Forms.Platform.iOS.Material
+namespace Xamarin.Forms.Material.iOS
{
public class MaterialTimePickerRenderer : TimePickerRendererBase<MaterialTextField>, IMaterialEntryRenderer
{
- public MaterialTimePickerRenderer()
- {
- VisualElement.VerifyVisualFlagEnabled();
- }
-
- protected override MaterialTextField CreateNativeControl()
- {
- var field = new NoCaretMaterialTextField(this, Element);
- return field;
- }
-
- protected override void SetBackgroundColor(Color color)
- {
- ApplyTheme();
- }
+ internal void UpdatePlaceholder() => Control?.UpdatePlaceholder(this);
protected internal override void UpdateFont()
{
Control?.ApplyTypographyScheme(Element);
}
- protected internal override void UpdateTextColor()
- {
- Control?.UpdateTextColor(this);
- }
-
-
- protected virtual void ApplyTheme()
- {
- Control?.ApplyTheme(this);
- }
-
- internal void UpdatePlaceholder()
- {
- Control?.UpdatePlaceholder(this);
- }
+ protected override MaterialTextField CreateNativeControl() => new NoCaretMaterialTextField(this, Element);
+ protected override void SetBackgroundColor(Color color) => ApplyTheme();
+ protected internal override void UpdateTextColor() => Control?.UpdateTextColor(this);
+ protected virtual void ApplyTheme() => Control?.ApplyTheme(this);
protected override void OnElementChanged(ElementChangedEventArgs<TimePicker> e)
{
string IMaterialEntryRenderer.Placeholder => string.Empty;
Color IMaterialEntryRenderer.PlaceholderColor => Color.Default;
-
Color IMaterialEntryRenderer.TextColor => Element?.TextColor ?? Color.Default;
Color IMaterialEntryRenderer.BackgroundColor => Element?.BackgroundColor ?? Color.Default;
}
--- /dev/null
+using CoreGraphics;
+using UIKit;
+using Xamarin.Forms.Internals;
+
+namespace Xamarin.Forms.Material.iOS
+{
+ internal class NoCaretMaterialTextField : MaterialTextField
+ {
+ public NoCaretMaterialTextField(IMaterialEntryRenderer element, IFontElement fontElement) : base(element, fontElement)
+ {
+ SpellCheckingType = UITextSpellCheckingType.No;
+ AutocorrectionType = UITextAutocorrectionType.No;
+ AutocapitalizationType = UITextAutocapitalizationType.None;
+ }
+
+ public override CGRect GetCaretRectForPosition(UITextPosition position) => new CGRect();
+ }
+}
\ No newline at end of file
[assembly: AssemblyVersion("2.0.0.0")]
[assembly: AssemblyFileVersion("2.0.0.0")]
-[assembly: ExportRenderer(typeof(Xamarin.Forms.ActivityIndicator), typeof(Xamarin.Forms.Platform.iOS.Material.MaterialActivityIndicatorRenderer), new[] { typeof(VisualMarker.MaterialVisual) })]
-[assembly: ExportRenderer(typeof(Xamarin.Forms.Button), typeof(Xamarin.Forms.Platform.iOS.Material.MaterialButtonRenderer), new[] { typeof(VisualMarker.MaterialVisual) })]
-[assembly: ExportRenderer(typeof(Xamarin.Forms.Entry), typeof(Xamarin.Forms.Platform.iOS.Material.MaterialEntryRenderer), new[] { typeof(VisualMarker.MaterialVisual) })]
-[assembly: ExportRenderer(typeof(Xamarin.Forms.Frame), typeof(Xamarin.Forms.Platform.iOS.Material.MaterialFrameRenderer), new[] { typeof(VisualMarker.MaterialVisual) })]
-[assembly: ExportRenderer(typeof(Xamarin.Forms.ProgressBar), typeof(Xamarin.Forms.Platform.iOS.Material.MaterialProgressBarRenderer), new[] { typeof(VisualMarker.MaterialVisual) })]
-[assembly: ExportRenderer(typeof(Xamarin.Forms.Slider), typeof(Xamarin.Forms.Platform.iOS.Material.MaterialSliderRenderer), new[] { typeof(VisualMarker.MaterialVisual) })]
-[assembly: ExportRenderer(typeof(Xamarin.Forms.TimePicker), typeof(Xamarin.Forms.Platform.iOS.Material.MaterialTimePickerRenderer), new[] { typeof(VisualMarker.MaterialVisual) })]
-[assembly: ExportRenderer(typeof(Xamarin.Forms.Picker), typeof(Xamarin.Forms.Platform.iOS.Material.MaterialPickerRenderer), new[] { typeof(VisualMarker.MaterialVisual) })]
-[assembly: ExportRenderer(typeof(Xamarin.Forms.DatePicker), typeof(Xamarin.Forms.Platform.iOS.Material.MaterialDatePickerRenderer), new[] { typeof(VisualMarker.MaterialVisual) })]
-[assembly: ExportRenderer(typeof(Xamarin.Forms.Stepper), typeof(Xamarin.Forms.Platform.iOS.Material.MaterialStepperRenderer), new[] { typeof(VisualMarker.MaterialVisual) })]
-[assembly: ExportRenderer(typeof(Xamarin.Forms.Editor), typeof(Xamarin.Forms.Platform.iOS.Material.MaterialEditorRenderer), new[] { typeof(VisualMarker.MaterialVisual) })]
\ No newline at end of file
+[assembly: ExportRenderer(typeof(Xamarin.Forms.ActivityIndicator), typeof(Xamarin.Forms.Material.iOS.MaterialActivityIndicatorRenderer), new[] { typeof(VisualMarker.MaterialVisual) })]
+[assembly: ExportRenderer(typeof(Xamarin.Forms.Button), typeof(Xamarin.Forms.Material.iOS.MaterialButtonRenderer), new[] { typeof(VisualMarker.MaterialVisual) })]
+[assembly: ExportRenderer(typeof(Xamarin.Forms.Entry), typeof(Xamarin.Forms.Material.iOS.MaterialEntryRenderer), new[] { typeof(VisualMarker.MaterialVisual) })]
+[assembly: ExportRenderer(typeof(Xamarin.Forms.Frame), typeof(Xamarin.Forms.Material.iOS.MaterialFrameRenderer), new[] { typeof(VisualMarker.MaterialVisual) })]
+[assembly: ExportRenderer(typeof(Xamarin.Forms.ProgressBar), typeof(Xamarin.Forms.Material.iOS.MaterialProgressBarRenderer), new[] { typeof(VisualMarker.MaterialVisual) })]
+[assembly: ExportRenderer(typeof(Xamarin.Forms.Slider), typeof(Xamarin.Forms.Material.iOS.MaterialSliderRenderer), new[] { typeof(VisualMarker.MaterialVisual) })]
+[assembly: ExportRenderer(typeof(Xamarin.Forms.TimePicker), typeof(Xamarin.Forms.Material.iOS.MaterialTimePickerRenderer), new[] { typeof(VisualMarker.MaterialVisual) })]
+[assembly: ExportRenderer(typeof(Xamarin.Forms.Picker), typeof(Xamarin.Forms.Material.iOS.MaterialPickerRenderer), new[] { typeof(VisualMarker.MaterialVisual) })]
+[assembly: ExportRenderer(typeof(Xamarin.Forms.DatePicker), typeof(Xamarin.Forms.Material.iOS.MaterialDatePickerRenderer), new[] { typeof(VisualMarker.MaterialVisual) })]
+[assembly: ExportRenderer(typeof(Xamarin.Forms.Stepper), typeof(Xamarin.Forms.Material.iOS.MaterialStepperRenderer), new[] { typeof(VisualMarker.MaterialVisual) })]
+[assembly: ExportRenderer(typeof(Xamarin.Forms.Editor), typeof(Xamarin.Forms.Material.iOS.MaterialEditorRenderer), new[] { typeof(VisualMarker.MaterialVisual) })]
--- /dev/null
+using System.Collections.Generic;
+using ObjCRuntime;
+using Foundation;
+using Xamarin.Forms.Internals;
+
+namespace Xamarin.Forms.Material.iOS
+{
+ internal class ReadOnlyMaterialTextField : NoCaretMaterialTextField
+ {
+ readonly HashSet<string> enableActions;
+
+ public ReadOnlyMaterialTextField(IMaterialEntryRenderer element, IFontElement fontElement) : base(element, fontElement)
+ {
+ string[] actions = { "copy:", "select:", "selectAll:" };
+ enableActions = new HashSet<string>(actions);
+ }
+
+ public override bool CanPerform(Selector action, NSObject withSender)
+ => enableActions.Contains(action.Name);
+ }
+}
\ No newline at end of file
<Link>MaterialColors.cs</Link>
</Compile>
<Compile Include="IMaterialEntryRenderer.cs" />
+ <Compile Include="IMaterialTextField.cs" />
<Compile Include="MaterialEditorRenderer.cs" />
<Compile Include="MaterialPickerRenderer.cs" />
<Compile Include="MaterialDatePickerRenderer.cs" />
<Compile Include="MaterialTextManager.cs" />
<Compile Include="MaterialTimePickerRenderer.cs" />
<Compile Include="MaterialTextField.cs" />
+ <Compile Include="NoCaretMaterialTextField.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="MaterialActivityIndicatorRenderer.cs" />
<Compile Include="MaterialButtonRenderer.cs" />
<Compile Include="MaterialSliderRenderer.cs" />
<Compile Include="MaterialStepperRenderer.cs" />
<Compile Include="FormsMaterial.cs" />
+ <Compile Include="ReadOnlyMaterialTextField.cs" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Xamarin.Forms.Platform.iOS\Xamarin.Forms.Platform.iOS.csproj">
}
abstract protected void UpdateTextColor();
- abstract protected internal void UpdateTitleColor();
- abstract protected internal void UpdatePlaceHolderText();
+ abstract protected void UpdateTitleColor();
+ abstract protected void UpdatePlaceHolderText();
}
public class PickerRenderer : PickerRendererBase<EditText>
protected override EditText EditText => Control;
- protected internal override void UpdateTitleColor()
+ protected override void UpdateTitleColor()
{
_hintColorSwitcher = _hintColorSwitcher ?? new TextColorSwitcher(EditText.HintTextColors, Element.UseLegacyColorManagement());
_hintColorSwitcher.UpdateTextColor(EditText, Element.TitleColor, EditText.SetHintTextColor);
_textColorSwitcher = _textColorSwitcher ?? new TextColorSwitcher(EditText.TextColors, Element.UseLegacyColorManagement());
_textColorSwitcher.UpdateTextColor(EditText, Element.TextColor);
}
- protected internal override void UpdatePlaceHolderText() => EditText.Hint = Element.Title;
+ protected override void UpdatePlaceHolderText() => EditText.Hint = Element.Title;
}
}
\ No newline at end of file
using Android.Widget;
using Xamarin.Forms;
using Xamarin.Forms.Platform.Android.FastRenderers;
-using Xamarin.Forms.Platform.Android.Material;
+using Xamarin.Forms.Material.Android;
using AProgressBar = Android.Widget.ProgressBar;
using AView = Android.Views.View;
+using Xamarin.Forms.Platform.Android;
[assembly: ExportRenderer(typeof(ActivityIndicator), typeof(MaterialActivityIndicatorRenderer), new[] { typeof(VisualMarker.MaterialVisual) })]
-namespace Xamarin.Forms.Platform.Android.Material
+namespace Xamarin.Forms.Material.Android
{
public class MaterialActivityIndicatorRenderer : FrameLayout,
IVisualElementRenderer, IViewRenderer, ITabStop
{
int? _defaultLabelFor;
-
bool _disposed;
-
ActivityIndicator _element;
CircularProgress _control;
-
VisualElementTracker _visualElementTracker;
VisualElementRenderer _visualElementRenderer;
MotionEventHelper _motionEventHelper;
- public event EventHandler<VisualElementChangedEventArgs> ElementChanged;
- public event EventHandler<PropertyChangedEventArgs> ElementPropertyChanged;
-
public MaterialActivityIndicatorRenderer(Context context)
: base(context)
{
- VisualElement.VerifyVisualFlagEnabled();
-
_control = new CircularProgress(new ContextThemeWrapper(context, Resource.Style.XamarinFormsMaterialProgressBarCircular), null, Resource.Style.XamarinFormsMaterialProgressBarCircular)
{
// limiting size to compare iOS realization
_motionEventHelper = new MotionEventHelper();
}
+ public event EventHandler<VisualElementChangedEventArgs> ElementChanged;
+
+ public event EventHandler<PropertyChangedEventArgs> ElementPropertyChanged;
+
+ public override bool OnTouchEvent(MotionEvent e)
+ {
+ if (_visualElementRenderer.OnTouchEvent(e) || base.OnTouchEvent(e))
+ return true;
+
+ return _motionEventHelper.HandleMotionEvent(Parent, e);
+ }
+
protected AProgressBar Control => _control;
protected ActivityIndicator Element
{
Element.PropertyChanged -= OnElementPropertyChanged;
- if (Platform.GetRenderer(Element) == this)
- Element.ClearValue(Platform.RendererProperty);
+ if (Platform.Android.Platform.GetRenderer(Element) == this)
+ Element.ClearValue(Platform.Android.Platform.RendererProperty);
}
}
UpdateBackgroundColor();
}
- public override bool OnTouchEvent(MotionEvent e)
- {
- if (_visualElementRenderer.OnTouchEvent(e) || base.OnTouchEvent(e))
- return true;
-
- return _motionEventHelper.HandleMotionEvent(Parent, e);
- }
-
void UpdateIsRunning()
{
if (Element != null && _control != null)
}
// IVisualElementRenderer
-
VisualElement IVisualElementRenderer.Element => Element;
-
VisualElementTracker IVisualElementRenderer.Tracker => _visualElementTracker;
-
ViewGroup IVisualElementRenderer.ViewGroup => null;
-
AView IVisualElementRenderer.View => this;
SizeRequest IVisualElementRenderer.GetDesiredSize(int widthConstraint, int heightConstraint)
_visualElementTracker?.UpdateLayout();
// IViewRenderer
-
void IViewRenderer.MeasureExactly() =>
ViewRenderer.MeasureExactly(_control, Element, Context);
// ITabStop
-
AView ITabStop.TabStop => _control;
}
}
using Xamarin.Forms;
using Xamarin.Forms.Internals;
using Xamarin.Forms.Platform.Android.FastRenderers;
-using Xamarin.Forms.Platform.Android.Material;
+using Xamarin.Forms.Material.Android;
using Xamarin.Forms.PlatformConfiguration.AndroidSpecific;
using AColor = Android.Graphics.Color;
using AView = Android.Views.View;
using MButton = Android.Support.Design.Button.MaterialButton;
+using Xamarin.Forms.Platform.Android;
[assembly: ExportRenderer(typeof(Xamarin.Forms.Button), typeof(MaterialButtonRenderer), new[] { typeof(VisualMarker.MaterialVisual) })]
-namespace Xamarin.Forms.Platform.Android.Material
+namespace Xamarin.Forms.Material.Android
{
public class MaterialButtonRenderer : MButton,
IBorderVisualElementRenderer, IButtonLayoutRenderer, IVisualElementRenderer, IViewRenderer, ITabStop,
float _defaultFontSize = -1;
int? _defaultLabelFor;
Typeface _defaultTypeface;
-
bool _disposed;
bool _inputTransparent;
-
Button _button;
-
IPlatformElementConfiguration<PlatformConfiguration.Android, Button> _platformElementConfiguration;
VisualElementTracker _tracker;
VisualElementRenderer _visualElementRenderer;
ButtonLayoutManager _buttonLayoutManager;
-
readonly AutomationPropertiesProvider _automationPropertiesProvider;
-
- public event EventHandler<VisualElementChangedEventArgs> ElementChanged;
- public event EventHandler<PropertyChangedEventArgs> ElementPropertyChanged;
-
+
public MaterialButtonRenderer(Context context)
: base(new ContextThemeWrapper(context, Resource.Style.XamarinFormsMaterialTheme))
{
- VisualElement.VerifyVisualFlagEnabled();
-
_automationPropertiesProvider = new AutomationPropertiesProvider(this);
_buttonLayoutManager = new ButtonLayoutManager(this,
alignIconWithText: true,
Tag = this;
}
+ public event EventHandler<VisualElementChangedEventArgs> ElementChanged;
+ public event EventHandler<PropertyChangedEventArgs> ElementPropertyChanged;
protected MButton Control => this;
protected Button Element
{
Element.PropertyChanged -= OnElementPropertyChanged;
- if (Platform.GetRenderer(Element) == this)
- Element.ClearValue(Platform.RendererProperty);
+ if (Platform.Android.Platform.GetRenderer(Element) == this)
+ Element.ClearValue(Platform.Android.Platform.RendererProperty);
}
}
_platformElementConfiguration ?? (_platformElementConfiguration = Element.OnThisPlatform());
// IOnAttachStateChangeListener
-
void IOnAttachStateChangeListener.OnViewAttachedToWindow(AView attachedView) =>
_buttonLayoutManager?.OnViewAttachedToWindow(attachedView);
_buttonLayoutManager?.OnViewDetachedFromWindow(detachedView);
// IOnFocusChangeListener
-
void IOnFocusChangeListener.OnFocusChange(AView v, bool hasFocus) =>
Element.SetValueFromRenderer(VisualElement.IsFocusedPropertyKey, hasFocus);
// IOnClickListener
-
void IOnClickListener.OnClick(AView v) =>
ButtonElementManager.OnClick(Element, Element, v);
// IOnTouchListener
-
bool IOnTouchListener.OnTouch(AView v, MotionEvent e) =>
ButtonElementManager.OnTouch(Element, Element, v, e);
// IBorderVisualElementRenderer
-
float IBorderVisualElementRenderer.ShadowRadius => ShadowRadius;
float IBorderVisualElementRenderer.ShadowDx => ShadowDx;
float IBorderVisualElementRenderer.ShadowDy => ShadowDy;
AView IBorderVisualElementRenderer.View => this;
// IButtonLayoutRenderer
-
Button IButtonLayoutRenderer.Element => Element;
AppCompatButton IButtonLayoutRenderer.View => this;
// IVisualElementRenderer
-
VisualElement IVisualElementRenderer.Element => Element;
VisualElementTracker IVisualElementRenderer.Tracker => _tracker;
ViewGroup IVisualElementRenderer.ViewGroup => null;
_tracker?.UpdateLayout();
// IViewRenderer
-
void IViewRenderer.MeasureExactly() =>
ViewRenderer.MeasureExactly(this, Element, Context);
// ITabStop
-
AView ITabStop.TabStop => this;
}
}
using AProgressBar = Android.Widget.ProgressBar;
using ASeekBar = Android.Widget.AbsSeekBar;
using PlatformColor = Android.Graphics.Color;
+using Xamarin.Forms.Platform.Android;
#else
using MaterialComponents;
+using Xamarin.Forms.Platform.iOS;
using PlatformColor = UIKit.UIColor;
#endif
#if __ANDROID__
-namespace Xamarin.Forms.Platform.Android.Material
+namespace Xamarin.Forms.Material.Android
#else
-namespace Xamarin.Forms.Platform.iOS.Material
+namespace Xamarin.Forms.Material.iOS
#endif
{
// Colors from material-components-android
{
seekBar.ApplyProgressBarColors(progressColor, backgroundColor);
- if (thumbColor.IsDefault)
+ if (Forms.IsLollipopOrNewer)
{
- // reset everything to defaults
- seekBar.ThumbTintList = seekBar.ProgressTintList;
+ if (thumbColor.IsDefault)
+ {
+ // reset everything to defaults
+ seekBar.ThumbTintList = seekBar.ProgressTintList;
+ }
+ else
+ {
+ // handle the case where the thumb is set
+ var thumb = thumbColor.ToAndroid();
+ seekBar.ThumbTintList = ColorStateList.ValueOf(thumb);
+ }
}
else
{
- // handle the case where the thumb is set
- var thumb = thumbColor.ToAndroid();
+ seekBar.Thumb.SetColorFilter(thumbColor.ToAndroid(), PorterDuff.Mode.SrcIn);
+ }
+ }
+
+ internal static void ApplyProgressBarColors(this AProgressBar progressBar, PlatformColor progressColor, PlatformColor backgroundColor, PorterDuff.Mode mode)
+ {
+ if(Forms.IsLollipopOrNewer)
+ {
+ progressBar.ProgressTintList = ColorStateList.ValueOf(progressColor);
+ progressBar.ProgressBackgroundTintList = ColorStateList.ValueOf(backgroundColor);
+ progressBar.ProgressBackgroundTintMode = mode;
+ }
+ else
+ {
+ (progressBar.Indeterminate ? progressBar.IndeterminateDrawable :
+ progressBar.ProgressDrawable).SetColorFilter(progressColor, PorterDuff.Mode.SrcIn);
- seekBar.ThumbTintList = ColorStateList.ValueOf(thumb);
}
}
if (backgroundColor.IsDefault)
{
// reset everything to defaults
- progressBar.ProgressTintList = ColorStateList.ValueOf(defaultProgress);
- progressBar.ProgressBackgroundTintList = ColorStateList.ValueOf(defaultProgress);
- progressBar.ProgressBackgroundTintMode = PorterDuff.Mode.SrcIn;
+ progressBar.ApplyProgressBarColors(defaultProgress, defaultProgress, PorterDuff.Mode.SrcIn);
}
else
{
// handle the case where only the background is set
var background = backgroundColor.ToAndroid();
-
- progressBar.ProgressTintList = ColorStateList.ValueOf(defaultProgress);
- progressBar.ProgressBackgroundTintList = ColorStateList.ValueOf(background);
- progressBar.ProgressBackgroundTintMode = PorterDuff.Mode.SrcOver;
+ progressBar.ApplyProgressBarColors(defaultProgress, background, PorterDuff.Mode.SrcOver);
}
}
else
{
// handle the case where only the progress is set
var progress = progressColor.ToAndroid();
-
- progressBar.ProgressTintList = ColorStateList.ValueOf(progress);
- progressBar.ProgressBackgroundTintList = ColorStateList.ValueOf(progress);
- progressBar.ProgressBackgroundTintMode = PorterDuff.Mode.SrcIn;
+ progressBar.ApplyProgressBarColors(progress, progress, PorterDuff.Mode.SrcIn);
}
else
{
// handle the case where both are set
var background = backgroundColor.ToAndroid();
var progress = progressColor.ToAndroid();
-
- progressBar.ProgressTintList = ColorStateList.ValueOf(progress);
- progressBar.ProgressBackgroundTintList = ColorStateList.ValueOf(background);
- progressBar.ProgressBackgroundTintMode = PorterDuff.Mode.SrcOver;
+ progressBar.ApplyProgressBarColors(progress, background, PorterDuff.Mode.SrcOver);
}
}
}
#if __ANDROID_28__
using Android.Content;
using Android.Views;
+using Xamarin.Forms.Platform.Android;
-namespace Xamarin.Forms.Platform.Android.Material
+namespace Xamarin.Forms.Material.Android
{
public class MaterialContextThemeWrapper : ContextThemeWrapper
{
#if __ANDROID_28__
-using System.ComponentModel;
using Android.Content;
-using Android.Support.V4.View;
using Android.Views;
using Android.Widget;
using Xamarin.Forms;
-using Xamarin.Forms.Platform.Android.Material;
+using Xamarin.Forms.Material.Android;
+using Xamarin.Forms.Platform.Android;
[assembly: ExportRenderer(typeof(Xamarin.Forms.DatePicker), typeof(MaterialDatePickerRenderer), new[] { typeof(VisualMarker.MaterialVisual) })]
-namespace Xamarin.Forms.Platform.Android.Material
+namespace Xamarin.Forms.Material.Android
{
public class MaterialDatePickerRenderer : DatePickerRendererBase<MaterialPickerTextInputLayout>
{
using Android.Views;
using Android.Widget;
using Xamarin.Forms;
-using Xamarin.Forms.Platform.Android.Material;
+using Xamarin.Forms.Material.Android;
+using Xamarin.Forms.Platform.Android;
[assembly: ExportRenderer(typeof(Xamarin.Forms.Editor), typeof(MaterialEditorRenderer), new[] { typeof(VisualMarker.MaterialVisual) })]
-namespace Xamarin.Forms.Platform.Android.Material
+namespace Xamarin.Forms.Material.Android
{
- public sealed class MaterialEditorRenderer : EditorRendererBase<MaterialFormsTextInputLayout>
+ public class MaterialEditorRenderer : EditorRendererBase<MaterialFormsTextInputLayout>
{
bool _disposed;
MaterialFormsEditText _textInputEditText;
public MaterialEditorRenderer(Context context) :
base(MaterialContextThemeWrapper.Create(context))
{
- VisualElement.VerifyVisualFlagEnabled();
- }
-
- IElementController ElementController => Element as IElementController;
-
- protected override EditText EditText => _textInputEditText;
+ }
protected override MaterialFormsTextInputLayout CreateNativeControl()
{
UpdateBackgroundColor();
}
- protected override void UpdateTextColor() => ApplyTheme();
-
protected override void UpdateBackgroundColor()
{
if (_disposed || _textInputLayout == null)
_textInputLayout.BoxBackgroundColor = MaterialColors.CreateEntryFilledInputBackgroundColor(Element.BackgroundColor, Element.TextColor);
}
- protected internal override void UpdatePlaceholderText()
+ protected override void UpdatePlaceholderText()
{
if (_disposed || _textInputLayout == null)
return;
_textInputLayout?.SetHint(Element.Placeholder, Element);
}
-
protected override void UpdatePlaceholderColor() => ApplyTheme();
- void ApplyTheme() => _textInputLayout?.ApplyTheme(Element.TextColor, Element.PlaceholderColor);
+ protected virtual void ApplyTheme() => _textInputLayout?.ApplyTheme(Element.TextColor, Element.PlaceholderColor);
+ protected override void UpdateTextColor() => ApplyTheme();
+ protected override EditText EditText => _textInputEditText;
- protected internal override void UpdateFont()
+ protected override void UpdateFont()
{
if (_disposed || _textInputLayout == null)
return;
#if __ANDROID_28__
using Android.Content;
-using Android.OS;
-using Android.Support.V4.View;
using Android.Util;
using Android.Views;
using Android.Widget;
using Xamarin.Forms;
-using Xamarin.Forms.Platform.Android.Material;
+using Xamarin.Forms.Material.Android;
+using Xamarin.Forms.Platform.Android;
[assembly: ExportRenderer(typeof(Xamarin.Forms.Entry), typeof(MaterialEntryRenderer), new[] { typeof(VisualMarker.MaterialVisual) })]
-namespace Xamarin.Forms.Platform.Android.Material
+namespace Xamarin.Forms.Material.Android
{
public sealed class MaterialEntryRenderer : EntryRendererBase<MaterialFormsTextInputLayout>
{
public MaterialEntryRenderer(Context context) :
base(MaterialContextThemeWrapper.Create(context))
{
- VisualElement.VerifyVisualFlagEnabled();
}
- IElementController ElementController => Element as IElementController;
-
- protected override EditText EditText => _textInputEditText;
-
protected override MaterialFormsTextInputLayout CreateNativeControl()
{
LayoutInflater inflater = LayoutInflater.FromContext(Context);
_textInputLayout.BoxBackgroundColor = MaterialColors.CreateEntryFilledInputBackgroundColor(Element.BackgroundColor, Element.TextColor);
}
- protected internal override void UpdatePlaceHolderText()
- {
- _textInputLayout.SetHint(Element.Placeholder, Element);
- }
-
-
+ protected internal override void UpdatePlaceHolderText() => _textInputLayout.SetHint(Element.Placeholder, Element);
+ protected override EditText EditText => _textInputEditText;
protected override void UpdatePlaceholderColor() => ApplyTheme();
void ApplyTheme() => _textInputLayout?.ApplyTheme(Element.TextColor, Element.PlaceholderColor);
using Android.Views;
using Android.Runtime;
using Android.Util;
+using Xamarin.Forms.Platform.Android;
-namespace Xamarin.Forms.Platform.Android.Material
+namespace Xamarin.Forms.Material.Android
{
public class MaterialFormsEditText : MaterialFormsEditTextBase, IFormsEditText
{
remove => _onKeyboardBackPressed -= value;
}
- event EventHandler<SelectionChangedEventArgs> _selectionChanged;
- event EventHandler<SelectionChangedEventArgs> IFormsEditText.SelectionChanged
+ event EventHandler<Platform.Android.SelectionChangedEventArgs> _selectionChanged;
+ event EventHandler<Platform.Android.SelectionChangedEventArgs> IFormsEditText.SelectionChanged
{
add => _selectionChanged += value;
remove => _selectionChanged -= value;
protected override void OnSelectionChanged(int selStart, int selEnd)
{
base.OnSelectionChanged(selStart, selEnd);
- _selectionChanged?.Invoke(this, new SelectionChangedEventArgs(selStart, selEnd));
+ _selectionChanged?.Invoke(this, new Platform.Android.SelectionChangedEventArgs(selStart, selEnd));
}
}
}
using Android.Support.Design.Widget;
using Android.Runtime;
using Android.Util;
+using Xamarin.Forms.Platform.Android;
-namespace Xamarin.Forms.Platform.Android.Material
+namespace Xamarin.Forms.Material.Android
{
public class MaterialFormsEditTextBase : TextInputEditText, IDescendantFocusToggler
{
using System;
using Android.Content;
using Android.Support.Design.Widget;
+using Xamarin.Forms.Platform.Android;
-
-namespace Xamarin.Forms.Platform.Android.Material
+namespace Xamarin.Forms.Material.Android
{
internal static class MaterialFormsEditTextManager
{
-
// These paddings are a hack to center the hint
// once this issue is resolved we can get rid of these paddings
// https://github.com/material-components/material-components-android/issues/120
public static void Init(TextInputEditText textInputEditText)
{
- VisualElement.VerifyVisualFlagEnabled();
-
textInputEditText.TextChanged += OnTextChanged;
textInputEditText.FocusChange += OnFocusChanged;
}
using Android.Runtime;
using Android.Util;
-namespace Xamarin.Forms.Platform.Android.Material
+namespace Xamarin.Forms.Material.Android
{
public class MaterialFormsTextInputLayout : MaterialFormsTextInputLayoutBase
{
using Android.Support.Design.Widget;
using Android.Runtime;
using Android.Util;
-using Android.Views;
-using Android.Graphics;
using Android.Support.V4.View;
using Android.Content.Res;
-namespace Xamarin.Forms.Platform.Android.Material
+namespace Xamarin.Forms.Material.Android
{
public class MaterialFormsTextInputLayoutBase : TextInputLayout
{
public MaterialFormsTextInputLayoutBase(Context context) : base(context)
{
- Init();
}
public MaterialFormsTextInputLayoutBase(Context context, IAttributeSet attrs) : base(context, attrs)
{
- Init();
}
public MaterialFormsTextInputLayoutBase(Context context, IAttributeSet attrs, int defStyleAttr) : base(context, attrs, defStyleAttr)
{
- Init();
}
protected MaterialFormsTextInputLayoutBase(IntPtr javaReference, JniHandleOwnership transfer) : base(javaReference, transfer)
{
- Init();
- }
-
- void Init()
- {
- VisualElement.VerifyVisualFlagEnabled();
}
void ResetTextColors(Color formsTextColor, Color formsPlaceHolderColor)
_focusedFilledColorList = MaterialColors.CreateEntryFilledPlaceholderColors(placeHolderColors.FloatingColor, placeHolderColors.FloatingColor);
_unfocusedEmptyColorList = MaterialColors.CreateEntryFilledPlaceholderColors(placeHolderColors.InlineColor, placeHolderColors.FloatingColor);
-
var textColor = MaterialColors.GetEntryTextColor(formsTextColor).ToArgb();
EditText.SetTextColor(new ColorStateList(s_colorStates, new[] { textColor, textColor }));
}
void OnFocusChange(object sender, FocusChangeEventArgs e) =>
Device.BeginInvokeOnMainThread(() => ApplyTheme());
-
internal void SetHint(string hint, VisualElement element)
{
if (HintEnabled != !String.IsNullOrWhiteSpace(hint))
}
}
-
protected override void Dispose(bool disposing)
{
if (!_isDisposed)
using Android.Views;
using Xamarin.Forms;
using Xamarin.Forms.Platform.Android.FastRenderers;
-using Xamarin.Forms.Platform.Android.Material;
+using Xamarin.Forms.Material.Android;
using AView = Android.Views.View;
using MaterialCardView = Android.Support.Design.Card.MaterialCardView;
+using Xamarin.Forms.Platform.Android;
[assembly: ExportRenderer(typeof(Xamarin.Forms.Frame), typeof(MaterialFrameRenderer), new[] { typeof(VisualMarker.MaterialVisual) })]
-namespace Xamarin.Forms.Platform.Android.Material
+namespace Xamarin.Forms.Material.Android
{
public class MaterialFrameRenderer : MaterialCardView,
IVisualElementRenderer, IEffectControlProvider, IViewRenderer, ITabStop
int? _defaultBackgroundColor;
int? _defaultStrokeColor;
int? _defaultLabelFor;
-
bool _disposed;
-
Frame _element;
-
VisualElementTracker _visualElementTracker;
VisualElementPackager _visualElementPackager;
-
readonly GestureManager _gestureManager;
readonly EffectControlProvider _effectControlProvider;
readonly MotionEventHelper _motionEventHelper;
- public event EventHandler<VisualElementChangedEventArgs> ElementChanged;
- public event EventHandler<PropertyChangedEventArgs> ElementPropertyChanged;
-
public MaterialFrameRenderer(Context context)
: base(new ContextThemeWrapper(context, Resource.Style.XamarinFormsMaterialTheme))
{
- VisualElement.VerifyVisualFlagEnabled();
-
_gestureManager = new GestureManager(this);
_effectControlProvider = new EffectControlProvider(this);
_motionEventHelper = new MotionEventHelper();
}
+ public event EventHandler<VisualElementChangedEventArgs> ElementChanged;
+ public event EventHandler<PropertyChangedEventArgs> ElementPropertyChanged;
+
+ public override bool OnTouchEvent(MotionEvent e)
+ {
+ if (_gestureManager.OnTouchEvent(e) || base.OnTouchEvent(e))
+ return true;
+
+ return _motionEventHelper.HandleMotionEvent(Parent, e);
+ }
+
protected MaterialCardView Control => this;
protected Frame Element
{
Element.PropertyChanged -= OnElementPropertyChanged;
- if (Platform.GetRenderer(Element) == this)
- Element.ClearValue(Platform.RendererProperty);
+ if (Platform.Android.Platform.GetRenderer(Element) == this)
+ Element.ClearValue(Platform.Android.Platform.RendererProperty);
}
}
{
if (children[i] is VisualElement visualElement)
{
- var renderer = Platform.GetRenderer(visualElement);
+ var renderer = Platform.Android.Platform.GetRenderer(visualElement);
renderer?.UpdateLayout();
}
}
}
- public override bool OnTouchEvent(MotionEvent e)
- {
- if (_gestureManager.OnTouchEvent(e) || base.OnTouchEvent(e))
- return true;
-
- return _motionEventHelper.HandleMotionEvent(Parent, e);
- }
-
void UpdateShadow()
{
if (_disposed || Element == null)
}
// IVisualElementRenderer
-
VisualElement IVisualElementRenderer.Element => Element;
-
VisualElementTracker IVisualElementRenderer.Tracker => _visualElementTracker;
-
ViewGroup IVisualElementRenderer.ViewGroup => this;
-
AView IVisualElementRenderer.View => this;
+ void IVisualElementRenderer.SetElement(VisualElement element) =>
+ Element = (element as Frame) ?? throw new ArgumentException("Element must be of type Frame.");
+ void IVisualElementRenderer.UpdateLayout() =>
+ _visualElementTracker?.UpdateLayout();
SizeRequest IVisualElementRenderer.GetDesiredSize(int widthConstraint, int heightConstraint)
{
return new SizeRequest(new Size(context.ToPixels(20), context.ToPixels(20)));
}
- void IVisualElementRenderer.SetElement(VisualElement element) =>
- Element = (element as Frame) ?? throw new ArgumentException("Element must be of type Frame.");
-
void IVisualElementRenderer.SetLabelFor(int? id)
{
if (_defaultLabelFor == null)
ViewCompat.SetLabelFor(this, (int)(id ?? _defaultLabelFor));
}
- void IVisualElementRenderer.UpdateLayout() =>
- _visualElementTracker?.UpdateLayout();
-
// IEffectControlProvider
-
void IEffectControlProvider.RegisterEffect(Effect effect) =>
_effectControlProvider?.RegisterEffect(effect);
// IViewRenderer
-
void IViewRenderer.MeasureExactly() =>
ViewRenderer.MeasureExactly(this, Element, Context);
// ITabStop
-
AView ITabStop.TabStop => this;
}
}
using Android.Content;
using Android.Graphics;
using Android.Runtime;
-using Android.Support.Design.Widget;
using Android.Util;
using Android.Views;
+using Xamarin.Forms.Platform.Android;
-namespace Xamarin.Forms.Platform.Android.Material
+namespace Xamarin.Forms.Material.Android
{
public class MaterialPickerEditText : MaterialFormsEditTextBase
{
bool _isDisposed = false;
- public MaterialPickerEditText(Context context) : base(context)
- {
- PickerManager.Init(this);
- }
- protected MaterialPickerEditText(IntPtr javaReference, JniHandleOwnership transfer) : base(javaReference, transfer)
- {
- PickerManager.Init(this);
- }
+ public MaterialPickerEditText(Context context) : base(context) => PickerManager.Init(this);
- public MaterialPickerEditText(Context context, IAttributeSet attrs) : base(context, attrs)
- {
- PickerManager.Init(this);
- }
+ protected MaterialPickerEditText(IntPtr javaReference, JniHandleOwnership transfer) : base(javaReference, transfer) => PickerManager.Init(this);
- public MaterialPickerEditText(Context context, IAttributeSet attrs, int defStyleAttr) : base(context, attrs, defStyleAttr)
- {
- PickerManager.Init(this);
- }
+ public MaterialPickerEditText(Context context, IAttributeSet attrs) : base(context, attrs) => PickerManager.Init(this);
+
+ public MaterialPickerEditText(Context context, IAttributeSet attrs, int defStyleAttr) : base(context, attrs, defStyleAttr) => PickerManager.Init(this);
public override bool OnTouchEvent(MotionEvent e)
{
{
base.OnFocusChanged(gainFocus, direction, previouslyFocusedRect);
PickerManager.OnFocusChanged(gainFocus, this, (IPopupTrigger)Parent.Parent);
-
}
protected override void Dispose(bool disposing)
#if __ANDROID_28__
-using System.ComponentModel;
using Android.Content;
-using Android.Support.V4.View;
using Android.Views;
using Android.Widget;
using Xamarin.Forms;
-using Xamarin.Forms.Platform.Android.Material;
+using Xamarin.Forms.Material.Android;
+using Xamarin.Forms.Platform.Android;
[assembly: ExportRenderer(typeof(Xamarin.Forms.Picker), typeof(MaterialPickerRenderer), new[] { typeof(VisualMarker.MaterialVisual) })]
-namespace Xamarin.Forms.Platform.Android.Material
+namespace Xamarin.Forms.Material.Android
{
- public class MaterialPickerRenderer : AppCompat.PickerRendererBase<MaterialPickerTextInputLayout>
+ public class MaterialPickerRenderer : Platform.Android.AppCompat.PickerRendererBase<MaterialPickerTextInputLayout>
{
MaterialPickerTextInputLayout _textInputLayout;
MaterialPickerEditText _textInputEditText;
{
}
-
protected override EditText EditText => _textInputEditText;
protected override MaterialPickerTextInputLayout CreateNativeControl()
_textInputLayout.BoxBackgroundColor = MaterialColors.CreateEntryFilledInputBackgroundColor(Element.BackgroundColor, Element.TextColor);
}
- protected internal override void UpdatePlaceHolderText()
- {
- _textInputLayout.SetHint(string.Empty, Element);
- }
-
- protected internal override void UpdateTitleColor() => ApplyTheme();
+ protected override void UpdatePlaceHolderText() => _textInputLayout.SetHint(string.Empty, Element);
+ protected override void UpdateTitleColor() => ApplyTheme();
protected override void UpdateTextColor() => ApplyTheme();
-
- void ApplyTheme() => _textInputLayout?.ApplyTheme(Element.TextColor, Color.Default);
+ protected virtual void ApplyTheme() => _textInputLayout?.ApplyTheme(Element.TextColor, Color.Default);
}
}
#endif
\ No newline at end of file
using Android.Content;
using Android.Runtime;
using Android.Util;
+using Xamarin.Forms.Platform.Android;
-namespace Xamarin.Forms.Platform.Android.Material
+namespace Xamarin.Forms.Material.Android
{
public class MaterialPickerTextInputLayout : MaterialFormsTextInputLayoutBase, IPopupTrigger
{
using Android.Views;
using Xamarin.Forms;
using Xamarin.Forms.Platform.Android.FastRenderers;
-using Xamarin.Forms.Platform.Android.Material;
+using Xamarin.Forms.Material.Android;
using AProgressBar = Android.Widget.ProgressBar;
using AView = Android.Views.View;
+using Xamarin.Forms.Platform.Android;
[assembly: ExportRenderer(typeof(ProgressBar), typeof(MaterialProgressBarRenderer), new[] { typeof(VisualMarker.MaterialVisual) })]
-namespace Xamarin.Forms.Platform.Android.Material
+namespace Xamarin.Forms.Material.Android
{
public class MaterialProgressBarRenderer : AProgressBar,
IVisualElementRenderer, IViewRenderer, ITabStop
{
const int MaximumValue = 10000;
-
int? _defaultLabelFor;
-
bool _disposed;
-
ProgressBar _element;
-
VisualElementTracker _visualElementTracker;
VisualElementRenderer _visualElementRenderer;
MotionEventHelper _motionEventHelper;
-
- public event EventHandler<VisualElementChangedEventArgs> ElementChanged;
- public event EventHandler<PropertyChangedEventArgs> ElementPropertyChanged;
-
+
public MaterialProgressBarRenderer(Context context)
: base(new ContextThemeWrapper(context, Resource.Style.XamarinFormsMaterialProgressBarHorizontal), null, Resource.Style.XamarinFormsMaterialProgressBarHorizontal)
{
- VisualElement.VerifyVisualFlagEnabled();
-
Indeterminate = false;
Max = MaximumValue;
_motionEventHelper = new MotionEventHelper();
}
+ public override bool OnTouchEvent(MotionEvent e)
+ {
+ if (_visualElementRenderer.OnTouchEvent(e) || base.OnTouchEvent(e))
+ return true;
+
+ return _motionEventHelper.HandleMotionEvent(Parent, e);
+ }
+
+ public event EventHandler<VisualElementChangedEventArgs> ElementChanged;
+ public event EventHandler<PropertyChangedEventArgs> ElementPropertyChanged;
+
protected AProgressBar Control => this;
protected ProgressBar Element
{
Element.PropertyChanged -= OnElementPropertyChanged;
- if (Platform.GetRenderer(Element) == this)
- Element.ClearValue(Platform.RendererProperty);
+ if (Platform.Android.Platform.GetRenderer(Element) == this)
+ Element.ClearValue(Platform.Android.Platform.RendererProperty);
}
}
UpdateColors();
}
- public override bool OnTouchEvent(MotionEvent e)
- {
- if (_visualElementRenderer.OnTouchEvent(e) || base.OnTouchEvent(e))
- return true;
-
- return _motionEventHelper.HandleMotionEvent(Parent, e);
- }
-
void UpdateColors()
{
if (Element == null || Control == null)
this.ApplyProgressBarColors(Element.ProgressColor, Element.BackgroundColor);
}
- void UpdateProgress()
- {
- Control.Progress = (int)(Element.Progress * MaximumValue);
- }
+ void UpdateProgress() => Control.Progress = (int)(Element.Progress * MaximumValue);
// IVisualElementRenderer
-
VisualElement IVisualElementRenderer.Element => Element;
-
VisualElementTracker IVisualElementRenderer.Tracker => _visualElementTracker;
-
ViewGroup IVisualElementRenderer.ViewGroup => null;
-
AView IVisualElementRenderer.View => this;
+ void IVisualElementRenderer.SetElement(VisualElement element) =>
+ Element = (element as ProgressBar) ?? throw new ArgumentException("Element must be of type ProgressBar.");
+ void IVisualElementRenderer.UpdateLayout() =>
+ _visualElementTracker?.UpdateLayout();
SizeRequest IVisualElementRenderer.GetDesiredSize(int widthConstraint, int heightConstraint)
{
return new SizeRequest(new Size(Control.MeasuredWidth, Context.ToPixels(4)), new Size(Context.ToPixels(4), Context.ToPixels(4)));
}
- void IVisualElementRenderer.SetElement(VisualElement element) =>
- Element = (element as ProgressBar) ?? throw new ArgumentException("Element must be of type ProgressBar.");
-
void IVisualElementRenderer.SetLabelFor(int? id)
{
if (_defaultLabelFor == null)
ViewCompat.SetLabelFor(this, (int)(id ?? _defaultLabelFor));
}
- void IVisualElementRenderer.UpdateLayout() =>
- _visualElementTracker?.UpdateLayout();
-
// IViewRenderer
-
void IViewRenderer.MeasureExactly() =>
ViewRenderer.MeasureExactly(this, Element, Context);
// ITabStop
-
AView ITabStop.TabStop => this;
}
}
using Android.Widget;
using Xamarin.Forms;
using Xamarin.Forms.Platform.Android.FastRenderers;
-using Xamarin.Forms.Platform.Android.Material;
+using Xamarin.Forms.Material.Android;
using AView = Android.Views.View;
+using Xamarin.Forms.Platform.Android;
[assembly: ExportRenderer(typeof(Xamarin.Forms.Slider), typeof(MaterialSliderRenderer), new[] { typeof(VisualMarker.MaterialVisual) })]
-namespace Xamarin.Forms.Platform.Android.Material
+namespace Xamarin.Forms.Material.Android
{
public class MaterialSliderRenderer : SeekBar,
SeekBar.IOnSeekBarChangeListener,
IVisualElementRenderer, IViewRenderer, ITabStop
{
const double MaximumValue = 10000.0;
-
int? _defaultLabelFor;
-
bool _disposed;
-
Slider _element;
-
VisualElementTracker _visualElementTracker;
VisualElementRenderer _visualElementRenderer;
MotionEventHelper _motionEventHelper;
-
double _max = 0.0;
double _min = 0.0;
- public event EventHandler<VisualElementChangedEventArgs> ElementChanged;
- public event EventHandler<PropertyChangedEventArgs> ElementPropertyChanged;
-
public MaterialSliderRenderer(Context context)
: base(new ContextThemeWrapper(context, Resource.Style.XamarinFormsMaterialSlider), null, Resource.Style.XamarinFormsMaterialSlider)
{
- VisualElement.VerifyVisualFlagEnabled();
-
SetOnSeekBarChangeListener(this);
Max = (int)MaximumValue;
_motionEventHelper = new MotionEventHelper();
}
+ public event EventHandler<VisualElementChangedEventArgs> ElementChanged;
+
+ public event EventHandler<PropertyChangedEventArgs> ElementPropertyChanged;
+
+ public override bool OnTouchEvent(MotionEvent e)
+ {
+ if (_visualElementRenderer.OnTouchEvent(e) || base.OnTouchEvent(e))
+ return true;
+
+ return _motionEventHelper.HandleMotionEvent(Parent, e);
+ }
+
protected SeekBar Control => this;
protected Slider Element
}
}
- double Value
- {
- get { return _min + (_max - _min) * (Control.Progress / MaximumValue); }
- set { Control.Progress = (int)((value - _min) / (_max - _min) * MaximumValue); }
- }
-
protected override void Dispose(bool disposing)
{
if (_disposed)
_visualElementRenderer?.Dispose();
_visualElementRenderer = null;
+ SetOnSeekBarChangeListener(null);
if (Element != null)
{
Element.PropertyChanged -= OnElementPropertyChanged;
- if (Platform.GetRenderer(Element) == this)
- Element.ClearValue(Platform.RendererProperty);
+ if (Platform.Android.Platform.GetRenderer(Element) == this)
+ Element.ClearValue(Platform.Android.Platform.RendererProperty);
}
}
UpdateColors();
}
- public override bool OnTouchEvent(MotionEvent e)
- {
- if (_visualElementRenderer.OnTouchEvent(e) || base.OnTouchEvent(e))
- return true;
-
- return _motionEventHelper.HandleMotionEvent(Parent, e);
- }
-
void UpdateColors()
{
if (Element == null || Control == null)
this.ApplySeekBarColors(progressColor, backgroundColor, thumbColor);
}
-
+
+ double Value
+ {
+ get { return _min + (_max - _min) * (Control.Progress / MaximumValue); }
+ set { Control.Progress = (int)((value - _min) / (_max - _min) * MaximumValue); }
+ }
void UpdateValue()
{
_min = Element.Minimum;
}
// SeekBar.IOnSeekBarChangeListener
-
void SeekBar.IOnSeekBarChangeListener.OnProgressChanged(SeekBar seekBar, int progress, bool fromUser)
{
if (fromUser)
((IElementController)Element).SetValueFromRenderer(Slider.ValueProperty, Value);
}
- void SeekBar.IOnSeekBarChangeListener.OnStartTrackingTouch(SeekBar seekBar)
- {
- ((ISliderController)Element)?.SendDragStarted();
- }
+ void SeekBar.IOnSeekBarChangeListener.OnStartTrackingTouch(SeekBar seekBar) => ((ISliderController)Element)?.SendDragStarted();
- void SeekBar.IOnSeekBarChangeListener.OnStopTrackingTouch(SeekBar seekBar)
- {
- ((ISliderController)Element)?.SendDragCompleted();
- }
+ void SeekBar.IOnSeekBarChangeListener.OnStopTrackingTouch(SeekBar seekBar) => ((ISliderController)Element)?.SendDragCompleted();
// IVisualElementRenderer
-
VisualElement IVisualElementRenderer.Element => Element;
-
VisualElementTracker IVisualElementRenderer.Tracker => _visualElementTracker;
-
ViewGroup IVisualElementRenderer.ViewGroup => null;
-
AView IVisualElementRenderer.View => this;
+ void IVisualElementRenderer.SetElement(VisualElement element) =>
+ Element = (element as Slider) ?? throw new ArgumentException($"Element must be of type {nameof(Slider)}.");
+ void IVisualElementRenderer.UpdateLayout() =>
+ _visualElementTracker?.UpdateLayout();
SizeRequest IVisualElementRenderer.GetDesiredSize(int widthConstraint, int heightConstraint)
{
return new SizeRequest(new Size(Control.MeasuredWidth, Control.MeasuredHeight), new Size());
}
- void IVisualElementRenderer.SetElement(VisualElement element) =>
- Element = (element as Slider) ?? throw new ArgumentException($"Element must be of type {nameof(Slider)}.");
-
void IVisualElementRenderer.SetLabelFor(int? id)
{
if (_defaultLabelFor == null)
ViewCompat.SetLabelFor(this, (int)(id ?? _defaultLabelFor));
}
- void IVisualElementRenderer.UpdateLayout() =>
- _visualElementTracker?.UpdateLayout();
// IViewRenderer
-
void IViewRenderer.MeasureExactly() =>
ViewRenderer.MeasureExactly(this, Element, Context);
// ITabStop
-
AView ITabStop.TabStop => this;
}
}
using Android.Views;
using Android.Widget;
using Xamarin.Forms;
-using Xamarin.Forms.Platform.Android.Material;
+using Xamarin.Forms.Material.Android;
+using Xamarin.Forms.Platform.Android;
using AButton = Android.Widget.Button;
using MButton = Android.Support.Design.Button.MaterialButton;
[assembly: ExportRenderer(typeof(Xamarin.Forms.Stepper), typeof(MaterialStepperRenderer), new[] { typeof(VisualMarker.MaterialVisual) })]
-namespace Xamarin.Forms.Platform.Android.Material
+namespace Xamarin.Forms.Material.Android
{
public class MaterialStepperRenderer : ViewRenderer<Stepper, LinearLayout>, IStepperRenderer
{
public MaterialStepperRenderer(Context context) : base(context)
{
- VisualElement.VerifyVisualFlagEnabled();
-
AutoPackage = false;
}
#if __ANDROID_28__
-using System.ComponentModel;
using Android.Content;
-using Android.Support.V4.View;
using Android.Views;
using Android.Widget;
using Xamarin.Forms;
-using Xamarin.Forms.Platform.Android.Material;
+using Xamarin.Forms.Material.Android;
+using Xamarin.Forms.Platform.Android;
[assembly: ExportRenderer(typeof(Xamarin.Forms.TimePicker), typeof(MaterialTimePickerRenderer), new[] { typeof(VisualMarker.MaterialVisual) })]
-namespace Xamarin.Forms.Platform.Android.Material
+namespace Xamarin.Forms.Material.Android
{
public class MaterialTimePickerRenderer : TimePickerRendererBase<MaterialPickerTextInputLayout>
{
public void SetColor(Color color)
{
var progress = color.IsDefault ? DefaultColor : color.ToAndroid();
- IndeterminateTintList = ColorStateList.ValueOf(progress);
+
+ if (Forms.IsLollipopOrNewer)
+ {
+ IndeterminateTintList = ColorStateList.ValueOf(progress);
+ }
+ else
+ {
+ (Indeterminate ? IndeterminateDrawable : ProgressDrawable).SetColorFilter(color.ToAndroid(), PorterDuff.Mode.SrcIn);
+ }
}
public void SetBackgroundColor(Color color)
base.Dispose(disposing);
}
- public override bool DispatchTouchEvent(MotionEvent e)
- {
- return base.DispatchTouchEvent(e);
- }
-
protected override void OnElementChanged(ElementChangedEventArgs<DatePicker> e)
{
base.OnElementChanged(e);
ElementController.SendCompleted();
}
- protected internal virtual void UpdateFont()
+ protected virtual void UpdateFont()
{
EditText.Typeface = Element.ToTypeface();
EditText.SetTextSize(ComplexUnitType.Sp, (float)Element.FontSize);
abstract protected void UpdateTextColor();
- internal protected virtual void UpdatePlaceholderText()
+ protected virtual void UpdatePlaceholderText()
{
if (EditText.Hint == Element.Placeholder)
return;
<?xml version="1.0" encoding="utf-8"?>
-<xamarin.forms.platform.android.material.MaterialPickerTextInputLayout
+<xamarin.forms.material.android.MaterialPickerTextInputLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
style="@style/XamarinFormsMaterialEntryFilled">
- <xamarin.forms.platform.android.material.MaterialPickerEditText
+ <xamarin.forms.material.android.MaterialPickerEditText
android:id="@+id/materialformsedittext"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="-7dp"/>
-</xamarin.forms.platform.android.material.MaterialPickerTextInputLayout>
+</xamarin.forms.material.android.MaterialPickerTextInputLayout>
<?xml version="1.0" encoding="utf-8"?>
-<xamarin.forms.platform.android.material.MaterialFormsTextInputLayout
+<xamarin.forms.material.android.MaterialFormsTextInputLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
style="@style/XamarinFormsMaterialEntryFilled">
- <xamarin.forms.platform.android.material.MaterialFormsEditText
+ <xamarin.forms.material.android.MaterialFormsEditText
android:id="@+id/materialformsedittext"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="-7dp" />
-</xamarin.forms.platform.android.material.MaterialFormsTextInputLayout>
+</xamarin.forms.material.android.MaterialFormsTextInputLayout>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8" ?>
+<resources>
+ <!-- Material Progress Bars -->
+ <style name="XamarinFormsMaterialProgressBarCircular" parent="Widget.AppCompat.ProgressBar">
+ <item name="android:background">@drawable/MaterialActivityIndicatorBackground</item>
+ </style>
+</resources>
<item name="android:progressDrawable">@drawable/MaterialProgressBar</item>
</style>
<style name="XamarinFormsMaterialProgressBarCircular" parent="Widget.AppCompat.ProgressBar">
- <item name="android:background">@drawable/MaterialActivityIndicatorBackground</item>
</style>
<!-- Material Buttons (All Styles) -->
<style name="XamarinFormsMaterialButton" parent="Widget.MaterialComponents.Button">
</AndroidResource>
</ItemGroup>
<ItemGroup>
- <AndroidResource Include="Resources\drawable\MaterialActivityIndicatorBackground.xml">
+ <AndroidResource Include="Resources\drawable-v21\MaterialActivityIndicatorBackground.xml">
<Generator>MSBuild:UpdateGeneratedFiles</Generator>
<SubType>Designer</SubType>
</AndroidResource>
<SubType>Designer</SubType>
</AndroidResource>
</ItemGroup>
- <ItemGroup />
+ <ItemGroup>
+ <AndroidResource Include="Resources\values-v21\styles.xml">
+ <Generator>MSBuild:UpdateGeneratedFiles</Generator>
+ <SubType>Designer</SubType>
+ </AndroidResource>
+ </ItemGroup>
<Target Name="BeforeBuild" Condition=" '$(CreateAllAndroidTargets)' == 'true' ">
<!-- create 8.1 binaries-->
<MSBuild Targets="Restore" Projects="@(ProjectToBuild)">
{
public App()
{
- Device.SetFlags(new[] { "Shell_Experimental", "Visual_Experimental", "CollectionView_Experimental" });
+ Device.SetFlags(new[] { "Shell_Experimental", "CollectionView_Experimental" });
InitializeMainPage();
}