2018-02-07 13:33:14 +03:00
|
|
|
using ElmSharp;
|
2017-12-04 17:30:43 +03:00
|
|
|
using System;
|
2018-02-07 13:33:14 +03:00
|
|
|
using System.Collections.Generic;
|
2017-12-04 17:30:43 +03:00
|
|
|
using System.IO;
|
2018-02-07 13:33:14 +03:00
|
|
|
using System.Linq;
|
|
|
|
using System.Net.Http;
|
2017-12-04 17:30:43 +03:00
|
|
|
using System.Reflection;
|
|
|
|
using System.Security.Cryptography;
|
|
|
|
using System.Threading;
|
|
|
|
using System.Threading.Tasks;
|
|
|
|
using Xamarin.Forms.Internals;
|
2018-02-07 13:33:14 +03:00
|
|
|
using TAppControl = Tizen.Applications.AppControl;
|
2017-12-04 17:30:43 +03:00
|
|
|
|
|
|
|
namespace Xamarin.Forms.Platform.Tizen
|
|
|
|
{
|
|
|
|
internal class TizenPlatformServices : IPlatformServices
|
|
|
|
{
|
|
|
|
static MD5 checksum = MD5.Create();
|
|
|
|
|
|
|
|
static SynchronizationContext s_context;
|
|
|
|
|
|
|
|
public TizenPlatformServices()
|
|
|
|
{
|
|
|
|
s_context = SynchronizationContext.Current;
|
|
|
|
}
|
|
|
|
|
|
|
|
public class TizenTicker : Ticker
|
|
|
|
{
|
|
|
|
readonly Timer _timer;
|
|
|
|
|
|
|
|
public TizenTicker()
|
|
|
|
{
|
|
|
|
_timer = new Timer((object o) => HandleElapsed(o), this, Timeout.Infinite, Timeout.Infinite);
|
|
|
|
}
|
|
|
|
|
|
|
|
protected override void EnableTimer()
|
|
|
|
{
|
|
|
|
_timer.Change(16, 16);
|
|
|
|
}
|
|
|
|
|
|
|
|
protected override void DisableTimer()
|
|
|
|
{
|
|
|
|
_timer.Change(-1, -1);
|
|
|
|
}
|
|
|
|
|
|
|
|
void HandleElapsed(object state)
|
|
|
|
{
|
|
|
|
s_context.Post((o) => SendSignals(-1), null);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
#region IPlatformServices implementation
|
|
|
|
|
|
|
|
public double GetNamedSize(NamedSize size, Type targetElementType, bool useOldSizes)
|
|
|
|
{
|
2018-03-22 08:47:35 +03:00
|
|
|
int pt;
|
|
|
|
// Actual font size depends on the target idiom.
|
2017-12-04 17:30:43 +03:00
|
|
|
switch (size)
|
|
|
|
{
|
|
|
|
case NamedSize.Micro:
|
2018-03-22 08:47:35 +03:00
|
|
|
pt = Device.Idiom == TargetIdiom.TV || Device.Idiom == TargetIdiom.Watch ? 24 : 19;
|
|
|
|
break;
|
2017-12-04 17:30:43 +03:00
|
|
|
case NamedSize.Small:
|
2018-03-22 08:47:35 +03:00
|
|
|
pt = Device.Idiom == TargetIdiom.TV ? 26 : (Device.Idiom == TargetIdiom.Watch ? 30 : 22);
|
|
|
|
break;
|
2017-12-04 17:30:43 +03:00
|
|
|
case NamedSize.Default:
|
|
|
|
case NamedSize.Medium:
|
2018-03-22 08:47:35 +03:00
|
|
|
pt = Device.Idiom == TargetIdiom.TV ? 28 : (Device.Idiom == TargetIdiom.Watch ? 32 : 25);
|
|
|
|
break;
|
2017-12-04 17:30:43 +03:00
|
|
|
case NamedSize.Large:
|
2018-03-22 08:47:35 +03:00
|
|
|
pt = Device.Idiom == TargetIdiom.TV ? 84 : (Device.Idiom == TargetIdiom.Watch ? 36 : 31);
|
|
|
|
break;
|
2017-12-04 17:30:43 +03:00
|
|
|
default:
|
2018-10-15 18:42:54 +03:00
|
|
|
throw new ArgumentOutOfRangeException(nameof(size));
|
2017-12-04 17:30:43 +03:00
|
|
|
}
|
2018-03-22 08:47:35 +03:00
|
|
|
return Forms.ConvertToDPFont(pt);
|
2017-12-04 17:30:43 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
public void OpenUriAction(Uri uri)
|
|
|
|
{
|
2018-02-07 13:33:14 +03:00
|
|
|
if (uri == null || uri.AbsoluteUri == null)
|
|
|
|
{
|
|
|
|
throw new ArgumentNullException(nameof(uri));
|
|
|
|
}
|
|
|
|
TAppControl tAppControl = new TAppControl() { Operation = "%", Uri = uri.AbsoluteUri };
|
|
|
|
var matchedApplications = TAppControl.GetMatchedApplicationIds(tAppControl);
|
2018-10-15 18:42:54 +03:00
|
|
|
if (matchedApplications.Any())
|
2018-02-07 13:33:14 +03:00
|
|
|
{
|
|
|
|
TAppControl.SendLaunchRequest(tAppControl);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
throw new PlatformNotSupportedException();
|
2017-12-04 17:30:43 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
public void BeginInvokeOnMainThread(Action action)
|
|
|
|
{
|
|
|
|
s_context.Post((o) => action(), null);
|
|
|
|
}
|
|
|
|
|
|
|
|
public Ticker CreateTicker()
|
|
|
|
{
|
|
|
|
return new TizenTicker();
|
|
|
|
}
|
|
|
|
|
|
|
|
public void StartTimer(TimeSpan interval, Func<bool> callback)
|
|
|
|
{
|
|
|
|
Timer timer = null;
|
|
|
|
bool invoking = false;
|
|
|
|
TimerCallback onTimeout = o =>
|
|
|
|
{
|
|
|
|
if (!invoking)
|
|
|
|
{
|
|
|
|
invoking = true;
|
|
|
|
BeginInvokeOnMainThread(() =>
|
|
|
|
{
|
|
|
|
if (!callback())
|
|
|
|
{
|
|
|
|
timer.Dispose();
|
|
|
|
}
|
|
|
|
invoking = false;
|
|
|
|
}
|
|
|
|
);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
timer = new Timer(onTimeout, null, Timeout.Infinite, Timeout.Infinite);
|
|
|
|
// set interval separarately to prevent calling onTimeout before `timer' is assigned
|
|
|
|
timer.Change(interval, interval);
|
|
|
|
}
|
|
|
|
|
|
|
|
public async Task<Stream> GetStreamAsync(Uri uri, CancellationToken cancellationToken)
|
|
|
|
{
|
|
|
|
using (var client = new HttpClient())
|
|
|
|
using (HttpResponseMessage response = await client.GetAsync(uri, cancellationToken))
|
|
|
|
return await response.Content.ReadAsStreamAsync();
|
|
|
|
}
|
|
|
|
|
|
|
|
public Assembly[] GetAssemblies()
|
|
|
|
{
|
|
|
|
return AppDomain.CurrentDomain.GetAssemblies();
|
|
|
|
}
|
|
|
|
|
|
|
|
public IIsolatedStorageFile GetUserStoreForApplication()
|
|
|
|
{
|
|
|
|
return new TizenIsolatedStorageFile();
|
|
|
|
}
|
|
|
|
|
|
|
|
static readonly char[] HexDigits = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
|
|
|
|
public string GetMD5Hash(string input)
|
|
|
|
{
|
|
|
|
byte[] bin = checksum.ComputeHash(System.Text.Encoding.UTF8.GetBytes(input));
|
|
|
|
char[] hex = new char[32];
|
|
|
|
for (var i = 0; i < 16; ++i)
|
|
|
|
{
|
|
|
|
hex[2 * i] = HexDigits[bin[i] >> 4];
|
|
|
|
hex[2 * i + 1] = HexDigits[bin[i] & 0xf];
|
|
|
|
}
|
|
|
|
return new string(hex);
|
|
|
|
}
|
|
|
|
|
|
|
|
public void QuitApplication()
|
|
|
|
{
|
|
|
|
Forms.Context.Exit();
|
|
|
|
}
|
|
|
|
|
|
|
|
public bool IsInvokeRequired
|
|
|
|
{
|
|
|
|
get
|
|
|
|
{
|
|
|
|
return !EcoreMainloop.IsMainThread;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public string RuntimePlatform => Device.Tizen;
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
// In .NETCore, AppDomain is not supported. The list of the assemblies should be generated manually.
|
|
|
|
internal class AppDomain
|
|
|
|
{
|
|
|
|
public static AppDomain CurrentDomain { get; private set; }
|
|
|
|
|
2018-10-15 18:42:54 +03:00
|
|
|
readonly List<Assembly> _assemblies;
|
2017-12-04 17:30:43 +03:00
|
|
|
|
|
|
|
static AppDomain()
|
|
|
|
{
|
|
|
|
CurrentDomain = new AppDomain();
|
|
|
|
}
|
|
|
|
|
|
|
|
AppDomain()
|
|
|
|
{
|
|
|
|
_assemblies = new List<Assembly>();
|
|
|
|
|
|
|
|
// Add this renderer assembly to the list
|
|
|
|
_assemblies.Add(GetType().GetTypeInfo().Assembly);
|
|
|
|
}
|
|
|
|
|
|
|
|
internal void RegisterAssemblyRecursively(Assembly asm)
|
|
|
|
{
|
|
|
|
if (_assemblies.Contains(asm))
|
|
|
|
return;
|
|
|
|
|
|
|
|
_assemblies.Add(asm);
|
|
|
|
|
|
|
|
foreach (var refName in asm.GetReferencedAssemblies())
|
|
|
|
{
|
|
|
|
if (!refName.Name.StartsWith("System.") && !refName.Name.StartsWith("Microsoft.") && !refName.Name.StartsWith("mscorlib"))
|
|
|
|
{
|
|
|
|
try
|
|
|
|
{
|
|
|
|
Assembly refAsm = Assembly.Load(refName);
|
|
|
|
RegisterAssemblyRecursively(refAsm);
|
|
|
|
}
|
|
|
|
catch
|
|
|
|
{
|
|
|
|
Log.Warn("Reference Assembly can not be loaded. {0}", refName.FullName);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public Assembly[] GetAssemblies()
|
|
|
|
{
|
|
|
|
return _assemblies.ToArray();
|
|
|
|
}
|
|
|
|
}
|
2018-11-01 00:12:22 +03:00
|
|
|
|
|
|
|
public SizeRequest GetNativeSize(VisualElement view, double widthConstraint, double heightConstraint)
|
|
|
|
{
|
|
|
|
return Platform.GetNativeSize(view, widthConstraint, heightConstraint);
|
|
|
|
}
|
2017-12-04 17:30:43 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|