diff --git a/CarouselViewChallenge/CarouselViewChallenge.Android/CarouselViewChallenge.Android.csproj b/CarouselViewChallenge/CarouselViewChallenge.Android/CarouselViewChallenge.Android.csproj index 1e33499..df094f6 100644 --- a/CarouselViewChallenge/CarouselViewChallenge.Android/CarouselViewChallenge.Android.csproj +++ b/CarouselViewChallenge/CarouselViewChallenge.Android/CarouselViewChallenge.Android.csproj @@ -32,6 +32,10 @@ prompt 4 None + false + false + false + false true @@ -54,8 +58,11 @@ - + + + 4.2.0.815419 + @@ -101,4 +108,4 @@ - + \ No newline at end of file diff --git a/CarouselViewChallenge/CarouselViewChallenge.Android/MainActivity.cs b/CarouselViewChallenge/CarouselViewChallenge.Android/MainActivity.cs index fd4e22a..538f47b 100644 --- a/CarouselViewChallenge/CarouselViewChallenge.Android/MainActivity.cs +++ b/CarouselViewChallenge/CarouselViewChallenge.Android/MainActivity.cs @@ -22,6 +22,7 @@ protected override void OnCreate(Bundle savedInstanceState) global::Xamarin.Forms.Forms.SetFlags("CollectionView_Experimental"); Xamarin.Essentials.Platform.Init(this, savedInstanceState); global::Xamarin.Forms.Forms.Init(this, savedInstanceState); + global::Xamarin.Forms.FormsMaterial.Init(this, savedInstanceState); LoadApplication(new App()); } public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Android.Content.PM.Permission[] grantResults) diff --git a/CarouselViewChallenge/CarouselViewChallenge.UWP/CarouselViewChallenge.UWP.csproj b/CarouselViewChallenge/CarouselViewChallenge.UWP/CarouselViewChallenge.UWP.csproj index 4b6b2c9..ff76e2e 100644 --- a/CarouselViewChallenge/CarouselViewChallenge.UWP/CarouselViewChallenge.UWP.csproj +++ b/CarouselViewChallenge/CarouselViewChallenge.UWP/CarouselViewChallenge.UWP.csproj @@ -148,6 +148,9 @@ + + 4.2.0.815419 + @@ -159,4 +162,4 @@ 14.0 - + \ No newline at end of file diff --git a/CarouselViewChallenge/CarouselViewChallenge.iOS/AppDelegate.cs b/CarouselViewChallenge/CarouselViewChallenge.iOS/AppDelegate.cs index 949500f..6804b51 100644 --- a/CarouselViewChallenge/CarouselViewChallenge.iOS/AppDelegate.cs +++ b/CarouselViewChallenge/CarouselViewChallenge.iOS/AppDelegate.cs @@ -23,7 +23,9 @@ public partial class AppDelegate : global::Xamarin.Forms.Platform.iOS.FormsAppli public override bool FinishedLaunching(UIApplication app, NSDictionary options) { global::Xamarin.Forms.Forms.SetFlags("CollectionView_Experimental"); + global::Xamarin.Forms.Forms.Init(); + global::Xamarin.Forms.FormsMaterial.Init(); LoadApplication(new App()); return base.FinishedLaunching(app, options); diff --git a/CarouselViewChallenge/CarouselViewChallenge.iOS/CarouselViewChallenge.iOS.csproj b/CarouselViewChallenge/CarouselViewChallenge.iOS/CarouselViewChallenge.iOS.csproj index 6241d2c..05e31c6 100644 --- a/CarouselViewChallenge/CarouselViewChallenge.iOS/CarouselViewChallenge.iOS.csproj +++ b/CarouselViewChallenge/CarouselViewChallenge.iOS/CarouselViewChallenge.iOS.csproj @@ -131,6 +131,12 @@ + + 4.2.0.815419 + + + 72.2.0.1 + @@ -139,4 +145,4 @@ CarouselViewChallenge - + \ No newline at end of file diff --git a/CarouselViewChallenge/CarouselViewChallenge/App.xaml.cs b/CarouselViewChallenge/CarouselViewChallenge/App.xaml.cs index a2fadf8..05e4ec0 100644 --- a/CarouselViewChallenge/CarouselViewChallenge/App.xaml.cs +++ b/CarouselViewChallenge/CarouselViewChallenge/App.xaml.cs @@ -2,6 +2,7 @@ using Xamarin.Forms; using Xamarin.Forms.Xaml; using CarouselViewChallenge.Views; +using MPD.Services; namespace CarouselViewChallenge { @@ -12,6 +13,8 @@ public App() { InitializeComponent(); + DependencyService.Register(); + MainPage = new AppShell(); } diff --git a/CarouselViewChallenge/CarouselViewChallenge/CarouselViewChallenge.csproj b/CarouselViewChallenge/CarouselViewChallenge/CarouselViewChallenge.csproj index a58ec88..326e8ab 100644 --- a/CarouselViewChallenge/CarouselViewChallenge/CarouselViewChallenge.csproj +++ b/CarouselViewChallenge/CarouselViewChallenge/CarouselViewChallenge.csproj @@ -7,11 +7,8 @@ - - - - - + + diff --git a/CarouselViewChallenge/CarouselViewChallenge/Models/Item.cs b/CarouselViewChallenge/CarouselViewChallenge/Models/Item.cs new file mode 100644 index 0000000..aca112d --- /dev/null +++ b/CarouselViewChallenge/CarouselViewChallenge/Models/Item.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Text; +using Xamarin.Forms; + +namespace CarouselViewChallenge.Models +{ + public class Item + { + public string Id { get; set; } + public string Text { get; set; } + public string Description { get; set; } + + public string Emoji { get; set; } + } +} diff --git a/CarouselViewChallenge/CarouselViewChallenge/Services/IDataStore.cs b/CarouselViewChallenge/CarouselViewChallenge/Services/IDataStore.cs new file mode 100644 index 0000000..4eba7b9 --- /dev/null +++ b/CarouselViewChallenge/CarouselViewChallenge/Services/IDataStore.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Threading.Tasks; + +namespace MPD.Services +{ + public interface IDataStore + { + Task AddItemAsync(T item); + Task UpdateItemAsync(T item); + Task DeleteItemAsync(string id); + Task GetItemAsync(string id); + Task> GetItemsAsync(bool forceRefresh = false); + } +} diff --git a/CarouselViewChallenge/CarouselViewChallenge/Services/MockDataStore.cs b/CarouselViewChallenge/CarouselViewChallenge/Services/MockDataStore.cs new file mode 100644 index 0000000..c51dc23 --- /dev/null +++ b/CarouselViewChallenge/CarouselViewChallenge/Services/MockDataStore.cs @@ -0,0 +1,70 @@ +using CarouselViewChallenge.Models; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Xamarin.Forms; + +namespace MPD.Services +{ + public class MockDataStore : IDataStore + { + List items; + + public MockDataStore() + { + items = new List(); + //new Image { Source = ImageSource.FromResource("CarouselViewChallenge.veg1.jpg", typeof(EmbeddedImages).GetTypeInfo().Assembly) + var mockItems = new List + { + new Item { Id = Guid.NewGuid().ToString(), Text = "First item", Description="This is an item description.",Emoji="😀" } , + new Item { Id = Guid.NewGuid().ToString(), Text = "Second item", Description="This is an item description.",Emoji="👱" }, + new Item { Id = Guid.NewGuid().ToString(), Text = "Third item", Description="This is an item description.",Emoji="🤓" }, + new Item { Id = Guid.NewGuid().ToString(), Text = "Fourth item", Description="This is an item description.",Emoji="👨" }, + new Item { Id = Guid.NewGuid().ToString(), Text = "Fifth item", Description="This is an item description.",Emoji="👨‍⚕️" }, + new Item { Id = Guid.NewGuid().ToString(), Text = "Sixth item", Description="This is an item description.",Emoji="👌" } + + + }; + + foreach (var item in mockItems) + { + items.Add(item); + } + } + + public async Task AddItemAsync(Item item) + { + items.Add(item); + + return await Task.FromResult(true); + } + + public async Task UpdateItemAsync(Item item) + { + var oldItem = items.Where((Item arg) => arg.Id == item.Id).FirstOrDefault(); + items.Remove(oldItem); + items.Add(item); + + return await Task.FromResult(true); + } + + public async Task DeleteItemAsync(string id) + { + var oldItem = items.Where((Item arg) => arg.Id == id).FirstOrDefault(); + items.Remove(oldItem); + + return await Task.FromResult(true); + } + + public async Task GetItemAsync(string id) + { + return await Task.FromResult(items.FirstOrDefault(s => s.Id == id)); + } + + public async Task> GetItemsAsync(bool forceRefresh = false) + { + return await Task.FromResult(items); + } + } +} \ No newline at end of file diff --git a/CarouselViewChallenge/CarouselViewChallenge/ViewModels/CarouselViewChallengeViewModel.cs b/CarouselViewChallenge/CarouselViewChallenge/ViewModels/CarouselViewChallengeViewModel.cs new file mode 100644 index 0000000..b0bd543 --- /dev/null +++ b/CarouselViewChallenge/CarouselViewChallenge/ViewModels/CarouselViewChallengeViewModel.cs @@ -0,0 +1,63 @@ +using CarouselViewChallenge.Models; +using MPD.Services; +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.ComponentModel; +using System.Text; +using System.Threading.Tasks; +using Xamarin.Forms; + +namespace CarouselViewChallenge.ViewModels +{ + public class CarouselViewChallengeViewModel : INotifyPropertyChanged + { + public event PropertyChangedEventHandler PropertyChanged; + + private void OnPropertyChanged(PropertyChangedEventArgs eventArgs) + { + PropertyChanged?.Invoke(this, eventArgs); + } + + public ObservableCollection Items { get; set; } + + public Item currentItem { get; set; } + + public IDataStore DataStore => DependencyService.Get>() ?? new MockDataStore(); + public Command LoadItemsCommand { get; set; } + public CarouselViewChallengeViewModel() + { + Items = new ObservableCollection(); + LoadItemsCommand = new Command(async () => await ExecuteLoadItemsCommand()); + } + + public async Task ExecuteLoadItemsCommand() + { + //if (IsBusy) + // return; + + //IsBusy = true; + //return; + try + { + Items.Clear(); + var items = await DataStore.GetItemsAsync(true); + foreach (var item in items) + { + Items.Add(item); + if (item.Text.Equals("Fourth item")) + currentItem = item; + } + + } + catch (Exception ex) + { + //Debug.WriteLine(ex); + } + finally + { + //IsBusy = false; + } + } + } +} diff --git a/CarouselViewChallenge/CarouselViewChallenge/ViewModels/WelcomePageViewModel.cs b/CarouselViewChallenge/CarouselViewChallenge/ViewModels/WelcomePageViewModel.cs index fdaa195..852a3b0 100644 --- a/CarouselViewChallenge/CarouselViewChallenge/ViewModels/WelcomePageViewModel.cs +++ b/CarouselViewChallenge/CarouselViewChallenge/ViewModels/WelcomePageViewModel.cs @@ -39,5 +39,7 @@ private void OnPropertyChanged(PropertyChangedEventArgs eventArgs) { PropertyChanged?.Invoke(this, eventArgs); } + + } } diff --git a/CarouselViewChallenge/CarouselViewChallenge/Views/CarouselViewChallengePage.xaml b/CarouselViewChallenge/CarouselViewChallenge/Views/CarouselViewChallengePage.xaml index 1a7cc0d..f597b41 100644 --- a/CarouselViewChallenge/CarouselViewChallenge/Views/CarouselViewChallengePage.xaml +++ b/CarouselViewChallenge/CarouselViewChallenge/Views/CarouselViewChallengePage.xaml @@ -5,9 +5,83 @@ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" x:Class="CarouselViewChallenge.Views.CarouselViewChallengePage"> + + + #000000 + + + + + + + + + + + + + \ No newline at end of file diff --git a/CarouselViewChallenge/CarouselViewChallenge/Views/CarouselViewChallengePage.xaml.cs b/CarouselViewChallenge/CarouselViewChallenge/Views/CarouselViewChallengePage.xaml.cs index 38f2e9f..3a3052e 100644 --- a/CarouselViewChallenge/CarouselViewChallenge/Views/CarouselViewChallengePage.xaml.cs +++ b/CarouselViewChallenge/CarouselViewChallenge/Views/CarouselViewChallengePage.xaml.cs @@ -1,4 +1,5 @@ -using System; +using CarouselViewChallenge.ViewModels; +using System; using System.Collections.Generic; using System.Linq; using System.Text; @@ -12,9 +13,29 @@ namespace CarouselViewChallenge.Views [XamlCompilation(XamlCompilationOptions.Compile)] public partial class CarouselViewChallengePage : ContentPage { + private CarouselViewChallengeViewModel viewModel; + private int tapCount = 0; public CarouselViewChallengePage() { InitializeComponent(); + viewModel = new CarouselViewChallengeViewModel(); + this.Carousel.BindingContext = viewModel; } - } + + protected async override void OnAppearing() + { + await viewModel.ExecuteLoadItemsCommand(); + } + + void OnTapGestureRecognizerTapped(object sender, EventArgs args) + { + tapCount++; + var labelSender = (Label)sender; + + if (tapCount % 2 == 0) + { + labelSender.Opacity = 0.50; + } + } + } } \ No newline at end of file