From b9ec9750a895a6020ee88593550404b40f3330a8 Mon Sep 17 00:00:00 2001 From: Vladislav Antonyuk Date: Mon, 21 Feb 2022 19:00:12 +0200 Subject: [PATCH 1/2] [Bug] GravatarImageSource throws exception when offline #1770 Fix Nullable --- samples/XCT.Sample.Android/SplashActivity.cs | 3 +- samples/XCT.Sample.sln | 20 ++++++------- .../Xamarin.CommunityToolkit.UnitTests.csproj | 2 +- .../StatusBar/PlatformStatusBarEffect.ios.cs | 4 +-- ...Handler.android.ios.macos.tizen.uwp.wpf.cs | 30 ++++++++++++------- .../Android/MediaElementRenderer.android.cs | 1 + .../iOS/MediaElementRenderer.ios.cs | 1 + .../Views/Snackbar/SnackBar.ios.macos.cs | 1 - ...n.CommunityToolkit.Markup.UnitTests.csproj | 2 +- 9 files changed, 37 insertions(+), 27 deletions(-) diff --git a/samples/XCT.Sample.Android/SplashActivity.cs b/samples/XCT.Sample.Android/SplashActivity.cs index 2883e4e55..3ee7de1a2 100644 --- a/samples/XCT.Sample.Android/SplashActivity.cs +++ b/samples/XCT.Sample.Android/SplashActivity.cs @@ -1,4 +1,5 @@ -using Android.App; +#nullable enable +using Android.App; using Android.Content; using Android.Content.PM; using Android.OS; diff --git a/samples/XCT.Sample.sln b/samples/XCT.Sample.sln index 260582d63..144cf4e22 100644 --- a/samples/XCT.Sample.sln +++ b/samples/XCT.Sample.sln @@ -1,6 +1,6 @@ Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 16 -VisualStudioVersion = 16.0.30204.135 +# Visual Studio Version 17 +VisualStudioVersion = 17.2.32210.308 MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Xamarin.CommunityToolkit.Sample.Android", "XCT.Sample.Android\Xamarin.CommunityToolkit.Sample.Android.csproj", "{8B80BFA6-7B19-4DE7-BD97-7D84194AD0C2}" EndProject @@ -20,8 +20,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution ProjectSection(SolutionItems) = preProject ..\.editorconfig = ..\.editorconfig ..\Directory.Build.props = ..\Directory.Build.props - ..\Xamarin.CommunityToolkit.ruleset = ..\Xamarin.CommunityToolkit.ruleset ..\global.json = ..\global.json + ..\Xamarin.CommunityToolkit.ruleset = ..\Xamarin.CommunityToolkit.ruleset EndProjectSection EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Xamarin.CommunityToolkit.Sample.WPF", "XCT.Sample.WPF\Xamarin.CommunityToolkit.Sample.WPF.csproj", "{C4D6CD2D-8DF4-4D46-936C-1AB31C87B5EA}" @@ -36,7 +36,7 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Xamarin.CommunityToolkit.Ma EndProject Project("{6EC3EE1D-3C4E-46DD-8F32-0CC8E7565705}") = "Xamarin.CommunityToolkit.Sample.FSharp", "XCT.Sample.FSharp\Xamarin.CommunityToolkit.Sample.FSharp.fsproj", "{D5C2D19A-E929-4587-A9DE-FA50E46AAB59}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Xamarin.CommunityToolkit.SourceGenerator", "..\src\SourceGenerator\Xamarin.CommunityToolkit.SourceGenerator\Xamarin.CommunityToolkit.SourceGenerator.csproj", "{47143F45-FF3B-4F74-9697-212886E9967E}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Xamarin.CommunityToolkit.SourceGenerator", "..\src\SourceGenerator\Xamarin.CommunityToolkit.SourceGenerator\Xamarin.CommunityToolkit.SourceGenerator.csproj", "{47143F45-FF3B-4F74-9697-212886E9967E}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -80,9 +80,9 @@ Global {8B80BFA6-7B19-4DE7-BD97-7D84194AD0C2}.Release|x64.Build.0 = Release|Any CPU {8B80BFA6-7B19-4DE7-BD97-7D84194AD0C2}.Release|x86.ActiveCfg = Release|Any CPU {8B80BFA6-7B19-4DE7-BD97-7D84194AD0C2}.Release|x86.Build.0 = Release|Any CPU - {B10BD8BF-43EA-4F95-BE5C-42ED8028CC6B}.Debug|Any CPU.ActiveCfg = Debug|iPhone - {B10BD8BF-43EA-4F95-BE5C-42ED8028CC6B}.Debug|Any CPU.Build.0 = Debug|iPhone - {B10BD8BF-43EA-4F95-BE5C-42ED8028CC6B}.Debug|Any CPU.Deploy.0 = Debug|iPhone + {B10BD8BF-43EA-4F95-BE5C-42ED8028CC6B}.Debug|Any CPU.ActiveCfg = Debug|iPhoneSimulator + {B10BD8BF-43EA-4F95-BE5C-42ED8028CC6B}.Debug|Any CPU.Build.0 = Debug|iPhoneSimulator + {B10BD8BF-43EA-4F95-BE5C-42ED8028CC6B}.Debug|Any CPU.Deploy.0 = Debug|iPhoneSimulator {B10BD8BF-43EA-4F95-BE5C-42ED8028CC6B}.Debug|ARM.ActiveCfg = Debug|iPhoneSimulator {B10BD8BF-43EA-4F95-BE5C-42ED8028CC6B}.Debug|iPhone.ActiveCfg = Debug|iPhone {B10BD8BF-43EA-4F95-BE5C-42ED8028CC6B}.Debug|iPhone.Build.0 = Debug|iPhone @@ -182,9 +182,9 @@ Global {54B7812B-45A5-4FE2-9CEA-C5F17D65BDE9}.Release|x64.Build.0 = Release|Any CPU {54B7812B-45A5-4FE2-9CEA-C5F17D65BDE9}.Release|x86.ActiveCfg = Release|Any CPU {54B7812B-45A5-4FE2-9CEA-C5F17D65BDE9}.Release|x86.Build.0 = Release|Any CPU - {91C748B4-E9ED-4543-880A-26747B03DE3A}.Debug|Any CPU.ActiveCfg = Debug|x86 - {91C748B4-E9ED-4543-880A-26747B03DE3A}.Debug|Any CPU.Build.0 = Debug|x86 - {91C748B4-E9ED-4543-880A-26747B03DE3A}.Debug|Any CPU.Deploy.0 = Debug|x86 + {91C748B4-E9ED-4543-880A-26747B03DE3A}.Debug|Any CPU.ActiveCfg = Debug|x64 + {91C748B4-E9ED-4543-880A-26747B03DE3A}.Debug|Any CPU.Build.0 = Debug|x64 + {91C748B4-E9ED-4543-880A-26747B03DE3A}.Debug|Any CPU.Deploy.0 = Debug|x64 {91C748B4-E9ED-4543-880A-26747B03DE3A}.Debug|ARM.ActiveCfg = Debug|ARM {91C748B4-E9ED-4543-880A-26747B03DE3A}.Debug|ARM.Build.0 = Debug|ARM {91C748B4-E9ED-4543-880A-26747B03DE3A}.Debug|ARM.Deploy.0 = Debug|ARM diff --git a/src/CommunityToolkit/Xamarin.CommunityToolkit.UnitTests/Xamarin.CommunityToolkit.UnitTests.csproj b/src/CommunityToolkit/Xamarin.CommunityToolkit.UnitTests/Xamarin.CommunityToolkit.UnitTests.csproj index 2839ce1cb..4bd4b72db 100644 --- a/src/CommunityToolkit/Xamarin.CommunityToolkit.UnitTests/Xamarin.CommunityToolkit.UnitTests.csproj +++ b/src/CommunityToolkit/Xamarin.CommunityToolkit.UnitTests/Xamarin.CommunityToolkit.UnitTests.csproj @@ -1,7 +1,7 @@  - netcoreapp2.1;netcoreapp3.1;net461 + netcoreapp3.1;net461 false diff --git a/src/CommunityToolkit/Xamarin.CommunityToolkit/Effects/StatusBar/PlatformStatusBarEffect.ios.cs b/src/CommunityToolkit/Xamarin.CommunityToolkit/Effects/StatusBar/PlatformStatusBarEffect.ios.cs index fc0cfabb1..bfc8ab90b 100644 --- a/src/CommunityToolkit/Xamarin.CommunityToolkit/Effects/StatusBar/PlatformStatusBarEffect.ios.cs +++ b/src/CommunityToolkit/Xamarin.CommunityToolkit/Effects/StatusBar/PlatformStatusBarEffect.ios.cs @@ -99,9 +99,9 @@ static void UpdateStatusBarAppearance() } } - static void UpdateStatusBarAppearance(UIWindow window) + static void UpdateStatusBarAppearance(UIWindow? window) { - var vc = window.RootViewController ?? throw new NullReferenceException(nameof(window.RootViewController)); + var vc = window?.RootViewController ?? throw new NullReferenceException(nameof(window.RootViewController)); while (vc.PresentedViewController != null) { vc = vc.PresentedViewController; diff --git a/src/CommunityToolkit/Xamarin.CommunityToolkit/Views/GravatarImageSource/Shared/GravatarImageSourceHandler.android.ios.macos.tizen.uwp.wpf.cs b/src/CommunityToolkit/Xamarin.CommunityToolkit/Views/GravatarImageSource/Shared/GravatarImageSourceHandler.android.ios.macos.tizen.uwp.wpf.cs index 473c8e182..1df10474a 100644 --- a/src/CommunityToolkit/Xamarin.CommunityToolkit/Views/GravatarImageSource/Shared/GravatarImageSourceHandler.android.ios.macos.tizen.uwp.wpf.cs +++ b/src/CommunityToolkit/Xamarin.CommunityToolkit/Views/GravatarImageSource/Shared/GravatarImageSourceHandler.android.ios.macos.tizen.uwp.wpf.cs @@ -1,4 +1,5 @@ using System; +using System.Diagnostics; using System.IO; using System.Net.Http; using System.Security.Cryptography; @@ -12,8 +13,8 @@ namespace Xamarin.CommunityToolkit.UI.Views public partial class GravatarImageSourceHandler { const string requestUriFormat = "https://www.gravatar.com/avatar/{0}?s={1}&d={2}"; - static readonly Lazy lazyHttp = new Lazy(() => new HttpClient()); - static readonly SemaphoreSlim semaphore = new SemaphoreSlim(1); + static readonly Lazy lazyHttp = new(() => new HttpClient()); + static readonly SemaphoreSlim semaphore = new(1); public static async Task LoadInternal(ImageSource imageSource, float scale, string cacheDirectory) { @@ -26,7 +27,7 @@ public partial class GravatarImageSourceHandler { _ = gis.Email ?? throw new InvalidOperationException($"{nameof(gis.Email)} is not initialized"); var imageBytes = await GetGravatarAsync(gis.Email, gis.Size, scale, gis.Default); - await SaveImage(cacheFileInfo, imageBytes ?? Array.Empty()); + await SaveImage(cacheFileInfo, imageBytes); } return cacheFileInfo; @@ -67,7 +68,7 @@ static async Task UseCacheFile(bool cachingEnabled, TimeSpan cacheValidity { await semaphore.WaitAsync(); - if (!file.Directory.Exists) + if (file.Directory is { Exists: false }) file.Directory.Create(); } finally @@ -87,12 +88,20 @@ static string CacheFileName(GravatarImageSource gis, float scale) static async Task GetGravatarAsync(string email, int size, float scale, DefaultGravatar defaultGravatar) { var requestUri = GetGravatarUri(email, size, scale, defaultGravatar); - using var response = await lazyHttp.Value.GetAsync(requestUri); + try + { + using var response = await lazyHttp.Value.GetAsync(requestUri); - if (!response.IsSuccessStatusCode) - return Array.Empty(); + if (!response.IsSuccessStatusCode) + return Array.Empty(); - return await response.Content.ReadAsByteArrayAsync(); + return await response.Content.ReadAsByteArrayAsync(); + } + catch (Exception e) + { + Trace.WriteLine(e.Message); + return Array.Empty(); + } } static string GetGravatarUri(string email, int size, float scale, DefaultGravatar defaultGravatar) @@ -113,10 +122,9 @@ static string GetMd5Hash(string str) var sBuilder = new StringBuilder(); - if (hash != null) + foreach (var hashByte in hash) { - for (var i = 0; i < hash.Length; i++) - sBuilder.Append(hash[i].ToString("x2")); + sBuilder.Append(hashByte.ToString("x2")); } return sBuilder.ToString(); diff --git a/src/CommunityToolkit/Xamarin.CommunityToolkit/Views/MediaElement/Android/MediaElementRenderer.android.cs b/src/CommunityToolkit/Xamarin.CommunityToolkit/Views/MediaElement/Android/MediaElementRenderer.android.cs index d3ff7ef48..8336f4925 100644 --- a/src/CommunityToolkit/Xamarin.CommunityToolkit/Views/MediaElement/Android/MediaElementRenderer.android.cs +++ b/src/CommunityToolkit/Xamarin.CommunityToolkit/Views/MediaElement/Android/MediaElementRenderer.android.cs @@ -375,6 +375,7 @@ protected void UpdateVolume() mediaPlayer?.SetVolume((float)MediaElement.Volume, (float)MediaElement.Volume); } + protected void UpdateSpeed() { if (MediaElement == null || mediaPlayer == null) diff --git a/src/CommunityToolkit/Xamarin.CommunityToolkit/Views/MediaElement/iOS/MediaElementRenderer.ios.cs b/src/CommunityToolkit/Xamarin.CommunityToolkit/Views/MediaElement/iOS/MediaElementRenderer.ios.cs index fc0088f5a..3042a0729 100644 --- a/src/CommunityToolkit/Xamarin.CommunityToolkit/Views/MediaElement/iOS/MediaElementRenderer.ios.cs +++ b/src/CommunityToolkit/Xamarin.CommunityToolkit/Views/MediaElement/iOS/MediaElementRenderer.ios.cs @@ -312,6 +312,7 @@ void UpdateVolume() if (avPlayerViewController.Player != null) avPlayerViewController.Player.Volume = (float)Element.Volume; } + void UpdateSpeed() { if (avPlayerViewController.Player != null) diff --git a/src/CommunityToolkit/Xamarin.CommunityToolkit/Views/Snackbar/SnackBar.ios.macos.cs b/src/CommunityToolkit/Xamarin.CommunityToolkit/Views/Snackbar/SnackBar.ios.macos.cs index 614948f21..e87df647e 100644 --- a/src/CommunityToolkit/Xamarin.CommunityToolkit/Views/Snackbar/SnackBar.ios.macos.cs +++ b/src/CommunityToolkit/Xamarin.CommunityToolkit/Views/Snackbar/SnackBar.ios.macos.cs @@ -1,7 +1,6 @@ using System; using System.Threading.Tasks; using Xamarin.CommunityToolkit.UI.Views.Helpers; -using Xamarin.CommunityToolkit.UI.Views.Helpers; using Xamarin.CommunityToolkit.UI.Views.Options; using Xamarin.CommunityToolkit.Views.Snackbar.Helpers; using Xamarin.Forms; diff --git a/src/Markup/Xamarin.CommunityToolkit.Markup.UnitTests/Xamarin.CommunityToolkit.Markup.UnitTests.csproj b/src/Markup/Xamarin.CommunityToolkit.Markup.UnitTests/Xamarin.CommunityToolkit.Markup.UnitTests.csproj index 5ea5cb2e1..b3c8ec995 100644 --- a/src/Markup/Xamarin.CommunityToolkit.Markup.UnitTests/Xamarin.CommunityToolkit.Markup.UnitTests.csproj +++ b/src/Markup/Xamarin.CommunityToolkit.Markup.UnitTests/Xamarin.CommunityToolkit.Markup.UnitTests.csproj @@ -1,7 +1,7 @@  - netcoreapp2.1;netcoreapp3.1;net461 + netcoreapp3.1;net461 false From e9d55dadf1806ca08755d3024b09934f0b7c5414 Mon Sep 17 00:00:00 2001 From: Vladislav Antonyuk Date: Mon, 21 Feb 2022 23:22:30 +0200 Subject: [PATCH 2/2] ConfigureAwait, revert sln --- samples/XCT.Sample.sln | 20 +++++++++---------- ...Handler.android.ios.macos.tizen.uwp.wpf.cs | 2 +- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/samples/XCT.Sample.sln b/samples/XCT.Sample.sln index 144cf4e22..260582d63 100644 --- a/samples/XCT.Sample.sln +++ b/samples/XCT.Sample.sln @@ -1,6 +1,6 @@ Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 17 -VisualStudioVersion = 17.2.32210.308 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.30204.135 MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Xamarin.CommunityToolkit.Sample.Android", "XCT.Sample.Android\Xamarin.CommunityToolkit.Sample.Android.csproj", "{8B80BFA6-7B19-4DE7-BD97-7D84194AD0C2}" EndProject @@ -20,8 +20,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution ProjectSection(SolutionItems) = preProject ..\.editorconfig = ..\.editorconfig ..\Directory.Build.props = ..\Directory.Build.props - ..\global.json = ..\global.json ..\Xamarin.CommunityToolkit.ruleset = ..\Xamarin.CommunityToolkit.ruleset + ..\global.json = ..\global.json EndProjectSection EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Xamarin.CommunityToolkit.Sample.WPF", "XCT.Sample.WPF\Xamarin.CommunityToolkit.Sample.WPF.csproj", "{C4D6CD2D-8DF4-4D46-936C-1AB31C87B5EA}" @@ -36,7 +36,7 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Xamarin.CommunityToolkit.Ma EndProject Project("{6EC3EE1D-3C4E-46DD-8F32-0CC8E7565705}") = "Xamarin.CommunityToolkit.Sample.FSharp", "XCT.Sample.FSharp\Xamarin.CommunityToolkit.Sample.FSharp.fsproj", "{D5C2D19A-E929-4587-A9DE-FA50E46AAB59}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Xamarin.CommunityToolkit.SourceGenerator", "..\src\SourceGenerator\Xamarin.CommunityToolkit.SourceGenerator\Xamarin.CommunityToolkit.SourceGenerator.csproj", "{47143F45-FF3B-4F74-9697-212886E9967E}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Xamarin.CommunityToolkit.SourceGenerator", "..\src\SourceGenerator\Xamarin.CommunityToolkit.SourceGenerator\Xamarin.CommunityToolkit.SourceGenerator.csproj", "{47143F45-FF3B-4F74-9697-212886E9967E}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -80,9 +80,9 @@ Global {8B80BFA6-7B19-4DE7-BD97-7D84194AD0C2}.Release|x64.Build.0 = Release|Any CPU {8B80BFA6-7B19-4DE7-BD97-7D84194AD0C2}.Release|x86.ActiveCfg = Release|Any CPU {8B80BFA6-7B19-4DE7-BD97-7D84194AD0C2}.Release|x86.Build.0 = Release|Any CPU - {B10BD8BF-43EA-4F95-BE5C-42ED8028CC6B}.Debug|Any CPU.ActiveCfg = Debug|iPhoneSimulator - {B10BD8BF-43EA-4F95-BE5C-42ED8028CC6B}.Debug|Any CPU.Build.0 = Debug|iPhoneSimulator - {B10BD8BF-43EA-4F95-BE5C-42ED8028CC6B}.Debug|Any CPU.Deploy.0 = Debug|iPhoneSimulator + {B10BD8BF-43EA-4F95-BE5C-42ED8028CC6B}.Debug|Any CPU.ActiveCfg = Debug|iPhone + {B10BD8BF-43EA-4F95-BE5C-42ED8028CC6B}.Debug|Any CPU.Build.0 = Debug|iPhone + {B10BD8BF-43EA-4F95-BE5C-42ED8028CC6B}.Debug|Any CPU.Deploy.0 = Debug|iPhone {B10BD8BF-43EA-4F95-BE5C-42ED8028CC6B}.Debug|ARM.ActiveCfg = Debug|iPhoneSimulator {B10BD8BF-43EA-4F95-BE5C-42ED8028CC6B}.Debug|iPhone.ActiveCfg = Debug|iPhone {B10BD8BF-43EA-4F95-BE5C-42ED8028CC6B}.Debug|iPhone.Build.0 = Debug|iPhone @@ -182,9 +182,9 @@ Global {54B7812B-45A5-4FE2-9CEA-C5F17D65BDE9}.Release|x64.Build.0 = Release|Any CPU {54B7812B-45A5-4FE2-9CEA-C5F17D65BDE9}.Release|x86.ActiveCfg = Release|Any CPU {54B7812B-45A5-4FE2-9CEA-C5F17D65BDE9}.Release|x86.Build.0 = Release|Any CPU - {91C748B4-E9ED-4543-880A-26747B03DE3A}.Debug|Any CPU.ActiveCfg = Debug|x64 - {91C748B4-E9ED-4543-880A-26747B03DE3A}.Debug|Any CPU.Build.0 = Debug|x64 - {91C748B4-E9ED-4543-880A-26747B03DE3A}.Debug|Any CPU.Deploy.0 = Debug|x64 + {91C748B4-E9ED-4543-880A-26747B03DE3A}.Debug|Any CPU.ActiveCfg = Debug|x86 + {91C748B4-E9ED-4543-880A-26747B03DE3A}.Debug|Any CPU.Build.0 = Debug|x86 + {91C748B4-E9ED-4543-880A-26747B03DE3A}.Debug|Any CPU.Deploy.0 = Debug|x86 {91C748B4-E9ED-4543-880A-26747B03DE3A}.Debug|ARM.ActiveCfg = Debug|ARM {91C748B4-E9ED-4543-880A-26747B03DE3A}.Debug|ARM.Build.0 = Debug|ARM {91C748B4-E9ED-4543-880A-26747B03DE3A}.Debug|ARM.Deploy.0 = Debug|ARM diff --git a/src/CommunityToolkit/Xamarin.CommunityToolkit/Views/GravatarImageSource/Shared/GravatarImageSourceHandler.android.ios.macos.tizen.uwp.wpf.cs b/src/CommunityToolkit/Xamarin.CommunityToolkit/Views/GravatarImageSource/Shared/GravatarImageSourceHandler.android.ios.macos.tizen.uwp.wpf.cs index 1df10474a..d0bd9bd56 100644 --- a/src/CommunityToolkit/Xamarin.CommunityToolkit/Views/GravatarImageSource/Shared/GravatarImageSourceHandler.android.ios.macos.tizen.uwp.wpf.cs +++ b/src/CommunityToolkit/Xamarin.CommunityToolkit/Views/GravatarImageSource/Shared/GravatarImageSourceHandler.android.ios.macos.tizen.uwp.wpf.cs @@ -95,7 +95,7 @@ static async Task GetGravatarAsync(string email, int size, float scale, if (!response.IsSuccessStatusCode) return Array.Empty(); - return await response.Content.ReadAsByteArrayAsync(); + return await response.Content.ReadAsByteArrayAsync().ConfigureAwait(false); } catch (Exception e) {