From eb4a6293b2453808677bbb720e478f00682ed66f Mon Sep 17 00:00:00 2001 From: SuthiYuvaraj <92777079+SuthiYuvaraj@users.noreply.github.com> Date: Thu, 11 Sep 2025 10:36:16 +0530 Subject: [PATCH 01/20] fix for 12008 --- .../Adapters/ReorderableItemsViewAdapter.cs | 10 ++ .../Android/SimpleItemTouchHelperCallback.cs | 5 +- .../TestCases.HostApp/Issues/Issue12008.xaml | 63 ++++++++++++ .../Issues/Issue12008.xaml.cs | 99 +++++++++++++++++++ .../Tests/Issues/Issue12008.cs | 92 +++++++++++++++++ 5 files changed, 268 insertions(+), 1 deletion(-) create mode 100644 src/Controls/tests/TestCases.HostApp/Issues/Issue12008.xaml create mode 100644 src/Controls/tests/TestCases.HostApp/Issues/Issue12008.xaml.cs create mode 100644 src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Issue12008.cs diff --git a/src/Controls/src/Core/Handlers/Items/Android/Adapters/ReorderableItemsViewAdapter.cs b/src/Controls/src/Core/Handlers/Items/Android/Adapters/ReorderableItemsViewAdapter.cs index 1b84871dad02..e3772f533d4b 100644 --- a/src/Controls/src/Core/Handlers/Items/Android/Adapters/ReorderableItemsViewAdapter.cs +++ b/src/Controls/src/Core/Handlers/Items/Android/Adapters/ReorderableItemsViewAdapter.cs @@ -47,6 +47,16 @@ public bool OnItemMove(int fromPosition, int toPosition) return false; } + if (fromItemIndex < 0 || fromItemIndex > fromList.Count) + { + return false; + } + + if (toItemIndex < 0 || toItemIndex > toList.Count) + { + return false; + } + if (fromList != null && toList != null) { var fromItem = fromList[fromItemIndex]; diff --git a/src/Controls/src/Core/Handlers/Items/Android/SimpleItemTouchHelperCallback.cs b/src/Controls/src/Core/Handlers/Items/Android/SimpleItemTouchHelperCallback.cs index f250d39ff73b..07c2abdcf5c8 100644 --- a/src/Controls/src/Core/Handlers/Items/Android/SimpleItemTouchHelperCallback.cs +++ b/src/Controls/src/Core/Handlers/Items/Android/SimpleItemTouchHelperCallback.cs @@ -28,7 +28,10 @@ public override int GetMovementFlags(RecyclerView recyclerView, RecyclerView.Vie public override bool OnMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) { - if (viewHolder.ItemViewType != target.ItemViewType) + var sourceItemViewType = viewHolder.ItemViewType; + + if (sourceItemViewType == ItemViewType.Header || sourceItemViewType == ItemViewType.Footer + || sourceItemViewType == ItemViewType.GroupHeader || sourceItemViewType == ItemViewType.GroupFooter) { return false; } diff --git a/src/Controls/tests/TestCases.HostApp/Issues/Issue12008.xaml b/src/Controls/tests/TestCases.HostApp/Issues/Issue12008.xaml new file mode 100644 index 000000000000..d39e8f7a28cf --- /dev/null +++ b/src/Controls/tests/TestCases.HostApp/Issues/Issue12008.xaml @@ -0,0 +1,63 @@ + + + + + + + + + + + + diff --git a/src/AI/samples/Essentials.AI.Sample/Pages/LandmarkDetailPage.xaml.cs b/src/AI/samples/Essentials.AI.Sample/Pages/LandmarkDetailPage.xaml.cs new file mode 100644 index 000000000000..eae96a813aca --- /dev/null +++ b/src/AI/samples/Essentials.AI.Sample/Pages/LandmarkDetailPage.xaml.cs @@ -0,0 +1,44 @@ +using Maui.Controls.Sample.Models; +using Maui.Controls.Sample.ViewModels; + +namespace Maui.Controls.Sample.Pages; + +public partial class LandmarkDetailPage : ContentPage +{ + private readonly LandmarkDetailViewModel _viewModel; + + public LandmarkDetailPage(LandmarkDetailViewModel viewModel) + { + InitializeComponent(); + _viewModel = viewModel; + BindingContext = viewModel; + + Loaded += (_, _) => _ = viewModel.InitializeAsync(); // fire-and-forget so page renders immediately + NavigatingFrom += (_, _) => viewModel.Cancel(); + } + + private async void OnBackClicked(object? sender, EventArgs e) + { + await Shell.Current.GoToAsync(".."); + } + + private async void OnPlanTripClicked(object? sender, EventArgs e) + { + var parameters = new Dictionary + { + { "Landmark", _viewModel.Landmark }, + { "Language", _viewModel.SelectedLanguage } + }; + await Shell.Current.GoToAsync(nameof(TripPlanningPage), parameters); + } + + private async void OnSimilarLandmarkTapped(object? sender, Landmark landmark) + { + var parameters = new Dictionary + { + { "Landmark", landmark } + }; + // Navigate to a new detail page for the similar landmark + await Shell.Current.GoToAsync(nameof(LandmarkDetailPage), parameters); + } +} diff --git a/src/AI/samples/Essentials.AI.Sample/Pages/LandmarksPage.xaml b/src/AI/samples/Essentials.AI.Sample/Pages/LandmarksPage.xaml index d8e36611f2b9..55ccd3c30a96 100644 --- a/src/AI/samples/Essentials.AI.Sample/Pages/LandmarksPage.xaml +++ b/src/AI/samples/Essentials.AI.Sample/Pages/LandmarksPage.xaml @@ -5,27 +5,53 @@ xmlns:models="clr-namespace:Maui.Controls.Sample.Models" xmlns:viewModels="clr-namespace:Maui.Controls.Sample.ViewModels" xmlns:views="clr-namespace:Maui.Controls.Sample.Views.Landmarks" + xmlns:f="clr-namespace:Maui.Controls.Sample" x:Class="Maui.Controls.Sample.Pages.LandmarksPage" x:DataType="viewModels:LandmarksViewModel" + SafeAreaEdges="None" Title=".NET MAUI Trip Planner"> - + - + - - - -