diff --git a/CodingCoach/CodingCoach.Android/CodingCoach.Android.csproj b/CodingCoach/CodingCoach.Android/CodingCoach.Android.csproj index 65dba3d..c1a92cb 100644 --- a/CodingCoach/CodingCoach.Android/CodingCoach.Android.csproj +++ b/CodingCoach/CodingCoach.Android/CodingCoach.Android.csproj @@ -15,7 +15,6 @@ Properties\AndroidManifest.xml Resources Assets - false v8.1 Xamarin.Android.Net.AndroidClientHandler @@ -68,6 +67,9 @@ + + 1.1.0 + @@ -114,7 +116,7 @@ - {629F997C-32F2-490C-AAA4-4A7A90FFC498} + {6E5D64F0-404D-4831-B324-F5A6D2171988} CodingCoach diff --git a/CodingCoach/CodingCoach.Android/MainActivity.cs b/CodingCoach/CodingCoach.Android/MainActivity.cs index 7b496a8..fb3d0ce 100644 --- a/CodingCoach/CodingCoach.Android/MainActivity.cs +++ b/CodingCoach/CodingCoach.Android/MainActivity.cs @@ -1,11 +1,7 @@ -using System; - using Android.App; using Android.Content.PM; -using Android.Runtime; -using Android.Views; -using Android.Widget; using Android.OS; +using Android.Runtime; using ImageCircle.Forms.Plugin.Droid; namespace CodingCoach.Droid @@ -19,9 +15,16 @@ protected override void OnCreate(Bundle savedInstanceState) ToolbarResource = Resource.Layout.Toolbar; base.OnCreate(savedInstanceState); + Xamarin.Essentials.Platform.Init(this, savedInstanceState); global::Xamarin.Forms.Forms.Init(this, savedInstanceState); ImageCircleRenderer.Init(); - LoadApplication(new App()); + LoadApplication(new App()); + } + + public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Android.Content.PM.Permission[] grantResults) + { + Xamarin.Essentials.Platform.OnRequestPermissionsResult(requestCode, permissions, grantResults); + base.OnRequestPermissionsResult(requestCode, permissions, grantResults); } } } \ No newline at end of file diff --git a/CodingCoach/CodingCoach.Android/Properties/AndroidManifest.xml b/CodingCoach/CodingCoach.Android/Properties/AndroidManifest.xml index 6ae3b3d..1fbc58d 100644 --- a/CodingCoach/CodingCoach.Android/Properties/AndroidManifest.xml +++ b/CodingCoach/CodingCoach.Android/Properties/AndroidManifest.xml @@ -1,5 +1,5 @@ - + - - - + + + \ No newline at end of file diff --git a/CodingCoach/CodingCoach.iOS/CodingCoach.iOS.csproj b/CodingCoach/CodingCoach.iOS/CodingCoach.iOS.csproj index 0a81beb..2629934 100644 --- a/CodingCoach/CodingCoach.iOS/CodingCoach.iOS.csproj +++ b/CodingCoach/CodingCoach.iOS/CodingCoach.iOS.csproj @@ -164,11 +164,14 @@ 3.0.0.5 + + 1.1.0 + - {629F997C-32F2-490C-AAA4-4A7A90FFC498} + {6E5D64F0-404D-4831-B324-F5A6D2171988} CodingCoach diff --git a/CodingCoach/CodingCoach/CodingCoach.csproj b/CodingCoach/CodingCoach/CodingCoach.csproj index 9b8d9e2..9105896 100644 --- a/CodingCoach/CodingCoach/CodingCoach.csproj +++ b/CodingCoach/CodingCoach/CodingCoach.csproj @@ -32,6 +32,7 @@ + @@ -41,9 +42,6 @@ - - Never - MSBuild:UpdateDesignTimeXaml diff --git a/CodingCoach/CodingCoach/Models/Constants.cs b/CodingCoach/CodingCoach/Models/Constants.cs new file mode 100644 index 0000000..e0c45aa --- /dev/null +++ b/CodingCoach/CodingCoach/Models/Constants.cs @@ -0,0 +1,14 @@ +using System; + +namespace CodingCoach.Models.Constants +{ + public class Urls + { + public const string Slack = "https://join.slack.com/t/coding-coach/shared_invite/enQtNDYxNTcwMjk4MDcwLThiZjY1MTM2YTU1YzM2MGI1N2Y1NDI3ZGM1MGRhNjdiZjU0MzE1YjMxZjdlZmVlNDdhNmFhN2RhNGIxZmE1YTI"; + } + + public class Emails + { + public const string Contact = "codingcoachio@gmail.com"; + } +} \ No newline at end of file diff --git a/CodingCoach/CodingCoach/Models/HomeMenuItem.cs b/CodingCoach/CodingCoach/Models/HomeMenuItem.cs index 754df8c..30389c3 100644 --- a/CodingCoach/CodingCoach/Models/HomeMenuItem.cs +++ b/CodingCoach/CodingCoach/Models/HomeMenuItem.cs @@ -1,18 +1,16 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace CodingCoach.Models +namespace CodingCoach.Models { - public enum MenuItemType - { - Browse, - About - } - public class HomeMenuItem - { - public MenuItemType Id { get; set; } + public enum MenuItemType + { + Browse, + About, + Contact + } + + public class HomeMenuItem + { + public MenuItemType Id { get; set; } - public string Title { get; set; } - } -} + public string Title { get; set; } + } +} \ No newline at end of file diff --git a/CodingCoach/CodingCoach/ViewModels/ContactViewModel.cs b/CodingCoach/CodingCoach/ViewModels/ContactViewModel.cs new file mode 100644 index 0000000..7758b69 --- /dev/null +++ b/CodingCoach/CodingCoach/ViewModels/ContactViewModel.cs @@ -0,0 +1,36 @@ +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using System.Windows.Input; +using Xamarin.Essentials; +using Xamarin.Forms; + +namespace CodingCoach.ViewModels +{ + public class ContactViewModel : BaseViewModel + { + private ICommand _slackCommand; + public ICommand SlackCommand => _slackCommand ?? (_slackCommand = new Command(OpenSlack)); + + private ICommand _emailCommand; + public ICommand EmailCommand => _emailCommand ?? (_emailCommand = new Command(async () => await ComposeEmail())); + + public ContactViewModel() + { + Title = "Contact"; + } + + private void OpenSlack() + { + Device.OpenUri(new Uri(Models.Constants.Urls.Slack)); + } + + private Task ComposeEmail() + { + //Remark: This will only work on a real iOS device and not on iOS simulator + //https://github.com/xamarin/Essentials/issues/370 + + return Email.ComposeAsync(new EmailMessage() { To = new List() { Models.Constants.Emails.Contact } }); + } + } +} \ No newline at end of file diff --git a/CodingCoach/CodingCoach/Views/ContactPage.xaml b/CodingCoach/CodingCoach/Views/ContactPage.xaml new file mode 100644 index 0000000..f954603 --- /dev/null +++ b/CodingCoach/CodingCoach/Views/ContactPage.xaml @@ -0,0 +1,34 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/CodingCoach/CodingCoach/Views/ContactPage.xaml.cs b/CodingCoach/CodingCoach/Views/ContactPage.xaml.cs new file mode 100644 index 0000000..86efbee --- /dev/null +++ b/CodingCoach/CodingCoach/Views/ContactPage.xaml.cs @@ -0,0 +1,12 @@ +using Xamarin.Forms; + +namespace CodingCoach.Views +{ + public partial class ContactPage : ContentPage + { + public ContactPage() + { + InitializeComponent(); + } + } +} \ No newline at end of file diff --git a/CodingCoach/CodingCoach/Views/ItemsPage.xaml.cs b/CodingCoach/CodingCoach/Views/ItemsPage.xaml.cs index 9a00c38..7bbbd24 100644 --- a/CodingCoach/CodingCoach/Views/ItemsPage.xaml.cs +++ b/CodingCoach/CodingCoach/Views/ItemsPage.xaml.cs @@ -1,19 +1,14 @@ using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; using Xamarin.Forms; using Xamarin.Forms.Xaml; using CodingCoach.Models; -using CodingCoach.Views; using CodingCoach.ViewModels; namespace CodingCoach.Views { - [XamlCompilation(XamlCompilationOptions.Compile)] + [XamlCompilation(XamlCompilationOptions.Compile)] public partial class ItemsPage : ContentPage { ItemsViewModel viewModel; diff --git a/CodingCoach/CodingCoach/Views/MainPage.xaml.cs b/CodingCoach/CodingCoach/Views/MainPage.xaml.cs index 7fd3036..02252f6 100644 --- a/CodingCoach/CodingCoach/Views/MainPage.xaml.cs +++ b/CodingCoach/CodingCoach/Views/MainPage.xaml.cs @@ -1,5 +1,4 @@ using CodingCoach.Models; -using System; using System.Collections.Generic; using System.Threading.Tasks; using Xamarin.Forms; @@ -7,45 +6,48 @@ namespace CodingCoach.Views { - [XamlCompilation(XamlCompilationOptions.Compile)] - public partial class MainPage : MasterDetailPage - { - Dictionary MenuPages = new Dictionary(); - public MainPage() - { - InitializeComponent(); - - MasterBehavior = MasterBehavior.Popover; - - MenuPages.Add((int)MenuItemType.Browse, (NavigationPage)Detail); - } - - public async Task NavigateFromMenu(int id) - { - if (!MenuPages.ContainsKey(id)) - { - switch (id) + [XamlCompilation(XamlCompilationOptions.Compile)] + public partial class MainPage : MasterDetailPage + { + Dictionary MenuPages = new Dictionary(); + public MainPage() + { + InitializeComponent(); + + MasterBehavior = MasterBehavior.Popover; + + MenuPages.Add((int)MenuItemType.Browse, (NavigationPage)Detail); + } + + public async Task NavigateFromMenu(int id) + { + if (!MenuPages.ContainsKey(id)) { - case (int)MenuItemType.Browse: - MenuPages.Add(id, new NavigationPage(new ItemsPage())); - break; - case (int)MenuItemType.About: - MenuPages.Add(id, new NavigationPage(new AboutPage())); - break; + switch (id) + { + case (int)MenuItemType.Browse: + MenuPages.Add(id, new NavigationPage(new ItemsPage())); + break; + case (int)MenuItemType.About: + MenuPages.Add(id, new NavigationPage(new AboutPage())); + break; + case (int)MenuItemType.Contact: + MenuPages.Add(id, new NavigationPage(new ContactPage())); + break; + } } - } - var newPage = MenuPages[id]; + var newPage = MenuPages[id]; - if (newPage != null && Detail != newPage) - { - Detail = newPage; + if (newPage != null && Detail != newPage) + { + Detail = newPage; - if (Device.RuntimePlatform == Device.Android) - await Task.Delay(100); + if (Device.RuntimePlatform == Device.Android) + await Task.Delay(100); - IsPresented = false; - } - } - } + IsPresented = false; + } + } + } } \ No newline at end of file diff --git a/CodingCoach/CodingCoach/Views/MenuPage.xaml.cs b/CodingCoach/CodingCoach/Views/MenuPage.xaml.cs index 897cf85..f0a41c6 100644 --- a/CodingCoach/CodingCoach/Views/MenuPage.xaml.cs +++ b/CodingCoach/CodingCoach/Views/MenuPage.xaml.cs @@ -19,7 +19,8 @@ public MenuPage() menuItems = new List { new HomeMenuItem {Id = MenuItemType.Browse, Title="Mentors" }, - new HomeMenuItem {Id = MenuItemType.About, Title="About" } + new HomeMenuItem {Id = MenuItemType.About, Title="About" }, + new HomeMenuItem {Id = MenuItemType.Contact, Title="Contact" } }; ListViewMenu.ItemsSource = menuItems;