diff --git a/src/iOS.Core/Utilities/AccountSwitchingOverlayHelper.cs b/src/iOS.Core/Utilities/AccountSwitchingOverlayHelper.cs index 8812285bb..4cde4b941 100644 --- a/src/iOS.Core/Utilities/AccountSwitchingOverlayHelper.cs +++ b/src/iOS.Core/Utilities/AccountSwitchingOverlayHelper.cs @@ -1,4 +1,5 @@ -using System.Threading.Tasks; +using System; +using System.Threading.Tasks; using Bit.App.Controls; using Bit.Core.Abstractions; using Bit.Core.Utilities; @@ -10,6 +11,8 @@ namespace Bit.iOS.Core.Utilities { public class AccountSwitchingOverlayHelper { + const string DEFAULT_SYSTEM_AVATAR_IMAGE = "person.2"; + IStateService _stateService; IMessagingService _messagingService; ILogger _logger; @@ -23,9 +26,22 @@ namespace Bit.iOS.Core.Utilities public async Task CreateAvatarImageAsync() { - var avatarImageSource = new AvatarImageSource(await _stateService.GetNameAsync(), await _stateService.GetEmailAsync()); - var avatarUIImage = await avatarImageSource.GetNativeImageAsync(); - return avatarUIImage.ImageWithRenderingMode(UIImageRenderingMode.AlwaysOriginal); + try + { + if (_stateService is null) + { + throw new NullReferenceException(nameof(_stateService)); + } + + var avatarImageSource = new AvatarImageSource(await _stateService.GetNameAsync(), await _stateService.GetEmailAsync()); + var avatarUIImage = await avatarImageSource.GetNativeImageAsync(); + return avatarUIImage?.ImageWithRenderingMode(UIImageRenderingMode.AlwaysOriginal) ?? UIImage.GetSystemImage(DEFAULT_SYSTEM_AVATAR_IMAGE); + } + catch (Exception ex) + { + _logger.Exception(ex); + return UIImage.GetSystemImage(DEFAULT_SYSTEM_AVATAR_IMAGE); + } } public AccountSwitchingOverlayView CreateAccountSwitchingOverlayView(UIView containerView) diff --git a/src/iOS.Core/Utilities/ImageSourceExtensions.cs b/src/iOS.Core/Utilities/ImageSourceExtensions.cs index 25941a0bd..7fcf545cc 100644 --- a/src/iOS.Core/Utilities/ImageSourceExtensions.cs +++ b/src/iOS.Core/Utilities/ImageSourceExtensions.cs @@ -1,9 +1,9 @@ using System; using System.Threading; using System.Threading.Tasks; +using Bit.Core.Services; using UIKit; using Xamarin.Forms; -using Xamarin.Forms.Internals; using Xamarin.Forms.Platform.iOS; namespace Bit.iOS.Core.Utilities @@ -17,25 +17,29 @@ namespace Bit.iOS.Core.Utilities public static async Task GetNativeImageAsync(this ImageSource source, CancellationToken cancellationToken = default(CancellationToken)) { if (source == null || source.IsEmpty) + { return null; + } var handler = Xamarin.Forms.Internals.Registrar.Registered.GetHandlerForObject(source); if (handler == null) + { + LoggerHelper.LogEvenIfCantBeResolved(new InvalidOperationException("GetNativeImageAsync failed cause IImageSourceHandler couldn't be found")); return null; + } try { float scale = (float)UIScreen.MainScreen.Scale; - return await handler.LoadImageAsync(source, scale: scale, cancelationToken: cancellationToken); } catch (OperationCanceledException) { - Log.Warning("Image loading", "Image load cancelled"); + LoggerHelper.LogEvenIfCantBeResolved(new OperationCanceledException("GetNativeImageAsync was cancelled")); } catch (Exception ex) { - Log.Warning("Image loading", $"Image load failed: {ex}"); + LoggerHelper.LogEvenIfCantBeResolved(new InvalidOperationException("GetNativeImageAsync failed", ex)); } return null;