From 5ea0a42f6c427ec257e75065b0d58070ef091593 Mon Sep 17 00:00:00 2001 From: sheiksyedm Date: Thu, 2 Jul 2026 20:19:15 +0530 Subject: [PATCH] Restore Change/StartTrackingTouch/StopTrackingTouch events on Slider and RangeSlider MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit PR #1486 removed the auto-generated addOnChangeListener/addOnSliderTouchListener methods from BaseSlider via remove-node and re-added them as hand-written Additions. However, the binding generator only produces C# events for methods it sees in the API XML — since the methods were removed from the generated API, the Change, StartTrackingTouch, and StopTrackingTouch events were no longer emitted. This caused a regression in 1.14.0.4 where Slider.Change (and touch events) were missing, breaking existing .NET consumers who used the C# event syntax. Fix: add the three events manually to SliderListenerMethods.cs for both Slider and RangeSlider, using EventHelper.AddEventHandler/RemoveEventHandler with the already- generated implementor types (IOnChangeListenerImplementor, IOnSliderTouchListenerImplementor). This is exactly what the generator would have produced had the methods remained in the generated API. The ChangeEventArgs.P0 type changes from Java.Lang.Object (old erased-generic base) to the concrete Slider/RangeSlider — a source-level improvement alongside the fix. Bump nugetVersion 1.14.0.4 -> 1.14.0.5. Fixes #1484 --- config.json | 2 +- .../Additions/SliderListenerMethods.cs | 105 ++++++++++++++++++ .../PublicAPI/PublicAPI.Unshipped.txt | 6 + 3 files changed, 112 insertions(+), 1 deletion(-) diff --git a/config.json b/config.json index 0d4e5d0c4..d59135661 100644 --- a/config.json +++ b/config.json @@ -3518,7 +3518,7 @@ "groupId": "com.google.android.material", "artifactId": "material", "version": "1.14.0", - "nugetVersion": "1.14.0.4", + "nugetVersion": "1.14.0.5", "nugetId": "Xamarin.Google.Android.Material", "comments": "Requires API-34" }, diff --git a/source/com.google.android.material/material/Additions/SliderListenerMethods.cs b/source/com.google.android.material/material/Additions/SliderListenerMethods.cs index 638d4c4c1..725f8ddf8 100644 --- a/source/com.google.android.material/material/Additions/SliderListenerMethods.cs +++ b/source/com.google.android.material/material/Additions/SliderListenerMethods.cs @@ -76,6 +76,61 @@ public unsafe void RemoveOnSliderTouchListener(Slider.IOnSliderTouchListener lis GC.KeepAlive(listener); } } + + // C# events wrapping the listener pattern — equivalent to the auto-generated events + // that the binding generator no longer produces because addOnChangeListener / + // addOnSliderTouchListener are removed from the generated API (remove-node in Metadata.xml) + // and re-added via this Additions file instead. + + WeakReference? _weak_implementor_AddOnChangeListener; + Slider.IOnChangeListenerImplementor __CreateIOnChangeListenerImplementor() + => new Slider.IOnChangeListenerImplementor(this); + + public event EventHandler Change + { + add => Java.Interop.EventHelper.AddEventHandler( + ref _weak_implementor_AddOnChangeListener, + __CreateIOnChangeListenerImplementor, + AddOnChangeListener, + __h => __h.Handler += value); + remove => Java.Interop.EventHelper.RemoveEventHandler( + ref _weak_implementor_AddOnChangeListener, + Slider.IOnChangeListenerImplementor.__IsEmpty, + __v => RemoveOnChangeListener(__v), + __h => __h.Handler -= value); + } + + WeakReference? _weak_implementor_AddOnSliderTouchListener; + Slider.IOnSliderTouchListenerImplementor __CreateIOnSliderTouchListenerImplementor() + => new Slider.IOnSliderTouchListenerImplementor(this); + + public event EventHandler StartTrackingTouch + { + add => Java.Interop.EventHelper.AddEventHandler( + ref _weak_implementor_AddOnSliderTouchListener, + __CreateIOnSliderTouchListenerImplementor, + AddOnSliderTouchListener, + __h => __h.OnStartTrackingTouchHandler += value); + remove => Java.Interop.EventHelper.RemoveEventHandler( + ref _weak_implementor_AddOnSliderTouchListener, + Slider.IOnSliderTouchListenerImplementor.__IsEmpty, + __v => RemoveOnSliderTouchListener(__v), + __h => __h.OnStartTrackingTouchHandler -= value); + } + + public event EventHandler StopTrackingTouch + { + add => Java.Interop.EventHelper.AddEventHandler( + ref _weak_implementor_AddOnSliderTouchListener, + __CreateIOnSliderTouchListenerImplementor, + AddOnSliderTouchListener, + __h => __h.OnStopTrackingTouchHandler += value); + remove => Java.Interop.EventHelper.RemoveEventHandler( + ref _weak_implementor_AddOnSliderTouchListener, + Slider.IOnSliderTouchListenerImplementor.__IsEmpty, + __v => RemoveOnSliderTouchListener(__v), + __h => __h.OnStopTrackingTouchHandler -= value); + } } public partial class RangeSlider @@ -144,5 +199,55 @@ public unsafe void RemoveOnSliderTouchListener(RangeSlider.IOnSliderTouchListene GC.KeepAlive(listener); } } + + WeakReference? _weak_implementor_AddOnChangeListener; + RangeSlider.IOnChangeListenerImplementor __CreateIOnChangeListenerImplementor() + => new RangeSlider.IOnChangeListenerImplementor(this); + + public event EventHandler Change + { + add => Java.Interop.EventHelper.AddEventHandler( + ref _weak_implementor_AddOnChangeListener, + __CreateIOnChangeListenerImplementor, + AddOnChangeListener, + __h => __h.Handler += value); + remove => Java.Interop.EventHelper.RemoveEventHandler( + ref _weak_implementor_AddOnChangeListener, + RangeSlider.IOnChangeListenerImplementor.__IsEmpty, + __v => RemoveOnChangeListener(__v), + __h => __h.Handler -= value); + } + + WeakReference? _weak_implementor_AddOnSliderTouchListener; + RangeSlider.IOnSliderTouchListenerImplementor __CreateIOnSliderTouchListenerImplementor() + => new RangeSlider.IOnSliderTouchListenerImplementor(this); + + public event EventHandler StartTrackingTouch + { + add => Java.Interop.EventHelper.AddEventHandler( + ref _weak_implementor_AddOnSliderTouchListener, + __CreateIOnSliderTouchListenerImplementor, + AddOnSliderTouchListener, + __h => __h.OnStartTrackingTouchHandler += value); + remove => Java.Interop.EventHelper.RemoveEventHandler( + ref _weak_implementor_AddOnSliderTouchListener, + RangeSlider.IOnSliderTouchListenerImplementor.__IsEmpty, + __v => RemoveOnSliderTouchListener(__v), + __h => __h.OnStartTrackingTouchHandler -= value); + } + + public event EventHandler StopTrackingTouch + { + add => Java.Interop.EventHelper.AddEventHandler( + ref _weak_implementor_AddOnSliderTouchListener, + __CreateIOnSliderTouchListenerImplementor, + AddOnSliderTouchListener, + __h => __h.OnStopTrackingTouchHandler += value); + remove => Java.Interop.EventHelper.RemoveEventHandler( + ref _weak_implementor_AddOnSliderTouchListener, + RangeSlider.IOnSliderTouchListenerImplementor.__IsEmpty, + __v => RemoveOnSliderTouchListener(__v), + __h => __h.OnStopTrackingTouchHandler -= value); + } } diff --git a/source/com.google.android.material/material/PublicAPI/PublicAPI.Unshipped.txt b/source/com.google.android.material/material/PublicAPI/PublicAPI.Unshipped.txt index 77bf41019..06fed8bda 100644 --- a/source/com.google.android.material/material/PublicAPI/PublicAPI.Unshipped.txt +++ b/source/com.google.android.material/material/PublicAPI/PublicAPI.Unshipped.txt @@ -1991,6 +1991,7 @@ Google.Android.Material.Slider.LabelFormatterConsts Google.Android.Material.Slider.RangeSlider Google.Android.Material.Slider.RangeSlider.AddOnChangeListener(Google.Android.Material.Slider.RangeSlider.IOnChangeListener! listener) -> void Google.Android.Material.Slider.RangeSlider.AddOnSliderTouchListener(Google.Android.Material.Slider.RangeSlider.IOnSliderTouchListener! listener) -> void +Google.Android.Material.Slider.RangeSlider.Change -> System.EventHandler! Google.Android.Material.Slider.RangeSlider.ChangeEventArgs Google.Android.Material.Slider.RangeSlider.ChangeEventArgs.ChangeEventArgs(Google.Android.Material.Slider.RangeSlider! p0, float p1, bool p2) -> void Google.Android.Material.Slider.RangeSlider.ChangeEventArgs.P0.get -> Google.Android.Material.Slider.RangeSlider! @@ -2007,15 +2008,18 @@ Google.Android.Material.Slider.RangeSlider.RangeSlider(Android.Content.Context! Google.Android.Material.Slider.RangeSlider.RangeSlider(nint javaReference, Android.Runtime.JniHandleOwnership transfer) -> void Google.Android.Material.Slider.RangeSlider.RemoveOnChangeListener(Google.Android.Material.Slider.RangeSlider.IOnChangeListener! listener) -> void Google.Android.Material.Slider.RangeSlider.RemoveOnSliderTouchListener(Google.Android.Material.Slider.RangeSlider.IOnSliderTouchListener! listener) -> void +Google.Android.Material.Slider.RangeSlider.StartTrackingTouch -> System.EventHandler! Google.Android.Material.Slider.RangeSlider.StartTrackingTouchEventArgs Google.Android.Material.Slider.RangeSlider.StartTrackingTouchEventArgs.P0.get -> Google.Android.Material.Slider.RangeSlider! Google.Android.Material.Slider.RangeSlider.StartTrackingTouchEventArgs.StartTrackingTouchEventArgs(Google.Android.Material.Slider.RangeSlider! p0) -> void +Google.Android.Material.Slider.RangeSlider.StopTrackingTouch -> System.EventHandler! Google.Android.Material.Slider.RangeSlider.StopTrackingTouchEventArgs Google.Android.Material.Slider.RangeSlider.StopTrackingTouchEventArgs.P0.get -> Google.Android.Material.Slider.RangeSlider! Google.Android.Material.Slider.RangeSlider.StopTrackingTouchEventArgs.StopTrackingTouchEventArgs(Google.Android.Material.Slider.RangeSlider! p0) -> void Google.Android.Material.Slider.Slider Google.Android.Material.Slider.Slider.AddOnChangeListener(Google.Android.Material.Slider.Slider.IOnChangeListener! listener) -> void Google.Android.Material.Slider.Slider.AddOnSliderTouchListener(Google.Android.Material.Slider.Slider.IOnSliderTouchListener! listener) -> void +Google.Android.Material.Slider.Slider.Change -> System.EventHandler! Google.Android.Material.Slider.Slider.ChangeEventArgs Google.Android.Material.Slider.Slider.ChangeEventArgs.ChangeEventArgs(Google.Android.Material.Slider.Slider! p0, float p1, bool p2) -> void Google.Android.Material.Slider.Slider.ChangeEventArgs.P0.get -> Google.Android.Material.Slider.Slider! @@ -2033,9 +2037,11 @@ Google.Android.Material.Slider.Slider.Slider(Android.Content.Context! context) - Google.Android.Material.Slider.Slider.Slider(Android.Content.Context! context, Android.Util.IAttributeSet? attrs) -> void Google.Android.Material.Slider.Slider.Slider(Android.Content.Context! context, Android.Util.IAttributeSet? attrs, int defStyleAttr) -> void Google.Android.Material.Slider.Slider.Slider(nint javaReference, Android.Runtime.JniHandleOwnership transfer) -> void +Google.Android.Material.Slider.Slider.StartTrackingTouch -> System.EventHandler! Google.Android.Material.Slider.Slider.StartTrackingTouchEventArgs Google.Android.Material.Slider.Slider.StartTrackingTouchEventArgs.P0.get -> Google.Android.Material.Slider.Slider! Google.Android.Material.Slider.Slider.StartTrackingTouchEventArgs.StartTrackingTouchEventArgs(Google.Android.Material.Slider.Slider! p0) -> void +Google.Android.Material.Slider.Slider.StopTrackingTouch -> System.EventHandler! Google.Android.Material.Slider.Slider.StopTrackingTouchEventArgs Google.Android.Material.Slider.Slider.StopTrackingTouchEventArgs.P0.get -> Google.Android.Material.Slider.Slider! Google.Android.Material.Slider.Slider.StopTrackingTouchEventArgs.StopTrackingTouchEventArgs(Google.Android.Material.Slider.Slider! p0) -> void