Skip to content

Commit

Permalink
feat: Support for DataTransferManager on WASM
Browse files Browse the repository at this point in the history
  • Loading branch information
MartinZikmund committed Jan 29, 2021
1 parent 568f02a commit 97ccc3f
Show file tree
Hide file tree
Showing 16 changed files with 267 additions and 83 deletions.
11 changes: 11 additions & 0 deletions src/Uno.UI/WasmScripts/Uno.UI.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -987,6 +987,17 @@ declare namespace Windows.Storage {
private static synchronizeFileSystem;
}
}
interface NavigatorDataTransferManager {
share(data: any): Promise<void>;
}
interface Navigator extends NavigatorDataTransferManager {
}
declare namespace Windows.ApplicationModel.DataTransfer {
class DataTransferManager {
static isSupported(): boolean;
static showShareUI(title: string, text: string, url: string): Promise<string>;
}
}
declare namespace Windows.Devices.Geolocation {
class Geolocator {
private static dispatchAccessRequest;
Expand Down
37 changes: 37 additions & 0 deletions src/Uno.UI/WasmScripts/Uno.UI.js
Original file line number Diff line number Diff line change
Expand Up @@ -3239,6 +3239,43 @@ var Windows;
})(Storage = Windows.Storage || (Windows.Storage = {}));
})(Windows || (Windows = {}));
var Windows;
(function (Windows) {
var ApplicationModel;
(function (ApplicationModel) {
var DataTransfer;
(function (DataTransfer) {
class DataTransferManager {
static isSupported() {
var navigatorAny = navigator;
return typeof navigatorAny.share === "function";
}
static showShareUI(title, text, url) {
return __awaiter(this, void 0, void 0, function* () {
var data = {};
if (title) {
data.title = title;
}
if (text) {
data.text = text;
}
if (url) {
data.url = url;
}
try {
yield navigator.share(data);
return "true";
}
catch (_a) {
return "false";
}
});
}
}
DataTransfer.DataTransferManager = DataTransferManager;
})(DataTransfer = ApplicationModel.DataTransfer || (ApplicationModel.DataTransfer = {}));
})(ApplicationModel = Windows.ApplicationModel || (Windows.ApplicationModel = {}));
})(Windows || (Windows = {}));
var Windows;
(function (Windows) {
var Devices;
(function (Devices) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
interface NavigatorDataTransferManager {
share(data: any): Promise<void>;
}

interface Navigator extends NavigatorDataTransferManager { }

namespace Windows.ApplicationModel.DataTransfer {

export class DataTransferManager {

public static isSupported(): boolean {
var navigatorAny = navigator as any;
return typeof navigatorAny.share === "function";
}

public static async showShareUI(title: string, text: string, url: string): Promise<string> {
var data: any = {};
if (title) {
data.title = title;
}
if (text) {
data.text = text;
}
if (url) {
data.url = url;
}

try {
await navigator.share(data);
return "true";
}
catch {
return "false";
}
}
}
}
14 changes: 14 additions & 0 deletions src/Uno.UWP/ApplicationModel/DataTransfer/DataPackage.cs
Original file line number Diff line number Diff line change
Expand Up @@ -25,12 +25,22 @@ public partial class DataPackage

public event TypedEventHandler<DataPackage, OperationCompletedEventArgs>? OperationCompleted;

#pragma warning disable CS0067
public event TypedEventHandler<DataPackage, object?>? Destroyed;

public event TypedEventHandler<DataPackage, object?>? ShareCanceled;

public event TypedEventHandler<DataPackage, ShareCompletedEventArgs>? ShareCompleted;
#pragma warning restore CS00067

private ImmutableDictionary<string, object> _data = ImmutableDictionary<string, object>.Empty;

public DataPackageOperation RequestedOperation { get; set; }

public IDictionary<string, RandomAccessStreamReference> ResourceMap { get; } = new Dictionary<string, RandomAccessStreamReference>();

public DataPackagePropertySet Properties { get; } = new DataPackagePropertySet();

public void SetData(string formatId, object value)
{
ImmutableInterlocked.Update(ref _data, SetDataCore, (formatId, value));
Expand Down Expand Up @@ -246,5 +256,9 @@ internal static string CombineUri(string? webLink, string? applicationLink, stri

return combinedUri;
}

internal void OnShareCompleted() => ShareCompleted?.Invoke(this, new ShareCompletedEventArgs());

internal void OnShareCanceled() => ShareCanceled?.Invoke(this, null);
}
}
2 changes: 1 addition & 1 deletion src/Uno.UWP/ApplicationModel/DataTransfer/DataRequest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ namespace Windows.ApplicationModel.DataTransfer
{
public partial class DataRequest
{
public DataPackage Data { get; set; }
public DataPackage Data { get; set; } = new DataPackage();

public DateTimeOffset Deadline { get; }

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,6 @@
{
public partial class DataRequestedEventArgs
{
public DataRequest Request { get; }
public DataRequest Request { get; } = new DataRequest();
}
}
31 changes: 5 additions & 26 deletions src/Uno.UWP/ApplicationModel/DataTransfer/DataTransferManager.cs
Original file line number Diff line number Diff line change
@@ -1,36 +1,15 @@
using Windows.Foundation;
#if __WASM__
using Windows.Foundation;

namespace Windows.ApplicationModel.DataTransfer
{
public partial class DataTransferManager
{
public static bool IsSupported()
private DataTransferManager()
{
throw new global::System.NotImplementedException("The member bool DataTransferManager.IsSupported() is not implemented in Uno.");
}

public static void ShowShareUI()
{
global::Windows.Foundation.Metadata.ApiInformation.TryRaiseNotImplemented("Windows.ApplicationModel.DataTransfer.DataTransferManager", "void DataTransferManager.ShowShareUI()");
}

public static DataTransferManager GetForCurrentView()
{
throw new global::System.NotImplementedException("The member DataTransferManager DataTransferManager.GetForCurrentView() is not implemented in Uno.");
}

public event TypedEventHandler<DataTransferManager, DataRequestedEventArgs> DataRequested
{
[global::Uno.NotImplemented("__ANDROID__", "__IOS__", "NET461", "__WASM__", "__SKIA__", "__NETSTD_REFERENCE__", "__MACOS__")]
add
{
global::Windows.Foundation.Metadata.ApiInformation.TryRaiseNotImplemented("Windows.ApplicationModel.DataTransfer.DataTransferManager", "event TypedEventHandler<DataTransferManager, DataRequestedEventArgs> DataTransferManager.DataRequested");
}
[global::Uno.NotImplemented("__ANDROID__", "__IOS__", "NET461", "__WASM__", "__SKIA__", "__NETSTD_REFERENCE__", "__MACOS__")]
remove
{
global::Windows.Foundation.Metadata.ApiInformation.TryRaiseNotImplemented("Windows.ApplicationModel.DataTransfer.DataTransferManager", "event TypedEventHandler<DataTransferManager, DataRequestedEventArgs> DataTransferManager.DataRequested");
}
}
public event TypedEventHandler<DataTransferManager, DataRequestedEventArgs> DataRequested;
}
}
#endif
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
#if !__WASM__

namespace Windows.ApplicationModel.DataTransfer
{
public partial class DataTransferManager
{
public static bool IsSupported() => false;

public static DataTransferManager GetForCurrentView() => throw new NotSupportedException("DataTransferManager is not yet supported on this platform.");
}
}
#endif
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
#nullable enable

using System;
using Uno.Foundation;

namespace Windows.ApplicationModel.DataTransfer
{
public partial class DataTransferManager
{
private const string JsType = "Windows.ApplicationModel.DataTransfer.DataTransferManager";

private static Lazy<DataTransferManager> _instance = new Lazy<DataTransferManager>(() => new DataTransferManager());

public static bool IsSupported() => bool.TryParse(WebAssemblyRuntime.InvokeJS($"{JsType}.isSupported()"), out var result) && result;

public static DataTransferManager GetForCurrentView() => _instance.Value;

public static async void ShowShareUI()
{
var dataTransferManager = _instance.Value;
var args = new DataRequestedEventArgs();
dataTransferManager.DataRequested?.Invoke(dataTransferManager, args);
var dataPackage = args.Request.Data;
var dataPackageView = args.Request.Data.GetView();

var title = dataPackage.Properties.Title != null ? $"\"{WebAssemblyRuntime.EscapeJs(dataPackage.Properties.Title)}\"" : null;

string? text;
if (dataPackageView.Contains(StandardDataFormats.Text))
{
text = await dataPackageView.GetTextAsync();
}
else
{
text = dataPackage.Properties.Description;
}
text = text != null ? $"\"{WebAssemblyRuntime.EscapeJs(text)}\"" : null;

Uri? uri = null;
if (dataPackageView.Contains(StandardDataFormats.Uri))
{
uri = await dataPackageView.GetUriAsync();
}
else if (dataPackageView.Contains(StandardDataFormats.WebLink))
{
uri = await dataPackageView.GetWebLinkAsync();
}
else if (dataPackageView.Contains(StandardDataFormats.ApplicationLink))
{
uri = await dataPackageView.GetApplicationLinkAsync();
}

var uriText = uri != null ? $"\"{WebAssemblyRuntime.EscapeJs(uri.ToString())}\"" : null;

var result = await WebAssemblyRuntime.InvokeAsync($"{JsType}.showShareUI({title ?? "null"},{text ?? "null"},{uriText ?? "null"})");
if (bool.TryParse(result, out var boolResult) && boolResult)
{
dataPackage.OnShareCompleted();
}
else
{
dataPackage.OnShareCanceled();
}
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
namespace Windows.ApplicationModel.DataTransfer
{
public partial class ShareCompletedEventArgs
{
internal ShareCompletedEventArgs()
{
}

public ShareTargetInfo ShareTarget { get; } = new ShareTargetInfo();
}
}
15 changes: 15 additions & 0 deletions src/Uno.UWP/ApplicationModel/DataTransfer/ShareTargetInfo.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
#nullable enable

namespace Windows.ApplicationModel.DataTransfer
{
public partial class ShareTargetInfo
{
internal ShareTargetInfo()
{
}

public string AppUserModelId { get; } = "";

public ShareProvider? ShareProvider { get; } = null;
}
}
Loading

0 comments on commit 97ccc3f

Please sign in to comment.