File: Types\DeviceIdiom.shared.cs
Web Access
Project: src\src\Essentials\src\Essentials.csproj (Microsoft.Maui.Essentials)
using System;
 
namespace Microsoft.Maui.Devices
{
	/// <summary>
	/// Represents the idiom (form factor) of the device.
	/// </summary>
	public readonly struct DeviceIdiom : IEquatable<DeviceIdiom>
	{
		readonly string deviceIdiom;
 
		/// <summary>
		/// Gets an instance of <see cref="DeviceIdiom"/> that represents a (mobile) phone idiom.
		/// </summary>
		public static DeviceIdiom Phone { get; } = new DeviceIdiom(nameof(Phone));
 
		/// <summary>
		/// Gets an instance of <see cref="DeviceIdiom"/> that represents a tablet idiom.
		/// </summary>
		public static DeviceIdiom Tablet { get; } = new DeviceIdiom(nameof(Tablet));
 
		/// <summary>
		/// Gets an instance of <see cref="DeviceIdiom"/> that represents a desktop computer idiom.
		/// </summary>
		public static DeviceIdiom Desktop { get; } = new DeviceIdiom(nameof(Desktop));
 
		/// <summary>
		/// Gets an instance of <see cref="DeviceIdiom"/> that represents a television (TV) idiom.
		/// </summary>
		public static DeviceIdiom TV { get; } = new DeviceIdiom(nameof(TV));
 
		/// <summary>
		/// Gets an instance of <see cref="DeviceIdiom"/> that represents a watch idiom.
		/// </summary>
		public static DeviceIdiom Watch { get; } = new DeviceIdiom(nameof(Watch));
 
		/// <summary>
		/// Gets an instance of <see cref="DeviceIdiom"/> that represents an unknown idiom. This is used for when the current device idiom is unknown.
		/// </summary>
		public static DeviceIdiom Unknown { get; } = new DeviceIdiom(nameof(Unknown));
 
		DeviceIdiom(string deviceIdiom)
		{
			if (deviceIdiom == null)
				throw new ArgumentNullException(nameof(deviceIdiom));
 
			if (deviceIdiom.Length == 0)
				throw new ArgumentException(nameof(deviceIdiom));
 
			this.deviceIdiom = deviceIdiom;
		}
 
		/// <summary>
		/// Creates a new device idiom instance. This can be used to define your custom idioms.
		/// </summary>
		/// <param name="deviceIdiom">The idiom name of the device.</param>
		/// <returns>A new instance of <see cref="DeviceIdiom"/> with the specified idiom type.</returns>
		public static DeviceIdiom Create(string deviceIdiom) =>
			new DeviceIdiom(deviceIdiom);
 
		/// <summary>
		/// Compares the underlying <see cref="DeviceIdiom"/> instances.
		/// </summary>
		/// <param name="other"><see cref="DeviceIdiom"/> object to compare with.</param>
		/// <returns><see langword="true"/> if they are equal, otherwise <see langword="false"/>.</returns>
		public bool Equals(DeviceIdiom other) =>
			Equals(other.deviceIdiom);
 
		internal bool Equals(string other) =>
			string.Equals(deviceIdiom, other, StringComparison.Ordinal);
 
		/// <inheritdoc cref="IEquatable{T}.Equals(T)"/>
		public override bool Equals(object obj) =>
			obj is DeviceIdiom && Equals((DeviceIdiom)obj);
 
		/// <summary>
		/// Gets the hash code for this idiom instance.
		/// </summary>
		/// <returns>The computed hash code for this device idiom or <c>0</c> when the device idiom is <see langword="null"/>.</returns>
		public override int GetHashCode() =>
			deviceIdiom == null ? 0 : deviceIdiom.GetHashCode(
#if !NETSTANDARD2_0
					StringComparison.Ordinal
#endif
				);
 
		/// <summary>
		/// Returns a string representation of the current device idiom.
		/// </summary>
		/// <returns>A string representation of this instance in the format of <c>{device idiom}</c> or an empty string when no device idiom is set.</returns>
		public override string ToString() =>
			deviceIdiom ?? string.Empty;
 
		/// <summary>
		///	Equality operator for equals.
		/// </summary>
		/// <param name="left">Left to compare.</param>
		/// <param name="right">Right to compare.</param>
		/// <returns><see langword="true"/> if objects are equal, otherwise <see langword="false"/>.</returns>
		public static bool operator ==(DeviceIdiom left, DeviceIdiom right) =>
			left.Equals(right);
 
		/// <summary>
		/// Inequality operator.
		/// </summary>
		/// <param name="left">Left to compare.</param>
		/// <param name="right">Right to compare.</param>
		/// <returns><see langword="true"/> if objects are not equal, otherwise <see langword="false"/>.</returns>
		public static bool operator !=(DeviceIdiom left, DeviceIdiom right) =>
			!left.Equals(right);
	}
}