summaryrefslogtreecommitdiff
path: root/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla45330.cs
blob: d3a05fdf08514c4a4a5fcef3a10e6a6dd556befc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
using System;
using System.Collections.ObjectModel;
using System.Linq;
using Xamarin.Forms.CustomAttributes;
using Xamarin.Forms.Internals;

namespace Xamarin.Forms.Controls.Issues
{
	[Preserve(AllMembers = true)]
	[Issue(IssueTracker.Bugzilla, 45330, "System.ObjectDisposedException: Cannot access a disposed object. Object name: 'Android.Views.GestureDetector'.", PlatformAffected.Android)]
	public class Bugzilla45330 : TestContentPage 
	{
		ObservableCollection<_45330Notification> _feed;

		[Preserve(AllMembers = true)]
		public class _45330Dto
		{
			public _45330Dto()
			{
				Notifications = new ObservableCollection<_45330Notification>();
			}

			public ObservableCollection<_45330Notification> Notifications { get; set; }
		}

		[Preserve(AllMembers = true)]
		public class _45330Notification
		{
			public string UniqueId { get; set; }
			public DateTime DisplayDate { get; set; }
		}

		[Preserve(AllMembers = true)]
		public class _45330ListCell : ViewCell
		{
			protected override void OnBindingContextChanged()
			{
				base.OnBindingContextChanged();

				var item = BindingContext as _45330Notification;
				if (item == null) return;

				View = new StackLayout()
				{
					BackgroundColor = Color.Transparent,
					Padding = new Thickness(0, 1, 0, 1),
					Children = { new Label { Text = item.UniqueId } }
				};
			}
		}

		public ObservableCollection<_45330Notification> Feed
		{
			get { return _feed; }
			set
			{
				_feed = value;
				OnPropertyChanged();
			}
		}

		protected override void Init()
		{
			BindingContext = this;
			Feed = MakeNotifications();

			var listview = new ListView();
			listview.SetBinding(ListView.ItemsSourceProperty, "Feed");
			listview.ItemTemplate = new DataTemplate(typeof(_45330ListCell));
			listview.IsPullToRefreshEnabled = true;
			listview.RefreshCommand = new Command(() =>
			{
				listview.IsRefreshing = false;
				Feed = MakeNotifications();
			});

			listview.ItemAppearing += (sender, e) =>
			{
				var currentItem = e.Item as _45330Notification;
				if (currentItem == null) return;
				var item = Feed.Last();
				if (currentItem.UniqueId == item.UniqueId)
				{
					Feed = MakeNotifications();
				}
			};

			var layout = new StackLayout();

			var instructions = new Label { Text = @"The bug can be intermittently reproduced by pulling the list down to refresh it and immediately tapping one of the cells. 
Leaving this test page in for reference purposes, and possibly as a base for a future UI test if we get a way to accurately/consistently simulate the events which cause the crash."};
			
			layout.Children.Add(instructions);
			layout.Children.Add(listview);

			Content = layout;
		}

		ObservableCollection<_45330Notification> MakeNotifications()
		{
			var list = new _45330Dto();
			for (int i = 0; i < 1000; i++)
			{
				list.Notifications.Add(new _45330Notification()
				{
					UniqueId = i.ToString(),
					DisplayDate = DateTime.UtcNow
				});
			}
			return list.Notifications;
		}

		protected override void OnAppearing()
		{
			base.OnAppearing();
			Feed = MakeNotifications();
		}
	}
}