File: NoPlatformFoldableService.cs
Web Access
Project: src\src\Controls\Foldable\src\Controls.Foldable.csproj (Microsoft.Maui.Controls.Foldable)
using System;
using System.Threading.Tasks;
using Microsoft.Maui;
using Microsoft.Maui.Controls;
using Microsoft.Maui.Controls.Internals;
using Microsoft.Maui.Devices;
using Microsoft.Maui.Graphics;
 
namespace Microsoft.Maui.Foldable
{
	/// <summary>
	/// This implementation is created by the TwoPaneView for all 
	/// platforms except Android, which creates an working instance
	/// via HostBuilderExtension.
	/// </summary>
	class NoPlatformFoldableService : IFoldableService
	{
		static Lazy<NoPlatformFoldableService> _Instance = new Lazy<NoPlatformFoldableService>(() => new NoPlatformFoldableService());
		public static NoPlatformFoldableService Instance => _Instance.Value;
 
		readonly WeakEventManager _onScreenChangedEventManager = new WeakEventManager();
		readonly WeakEventManager _onLayoutChangedEventManager = new WeakEventManager();
		public NoPlatformFoldableService()
		{
			DeviceDisplay.MainDisplayInfoChanged += OnDeviceInfoChanged;
		}
 
		public Task<int> GetHingeAngleAsync() => Task.FromResult(0);
 
		public bool IsSpanned => false;
 
		public bool IsLandscape => DeviceDisplay.MainDisplayInfo.Orientation.IsLandscape();
 
		public DisplayInfo DeviceInfo => DeviceDisplay.MainDisplayInfo;
 
		public event EventHandler OnScreenChanged
		{
			add { _onScreenChangedEventManager.AddEventHandler(value); }
			remove { _onScreenChangedEventManager.RemoveEventHandler(value); }
		}
		public event EventHandler<FoldEventArgs> OnLayoutChanged
		{
			add { _onLayoutChangedEventManager.AddEventHandler(value); }
			remove { _onLayoutChangedEventManager.RemoveEventHandler(value); }
		}
		public void Dispose()
		{
		}
 
		public Size ScaledScreenSize => DeviceDisplay.MainDisplayInfo.GetScaledScreenSize();
		public Rect GetHinge()
		{
			return Rect.Zero;
		}
 
		public Point? GetLocationOnScreen(VisualElement visualElement)
		{
			return null;
		}
 
		public object WatchForChangesOnLayout(VisualElement visualElement, Action action)
		{
			if (action == null)
				return null;
 
			EventHandler<EventArg<VisualElement>> layoutUpdated = (_, __) =>
			{
				action();
			};
 
			visualElement.BatchCommitted += layoutUpdated;
			return layoutUpdated;
		}
 
		public void StopWatchingForChangesOnLayout(VisualElement visualElement, object handle)
		{
			if (handle is EventHandler<EventArg<VisualElement>> handler)
				visualElement.BatchCommitted -= handler;
		}
 
		void OnDeviceInfoChanged(object sender, DisplayInfoChangedEventArgs e)
		{
			_onScreenChangedEventManager.HandleEvent(this, e, nameof(OnScreenChanged));
		}
	}
}