Skip to content

Commit

Permalink
[Android] Fixed RefreshView in a grid
Browse files Browse the repository at this point in the history
  • Loading branch information
kubaflo committed Oct 21, 2024
1 parent 70f1f76 commit 8840be9
Show file tree
Hide file tree
Showing 5 changed files with 90 additions and 0 deletions.
27 changes: 27 additions & 0 deletions src/Controls/tests/TestCases.HostApp/Issues/Issue25368.xaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="Maui.Controls.Sample.Issues.Issue25368">
<Grid RowDefinitions="*,Auto"
ColumnDefinitions="Auto,*">
<RefreshView Grid.Row="0"
Grid.ColumnSpan="2">
<CollectionView AutomationId="CollectionView"
x:Name="cv">
<CollectionView.ItemTemplate>
<DataTemplate>
<Label Text="{Binding .}"
AutomationId="{Binding .}"
TextColor="Black"/>
</DataTemplate>
</CollectionView.ItemTemplate>
</CollectionView>
</RefreshView>
<ContentView
Grid.Row="1"
Grid.ColumnSpan="2"
BackgroundColor="Black"
HeightRequest="200">
</ContentView>
</Grid>
</ContentPage>
12 changes: 12 additions & 0 deletions src/Controls/tests/TestCases.HostApp/Issues/Issue25368.xaml.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
namespace Maui.Controls.Sample.Issues
{
[Issue(IssueTracker.Github, 25368, "Android RefreshView in a grid can break the grid layout", PlatformAffected.Android)]
public partial class Issue25368 : ContentPage
{
public Issue25368()
{
InitializeComponent();
cv.ItemsSource = Enumerable.Range(1, 100);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
using NUnit.Framework;
using UITest.Appium;
using UITest.Core;

namespace Microsoft.Maui.TestCases.Tests.Issues
{
public class Issue25368 : _IssuesUITest
{
public Issue25368(TestDevice testDevice) : base(testDevice)
{
}

public override string Issue => "Android RefreshView in a grid can break the grid layout";

[Test]
[Category(UITestCategories.RefreshView)]
public void Issue2775Test()
{
App.WaitForElement("1");
App.ScrollDown("CollectionView", ScrollStrategy.Gesture, swipePercentage: 0.9);
App.ScrollDown("CollectionView", ScrollStrategy.Gesture, swipePercentage: 0.9);
App.ScrollDown("CollectionView", ScrollStrategy.Gesture, swipePercentage: 0.9);
App.WaitForElement("100");
}
}
}
24 changes: 24 additions & 0 deletions src/Core/src/Handlers/RefreshView/RefreshViewHandler.Android.cs
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,30 @@ protected override void DisconnectHandler(MauiSwipeRefreshLayout platformView)
base.DisconnectHandler(platformView);
}

public override Size GetDesiredSize(double widthConstraint, double heightConstraint)
{
var Context = MauiContext?.Context;
var platformView = PlatformView;
var virtualView = VirtualView;

if (double.IsInfinity(virtualView.MaximumWidth) || double.IsInfinity(virtualView.MaximumHeight))
{
if (platformView == null || virtualView == null || Context == null)
return Size.Zero;

// Create a spec to handle the native measure
var widthSpec = Context.CreateMeasureSpec(widthConstraint, virtualView.Width, virtualView.Frame.Width);
var heightSpec = Context.CreateMeasureSpec(heightConstraint, virtualView.Height, virtualView.Frame.Height);

platformView.Measure(widthSpec, heightSpec);

// Convert back to xplat sizes for the return value
return Context.FromPixels(platformView.MeasuredWidth, platformView.MeasuredHeight);
}

return base.GetDesiredSize(widthConstraint, heightConstraint);
}

static void UpdateContent(IRefreshViewHandler handler) =>
handler.PlatformView.UpdateContent(handler.VirtualView.Content, handler.MauiContext);

Expand Down
1 change: 1 addition & 0 deletions src/Core/src/PublicAPI/net-android/PublicAPI.Unshipped.txt
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@ Microsoft.Maui.WebProcessTerminatedEventArgs.Sender.get -> Android.Views.View?
override Microsoft.Maui.Handlers.HybridWebViewHandler.ConnectHandler(Android.Webkit.WebView! platformView) -> void
override Microsoft.Maui.Handlers.HybridWebViewHandler.CreatePlatformView() -> Android.Webkit.WebView!
override Microsoft.Maui.Handlers.HybridWebViewHandler.DisconnectHandler(Android.Webkit.WebView! platformView) -> void
override Microsoft.Maui.Handlers.RefreshViewHandler.GetDesiredSize(double widthConstraint, double heightConstraint) -> Microsoft.Maui.Graphics.Size
override Microsoft.Maui.Platform.MauiHybridWebViewClient.Dispose(bool disposing) -> void
override Microsoft.Maui.Platform.MauiHybridWebViewClient.ShouldInterceptRequest(Android.Webkit.WebView? view, Android.Webkit.IWebResourceRequest? request) -> Android.Webkit.WebResourceResponse?
override Microsoft.Maui.Platform.MauiWebViewClient.OnRenderProcessGone(Android.Webkit.WebView? view, Android.Webkit.RenderProcessGoneDetail? detail) -> bool
Expand Down

0 comments on commit 8840be9

Please sign in to comment.