Skip to content
This repository has been archived by the owner on May 1, 2024. It is now read-only.

Commit

Permalink
GH-240 Add IsMainThread detection API (#277)
Browse files Browse the repository at this point in the history
* Add IsMainThread detection API

* Add platform tests for main thread

* Update docs and add more platform tests
  • Loading branch information
jamesmontemagno committed Jun 5, 2018
1 parent 35a418e commit 392fbee
Show file tree
Hide file tree
Showing 17 changed files with 357 additions and 6 deletions.
Expand Up @@ -23,6 +23,7 @@
<Compile Include="$(MSBuildThisFileDirectory)Geocoding_Tests.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Geolocation_Tests.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Permissions_Tests.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Platform_Tests.cs" />
<Compile Include="$(MSBuildThisFileDirectory)PhoneDialer_Tests.cs" />
<Compile Include="$(MSBuildThisFileDirectory)ScreenLock_Tests.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Preferences_Tests.cs" />
Expand Down
27 changes: 27 additions & 0 deletions DeviceTests/DeviceTests.Shared/Platform_Tests.cs
@@ -0,0 +1,27 @@
using System.Threading.Tasks;
using Xamarin.Essentials;
using Xunit;

namespace DeviceTests
{
public class Platform_Tests
{
[Fact]
public Task IsOnMainThread()
{
return Utils.OnMainThread(() =>
{
Assert.True(Platform.IsMainThread);
});
}

[Fact]
public Task IsNotOnMainThread()
{
return Task.Run(() =>
{
Assert.False(Platform.IsMainThread);
});
}
}
}
17 changes: 17 additions & 0 deletions Xamarin.Essentials/Platform/Platform.android.cs
Expand Up @@ -56,8 +56,25 @@ internal static bool IsIntentSupported(Intent intent)
internal static bool HasApiLevel(BuildVersionCodes versionCode) =>
(int)Build.VERSION.SdkInt >= (int)versionCode;

static bool PlatformIsMainThread
{
get
{
if (HasApiLevel(BuildVersionCodes.M))
return Looper.MainLooper.IsCurrentThread;

return Looper.MyLooper() == Looper.MainLooper;
}
}

static void PlatformBeginInvokeOnMainThread(Action action)
{
if (IsMainThread)
{
action();
return;
}

if (handler?.Looper != Looper.MainLooper)
handler = new Handler(Looper.MainLooper);

Expand Down
5 changes: 4 additions & 1 deletion Xamarin.Essentials/Platform/Platform.ios.cs
Expand Up @@ -8,9 +8,12 @@ namespace Xamarin.Essentials
{
public static partial class Platform
{
static bool PlatformIsMainThread =>
NSThread.Current.IsMainThread;

static void PlatformBeginInvokeOnMainThread(Action action)
{
if (NSThread.Current.IsMainThread)
if (IsMainThread)
{
action();
return;
Expand Down
3 changes: 3 additions & 0 deletions Xamarin.Essentials/Platform/Platform.netstandard.cs
Expand Up @@ -6,5 +6,8 @@ public static partial class Platform
{
static void PlatformBeginInvokeOnMainThread(Action action) =>
throw new NotImplementedInReferenceAssemblyException();

static bool PlatformIsMainThread =>
throw new NotImplementedInReferenceAssemblyException();
}
}
7 changes: 5 additions & 2 deletions Xamarin.Essentials/Platform/Platform.shared.cs
Expand Up @@ -5,8 +5,11 @@ namespace Xamarin.Essentials
{
public static partial class Platform
{
public static void BeginInvokeOnMainThread(Action action)
=> PlatformBeginInvokeOnMainThread(action);
public static bool IsMainThread =>
PlatformIsMainThread;

public static void BeginInvokeOnMainThread(Action action) =>
PlatformBeginInvokeOnMainThread(action);

internal static Task InvokeOnMainThread(Action action)
{
Expand Down
3 changes: 3 additions & 0 deletions Xamarin.Essentials/Platform/Platform.uwp.cs
Expand Up @@ -6,6 +6,9 @@ namespace Xamarin.Essentials
{
public static partial class Platform
{
static bool PlatformIsMainThread =>
CoreApplication.MainView.CoreWindow.Dispatcher == null;

static void PlatformBeginInvokeOnMainThread(Action action)
{
var dispatcher = CoreApplication.MainView.CoreWindow.Dispatcher;
Expand Down
14 changes: 14 additions & 0 deletions docs/en/FrameworksIndex/xamarin-essentials-android.xml
Expand Up @@ -251,6 +251,19 @@
<Type Name="Xamarin.Essentials.NotImplementedInReferenceAssemblyException" Id="T:Xamarin.Essentials.NotImplementedInReferenceAssemblyException">
<Member Id="M:Xamarin.Essentials.NotImplementedInReferenceAssemblyException.#ctor" />
</Type>
<Type Name="Xamarin.Essentials.OrientationSensor" Id="T:Xamarin.Essentials.OrientationSensor">
<Member Id="E:Xamarin.Essentials.OrientationSensor.ReadingChanged" />
<Member Id="M:Xamarin.Essentials.OrientationSensor.Start(Xamarin.Essentials.SensorSpeed)" />
<Member Id="M:Xamarin.Essentials.OrientationSensor.Stop" />
<Member Id="P:Xamarin.Essentials.OrientationSensor.IsMonitoring" />
</Type>
<Type Name="Xamarin.Essentials.OrientationSensorChangedEventArgs" Id="T:Xamarin.Essentials.OrientationSensorChangedEventArgs">
<Member Id="P:Xamarin.Essentials.OrientationSensorChangedEventArgs.Reading" />
</Type>
<Type Name="Xamarin.Essentials.OrientationSensorChangedEventHandler" Id="T:Xamarin.Essentials.OrientationSensorChangedEventHandler" />
<Type Name="Xamarin.Essentials.OrientationSensorData" Id="T:Xamarin.Essentials.OrientationSensorData">
<Member Id="P:Xamarin.Essentials.OrientationSensorData.Orientation" />
</Type>
<Type Name="Xamarin.Essentials.PermissionException" Id="T:Xamarin.Essentials.PermissionException">
<Member Id="M:Xamarin.Essentials.PermissionException.#ctor(System.String)" />
</Type>
Expand All @@ -277,6 +290,7 @@
<Member Id="M:Xamarin.Essentials.Platform.Init(Android.App.Activity,Android.OS.Bundle)" />
<Member Id="M:Xamarin.Essentials.Platform.Init(Android.App.Application)" />
<Member Id="M:Xamarin.Essentials.Platform.OnRequestPermissionsResult(System.Int32,System.String[],Android.Content.PM.Permission[])" />
<Member Id="P:Xamarin.Essentials.Platform.IsMainThread" />
</Type>
<Type Name="Xamarin.Essentials.Preferences" Id="T:Xamarin.Essentials.Preferences">
<Member Id="M:Xamarin.Essentials.Preferences.Clear" />
Expand Down
14 changes: 14 additions & 0 deletions docs/en/FrameworksIndex/xamarin-essentials-ios.xml
Expand Up @@ -251,6 +251,19 @@
<Type Name="Xamarin.Essentials.NotImplementedInReferenceAssemblyException" Id="T:Xamarin.Essentials.NotImplementedInReferenceAssemblyException">
<Member Id="M:Xamarin.Essentials.NotImplementedInReferenceAssemblyException.#ctor" />
</Type>
<Type Name="Xamarin.Essentials.OrientationSensor" Id="T:Xamarin.Essentials.OrientationSensor">
<Member Id="E:Xamarin.Essentials.OrientationSensor.ReadingChanged" />
<Member Id="M:Xamarin.Essentials.OrientationSensor.Start(Xamarin.Essentials.SensorSpeed)" />
<Member Id="M:Xamarin.Essentials.OrientationSensor.Stop" />
<Member Id="P:Xamarin.Essentials.OrientationSensor.IsMonitoring" />
</Type>
<Type Name="Xamarin.Essentials.OrientationSensorChangedEventArgs" Id="T:Xamarin.Essentials.OrientationSensorChangedEventArgs">
<Member Id="P:Xamarin.Essentials.OrientationSensorChangedEventArgs.Reading" />
</Type>
<Type Name="Xamarin.Essentials.OrientationSensorChangedEventHandler" Id="T:Xamarin.Essentials.OrientationSensorChangedEventHandler" />
<Type Name="Xamarin.Essentials.OrientationSensorData" Id="T:Xamarin.Essentials.OrientationSensorData">
<Member Id="P:Xamarin.Essentials.OrientationSensorData.Orientation" />
</Type>
<Type Name="Xamarin.Essentials.PermissionException" Id="T:Xamarin.Essentials.PermissionException">
<Member Id="M:Xamarin.Essentials.PermissionException.#ctor(System.String)" />
</Type>
Expand All @@ -274,6 +287,7 @@
</Type>
<Type Name="Xamarin.Essentials.Platform" Id="T:Xamarin.Essentials.Platform">
<Member Id="M:Xamarin.Essentials.Platform.BeginInvokeOnMainThread(System.Action)" />
<Member Id="P:Xamarin.Essentials.Platform.IsMainThread" />
</Type>
<Type Name="Xamarin.Essentials.Preferences" Id="T:Xamarin.Essentials.Preferences">
<Member Id="M:Xamarin.Essentials.Preferences.Clear" />
Expand Down
14 changes: 14 additions & 0 deletions docs/en/FrameworksIndex/xamarin-essentials-uwp.xml
Expand Up @@ -251,6 +251,19 @@
<Type Name="Xamarin.Essentials.NotImplementedInReferenceAssemblyException" Id="T:Xamarin.Essentials.NotImplementedInReferenceAssemblyException">
<Member Id="M:Xamarin.Essentials.NotImplementedInReferenceAssemblyException.#ctor" />
</Type>
<Type Name="Xamarin.Essentials.OrientationSensor" Id="T:Xamarin.Essentials.OrientationSensor">
<Member Id="E:Xamarin.Essentials.OrientationSensor.ReadingChanged" />
<Member Id="M:Xamarin.Essentials.OrientationSensor.Start(Xamarin.Essentials.SensorSpeed)" />
<Member Id="M:Xamarin.Essentials.OrientationSensor.Stop" />
<Member Id="P:Xamarin.Essentials.OrientationSensor.IsMonitoring" />
</Type>
<Type Name="Xamarin.Essentials.OrientationSensorChangedEventArgs" Id="T:Xamarin.Essentials.OrientationSensorChangedEventArgs">
<Member Id="P:Xamarin.Essentials.OrientationSensorChangedEventArgs.Reading" />
</Type>
<Type Name="Xamarin.Essentials.OrientationSensorChangedEventHandler" Id="T:Xamarin.Essentials.OrientationSensorChangedEventHandler" />
<Type Name="Xamarin.Essentials.OrientationSensorData" Id="T:Xamarin.Essentials.OrientationSensorData">
<Member Id="P:Xamarin.Essentials.OrientationSensorData.Orientation" />
</Type>
<Type Name="Xamarin.Essentials.PermissionException" Id="T:Xamarin.Essentials.PermissionException">
<Member Id="M:Xamarin.Essentials.PermissionException.#ctor(System.String)" />
</Type>
Expand All @@ -274,6 +287,7 @@
</Type>
<Type Name="Xamarin.Essentials.Platform" Id="T:Xamarin.Essentials.Platform">
<Member Id="M:Xamarin.Essentials.Platform.BeginInvokeOnMainThread(System.Action)" />
<Member Id="P:Xamarin.Essentials.Platform.IsMainThread" />
</Type>
<Type Name="Xamarin.Essentials.Preferences" Id="T:Xamarin.Essentials.Preferences">
<Member Id="M:Xamarin.Essentials.Preferences.Clear" />
Expand Down
14 changes: 14 additions & 0 deletions docs/en/FrameworksIndex/xamarin-essentials.xml
Expand Up @@ -251,6 +251,19 @@
<Type Name="Xamarin.Essentials.NotImplementedInReferenceAssemblyException" Id="T:Xamarin.Essentials.NotImplementedInReferenceAssemblyException">
<Member Id="M:Xamarin.Essentials.NotImplementedInReferenceAssemblyException.#ctor" />
</Type>
<Type Name="Xamarin.Essentials.OrientationSensor" Id="T:Xamarin.Essentials.OrientationSensor">
<Member Id="E:Xamarin.Essentials.OrientationSensor.ReadingChanged" />
<Member Id="M:Xamarin.Essentials.OrientationSensor.Start(Xamarin.Essentials.SensorSpeed)" />
<Member Id="M:Xamarin.Essentials.OrientationSensor.Stop" />
<Member Id="P:Xamarin.Essentials.OrientationSensor.IsMonitoring" />
</Type>
<Type Name="Xamarin.Essentials.OrientationSensorChangedEventArgs" Id="T:Xamarin.Essentials.OrientationSensorChangedEventArgs">
<Member Id="P:Xamarin.Essentials.OrientationSensorChangedEventArgs.Reading" />
</Type>
<Type Name="Xamarin.Essentials.OrientationSensorChangedEventHandler" Id="T:Xamarin.Essentials.OrientationSensorChangedEventHandler" />
<Type Name="Xamarin.Essentials.OrientationSensorData" Id="T:Xamarin.Essentials.OrientationSensorData">
<Member Id="P:Xamarin.Essentials.OrientationSensorData.Orientation" />
</Type>
<Type Name="Xamarin.Essentials.PermissionException" Id="T:Xamarin.Essentials.PermissionException">
<Member Id="M:Xamarin.Essentials.PermissionException.#ctor(System.String)" />
</Type>
Expand All @@ -274,6 +287,7 @@
</Type>
<Type Name="Xamarin.Essentials.Platform" Id="T:Xamarin.Essentials.Platform">
<Member Id="M:Xamarin.Essentials.Platform.BeginInvokeOnMainThread(System.Action)" />
<Member Id="P:Xamarin.Essentials.Platform.IsMainThread" />
</Type>
<Type Name="Xamarin.Essentials.Preferences" Id="T:Xamarin.Essentials.Preferences">
<Member Id="M:Xamarin.Essentials.Preferences.Clear" />
Expand Down
105 changes: 105 additions & 0 deletions docs/en/Xamarin.Essentials/OrientationSensor.xml
@@ -0,0 +1,105 @@
<Type Name="OrientationSensor" FullName="Xamarin.Essentials.OrientationSensor">
<TypeSignature Language="C#" Value="public static class OrientationSensor" />
<TypeSignature Language="ILAsm" Value=".class public auto ansi abstract sealed beforefieldinit OrientationSensor extends System.Object" />
<TypeSignature Language="DocId" Value="T:Xamarin.Essentials.OrientationSensor" />
<AssemblyInfo>
<AssemblyName>Xamarin.Essentials</AssemblyName>
<AssemblyVersion>1.0.0.0</AssemblyVersion>
</AssemblyInfo>
<Base>
<BaseTypeName>System.Object</BaseTypeName>
</Base>
<Interfaces />
<Docs>
<summary>Device orientation (quaternion) relative to magnetic fields.</summary>
<remarks>
<para></para>
</remarks>
</Docs>
<Members>
<Member MemberName="IsMonitoring">
<MemberSignature Language="C#" Value="public static bool IsMonitoring { get; }" />
<MemberSignature Language="ILAsm" Value=".property bool IsMonitoring" />
<MemberSignature Language="DocId" Value="P:Xamarin.Essentials.OrientationSensor.IsMonitoring" />
<MemberType>Property</MemberType>
<AssemblyInfo>
<AssemblyName>Xamarin.Essentials</AssemblyName>
<AssemblyVersion>1.0.0.0</AssemblyVersion>
</AssemblyInfo>
<ReturnValue>
<ReturnType>System.Boolean</ReturnType>
</ReturnValue>
<Docs>
<summary>Gets of currently monitoring the sensor.</summary>
<value>If monitoring.</value>
<remarks>
<para></para>
</remarks>
</Docs>
</Member>
<Member MemberName="ReadingChanged">
<MemberSignature Language="C#" Value="public static event Xamarin.Essentials.OrientationSensorChangedEventHandler ReadingChanged;" />
<MemberSignature Language="ILAsm" Value=".event class Xamarin.Essentials.OrientationSensorChangedEventHandler ReadingChanged" />
<MemberSignature Language="DocId" Value="E:Xamarin.Essentials.OrientationSensor.ReadingChanged" />
<MemberType>Event</MemberType>
<AssemblyInfo>
<AssemblyName>Xamarin.Essentials</AssemblyName>
<AssemblyVersion>1.0.0.0</AssemblyVersion>
</AssemblyInfo>
<ReturnValue>
<ReturnType>Xamarin.Essentials.OrientationSensorChangedEventHandler</ReturnType>
</ReturnValue>
<Docs>
<summary>
<para>Event triggered when reading of sensor changes.</para>
</summary>
<remarks>
<para></para>
</remarks>
</Docs>
</Member>
<Member MemberName="Start">
<MemberSignature Language="C#" Value="public static void Start (Xamarin.Essentials.SensorSpeed sensorSpeed);" />
<MemberSignature Language="ILAsm" Value=".method public static hidebysig void Start(valuetype Xamarin.Essentials.SensorSpeed sensorSpeed) cil managed" />
<MemberSignature Language="DocId" Value="M:Xamarin.Essentials.OrientationSensor.Start(Xamarin.Essentials.SensorSpeed)" />
<MemberType>Method</MemberType>
<AssemblyInfo>
<AssemblyName>Xamarin.Essentials</AssemblyName>
<AssemblyVersion>1.0.0.0</AssemblyVersion>
</AssemblyInfo>
<ReturnValue>
<ReturnType>System.Void</ReturnType>
</ReturnValue>
<Parameters>
<Parameter Name="sensorSpeed" Type="Xamarin.Essentials.SensorSpeed" />
</Parameters>
<Docs>
<param name="sensorSpeed">Sensor speed to use.</param>
<summary>Starts monitoring orientation sensor with specific speed.</summary>
<remarks>
<para></para>
</remarks>
</Docs>
</Member>
<Member MemberName="Stop">
<MemberSignature Language="C#" Value="public static void Stop ();" />
<MemberSignature Language="ILAsm" Value=".method public static hidebysig void Stop() cil managed" />
<MemberSignature Language="DocId" Value="M:Xamarin.Essentials.OrientationSensor.Stop" />
<MemberType>Method</MemberType>
<AssemblyInfo>
<AssemblyName>Xamarin.Essentials</AssemblyName>
<AssemblyVersion>1.0.0.0</AssemblyVersion>
</AssemblyInfo>
<ReturnValue>
<ReturnType>System.Void</ReturnType>
</ReturnValue>
<Parameters />
<Docs>
<summary>Stops monitoring.</summary>
<remarks>
<para></para>
</remarks>
</Docs>
</Member>
</Members>
</Type>
41 changes: 41 additions & 0 deletions docs/en/Xamarin.Essentials/OrientationSensorChangedEventArgs.xml
@@ -0,0 +1,41 @@
<Type Name="OrientationSensorChangedEventArgs" FullName="Xamarin.Essentials.OrientationSensorChangedEventArgs">
<TypeSignature Language="C#" Value="public class OrientationSensorChangedEventArgs : EventArgs" />
<TypeSignature Language="ILAsm" Value=".class public auto ansi beforefieldinit OrientationSensorChangedEventArgs extends System.EventArgs" />
<TypeSignature Language="DocId" Value="T:Xamarin.Essentials.OrientationSensorChangedEventArgs" />
<AssemblyInfo>
<AssemblyName>Xamarin.Essentials</AssemblyName>
<AssemblyVersion>1.0.0.0</AssemblyVersion>
</AssemblyInfo>
<Base>
<BaseTypeName>System.EventArgs</BaseTypeName>
</Base>
<Interfaces />
<Docs>
<summary>Orientation event args when reading changes.</summary>
<remarks>
<para></para>
</remarks>
</Docs>
<Members>
<Member MemberName="Reading">
<MemberSignature Language="C#" Value="public Xamarin.Essentials.OrientationSensorData Reading { get; }" />
<MemberSignature Language="ILAsm" Value=".property instance valuetype Xamarin.Essentials.OrientationSensorData Reading" />
<MemberSignature Language="DocId" Value="P:Xamarin.Essentials.OrientationSensorChangedEventArgs.Reading" />
<MemberType>Property</MemberType>
<AssemblyInfo>
<AssemblyName>Xamarin.Essentials</AssemblyName>
<AssemblyVersion>1.0.0.0</AssemblyVersion>
</AssemblyInfo>
<ReturnValue>
<ReturnType>Xamarin.Essentials.OrientationSensorData</ReturnType>
</ReturnValue>
<Docs>
<summary>Gets the reading when it changes.</summary>
<value>The current Reading</value>
<remarks>
<para />
</remarks>
</Docs>
</Member>
</Members>
</Type>
@@ -0,0 +1,25 @@
<Type Name="OrientationSensorChangedEventHandler" FullName="Xamarin.Essentials.OrientationSensorChangedEventHandler">
<TypeSignature Language="C#" Value="public delegate void OrientationSensorChangedEventHandler(OrientationSensorChangedEventArgs e);" />
<TypeSignature Language="ILAsm" Value=".class public auto ansi sealed OrientationSensorChangedEventHandler extends System.MulticastDelegate" />
<TypeSignature Language="DocId" Value="T:Xamarin.Essentials.OrientationSensorChangedEventHandler" />
<AssemblyInfo>
<AssemblyName>Xamarin.Essentials</AssemblyName>
<AssemblyVersion>1.0.0.0</AssemblyVersion>
</AssemblyInfo>
<Base>
<BaseTypeName>System.Delegate</BaseTypeName>
</Base>
<Parameters>
<Parameter Name="e" Type="Xamarin.Essentials.OrientationSensorChangedEventArgs" />
</Parameters>
<ReturnValue>
<ReturnType>System.Void</ReturnType>
</ReturnValue>
<Docs>
<param name="e">Event args.</param>
<summary>Event handler with reading.</summary>
<remarks>
<para />
</remarks>
</Docs>
</Type>

0 comments on commit 392fbee

Please sign in to comment.