From 650b30ca032c475caaeeb7ba26941a308a057ae9 Mon Sep 17 00:00:00 2001 From: Emmanuel Hansen Date: Mon, 27 Apr 2026 10:54:09 +0000 Subject: [PATCH] [ANDROID] Make ToplevelImpl._view nullable. (#21270) * mark ToplevelImpl._view as nullable. * Update src/Android/Avalonia.Android/Platform/SkiaPlatform/TopLevelImpl.cs Co-authored-by: Max Katz * return 1 as default scaling in android TopLevelImpl --------- Co-authored-by: Max Katz --- src/Android/Avalonia.Android/AvaloniaView.cs | 6 ++-- .../Platform/AndroidScreens.cs | 2 +- .../Platform/SkiaPlatform/TopLevelImpl.cs | 36 +++++++++---------- 3 files changed, 22 insertions(+), 22 deletions(-) diff --git a/src/Android/Avalonia.Android/AvaloniaView.cs b/src/Android/Avalonia.Android/AvaloniaView.cs index d8df486bb3..f1c3b95aa1 100644 --- a/src/Android/Avalonia.Android/AvaloniaView.cs +++ b/src/Android/Avalonia.Android/AvaloniaView.cs @@ -35,10 +35,10 @@ namespace Avalonia.Android _root = new EmbeddableControlRoot(_view); _root.Prepare(); - this.SetBackgroundColor(global::Android.Graphics.Color.Transparent); + SetBackgroundColor(global::Android.Graphics.Color.Transparent); OnConfigurationChanged(); - _view.InternalView.SurfaceWindowCreated += InternalView_SurfaceWindowCreated; + _view.InternalView!.SurfaceWindowCreated += InternalView_SurfaceWindowCreated; _view.InternalView.SurfaceWindowDestroyed += InternalView_SurfaceWindowDestroyed; _accessHelper = new AvaloniaAccessHelper(this); @@ -141,7 +141,7 @@ namespace Avalonia.Android { public ViewImpl(AvaloniaView avaloniaView) : base(avaloniaView) { - View.FocusChange += ViewImpl_FocusChange; + View!.FocusChange += ViewImpl_FocusChange; } private void ViewImpl_FocusChange(object? sender, FocusChangeEventArgs e) diff --git a/src/Android/Avalonia.Android/Platform/AndroidScreens.cs b/src/Android/Avalonia.Android/Platform/AndroidScreens.cs index 9b0f1bee38..a54a4cbdb8 100644 --- a/src/Android/Avalonia.Android/Platform/AndroidScreens.cs +++ b/src/Android/Avalonia.Android/Platform/AndroidScreens.cs @@ -125,7 +125,7 @@ internal sealed class AndroidScreens : ScreensBase, IDis protected override Screen? ScreenFromTopLevelCore(ITopLevelImpl topLevel) { - var display = ((TopLevelImpl)topLevel).View.Display; + var display = ((TopLevelImpl)topLevel).View?.Display; return display is not null && TryGetScreen(display, out var screen) ? screen : null; } diff --git a/src/Android/Avalonia.Android/Platform/SkiaPlatform/TopLevelImpl.cs b/src/Android/Avalonia.Android/Platform/SkiaPlatform/TopLevelImpl.cs index da128cec96..eecb2ecc24 100644 --- a/src/Android/Avalonia.Android/Platform/SkiaPlatform/TopLevelImpl.cs +++ b/src/Android/Avalonia.Android/Platform/SkiaPlatform/TopLevelImpl.cs @@ -19,8 +19,8 @@ using Avalonia.Input.Raw; using Avalonia.Input.TextInput; using Avalonia.OpenGL.Egl; using Avalonia.Platform; -using Avalonia.Platform.Surfaces; using Avalonia.Platform.Storage; +using Avalonia.Platform.Surfaces; using Avalonia.Rendering.Composition; using Java.Lang; using ClipboardManager = Android.Content.ClipboardManager; @@ -39,7 +39,7 @@ namespace Avalonia.Android.Platform.SkiaPlatform private readonly Clipboard _clipboard; private readonly AndroidLauncher? _launcher; private readonly AndroidScreens? _screens; - private SurfaceViewImpl _view; + private SurfaceViewImpl? _view; private WindowTransparencyLevel _transparencyLevel; public TopLevelImpl(AvaloniaView avaloniaView, bool placeOnTop = false) @@ -78,8 +78,8 @@ namespace Avalonia.Android.Platform.SkiaPlatform public IInputRoot? InputRoot { get; private set; } - public Size ClientSize => _view.Size.ToSize(RenderScaling); - public double RenderScaling => _view.Scaling; + public Size ClientSize => _view?.Size.ToSize(RenderScaling) ?? default; + public double RenderScaling => _view?.Scaling ?? 1; public Action? Closed { get; set; } @@ -91,9 +91,9 @@ namespace Avalonia.Android.Platform.SkiaPlatform public Action? ScalingChanged { get; set; } - public View View => _view; + public View? View => _view; - internal InvalidationAwareSurfaceView InternalView => _view; + internal InvalidationAwareSurfaceView? InternalView => _view; public double DesktopScaling => RenderScaling; public IPlatformHandle Handle { get; } @@ -126,8 +126,8 @@ namespace Avalonia.Android.Platform.SkiaPlatform public virtual void Dispose() { _systemNavigationManager.Dispose(); - _view.Dispose(); - _view = null!; + _view?.Dispose(); + _view = null; } protected void OnResized(Size size) @@ -193,7 +193,7 @@ namespace Avalonia.Android.Platform.SkiaPlatform // ReSharper disable once CompareOfFloatsByEqualityOperator if (newScaling != _oldScaling) { - _oldScaling = newScaling; + _oldScaling = newScaling; _tl.ScalingChanged?.Invoke(newScaling); } } @@ -232,7 +232,7 @@ namespace Avalonia.Android.Platform.SkiaPlatform public void SetFrameThemeVariant(PlatformThemeVariant themeVariant) { - if(_insetsManager != null) + if (_insetsManager != null) { _insetsManager.SystemBarTheme = themeVariant switch { @@ -245,12 +245,12 @@ namespace Avalonia.Android.Platform.SkiaPlatform AppCompatDelegate.DefaultNightMode = themeVariant == PlatformThemeVariant.Light ? AppCompatDelegate.ModeNightNo : AppCompatDelegate.ModeNightYes; } - public AcrylicPlatformCompensationLevels AcrylicCompensationLevels => new AcrylicPlatformCompensationLevels(1, 1, 1); + public AcrylicPlatformCompensationLevels AcrylicCompensationLevels => new(1, 1, 1); - IntPtr EglGlPlatformSurface.IEglWindowGlPlatformSurfaceInfo.Handle => ((IPlatformHandle)_view).Handle; + IntPtr EglGlPlatformSurface.IEglWindowGlPlatformSurfaceInfo.Handle => (_view as IPlatformHandle)?.Handle ?? default; bool EglGlPlatformSurface.IEglWindowGlPlatformSurfaceInfoWithWaitPolicy.SkipWaits => true; - PixelSize EglGlPlatformSurface.IEglWindowGlPlatformSurfaceInfo.Size => _view.Size; - double EglGlPlatformSurface.IEglWindowGlPlatformSurfaceInfo.Scaling => _view.Scaling; + PixelSize EglGlPlatformSurface.IEglWindowGlPlatformSurfaceInfo.Size => _view?.Size ?? default; + double EglGlPlatformSurface.IEglWindowGlPlatformSurfaceInfo.Scaling => _view?.Scaling ?? default; internal AndroidKeyboardEventsHelper KeyboardHelper => _keyboardHelper; @@ -258,7 +258,7 @@ namespace Avalonia.Android.Platform.SkiaPlatform public void SetTransparencyLevelHint(IReadOnlyList transparencyLevels) { - if (_view.Context is not AvaloniaActivity activity) + if (_view?.Context is not AvaloniaActivity activity) return; foreach (var level in transparencyLevels) @@ -341,7 +341,7 @@ namespace Avalonia.Android.Platform.SkiaPlatform return _insetsManager; } - if(featureType == typeof(IClipboard)) + if (featureType == typeof(IClipboard)) { return _clipboard; } @@ -355,7 +355,7 @@ namespace Avalonia.Android.Platform.SkiaPlatform { return _screens; } - + return null; } @@ -386,7 +386,7 @@ namespace Avalonia.Android.Platform.SkiaPlatform internal void TextInput(string text) { - if(Input != null) + if (Input != null) { var args = new RawTextInputEventArgs(AndroidKeyboardDevice.Instance!, (ulong)SystemClock.UptimeMillis(), InputRoot!, text);