Skip to content

Commit

Permalink
feat: DataTransferManager support on Android
Browse files Browse the repository at this point in the history
  • Loading branch information
MartinZikmund committed Jan 29, 2021
1 parent bfe6ec9 commit 4c2e6dd
Show file tree
Hide file tree
Showing 8 changed files with 86 additions and 29 deletions.
2 changes: 2 additions & 0 deletions src/Uno.UWP/ApplicationModel/DataTransfer/DataPackageView.cs
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,8 @@ public partial class DataPackageView
RequestedOperation = requestedOperation;
}

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

public DataPackageOperation RequestedOperation { get; }

public IReadOnlyList<string> AvailableFormats => _data.Keys.Where(k => !k.StartsWith(DataPackage.UnoPrivateDataPrefix)).ToArray();
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
#nullable enable

using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Android.Content;
using Microsoft.Extensions.Logging;
using Uno.Extensions;
using Uno.UI;

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

private static async Task<bool> ShowShareUIAsync(ShareUIOptions options, DataPackage dataPackage)
{
var context = ContextHelper.Current;
if (context == null)
{
if (_instance.Value.Log().IsEnabled(LogLevel.Error))
{
_instance.Value.Log().LogError("The Share API was called too early in the application lifecycle");
}
return false;
}

var dataPackageView = dataPackage.GetView();
var items = new List<string>();

if (dataPackageView.Contains(StandardDataFormats.Text))
{
var text = await dataPackageView.GetTextAsync();
items.Add(text);
}

var uri = await GetSharedUriAsync(dataPackageView);
if (uri != null)
{
items.Add(uri.ToString());
}

var intent = new Intent(Intent.ActionSend);
intent.SetType("text/plain");
intent.PutExtra(Intent.ExtraText, string.Join(Environment.NewLine, items));

var title = dataPackage.Properties.Title;
if (!string.IsNullOrWhiteSpace(title))
{
intent.PutExtra(Intent.ExtraSubject, title);
}

var chooserIntent = Intent.CreateChooser(intent, title ?? string.Empty);
var flags = ActivityFlags.ClearTop | ActivityFlags.NewTask;
chooserIntent?.SetFlags(flags);
ContextHelper.Current.StartActivity(chooserIntent);

return true;
}
}
}
13 changes: 11 additions & 2 deletions src/Uno.UWP/ApplicationModel/DataTransfer/DataTransferManager.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
#nullable enable

#if __WASM__ || __IOS__
#if __WASM__ || __IOS__ || __ANDROID__
using System;
using Windows.Foundation;
using Uno.Logging;
Expand Down Expand Up @@ -35,14 +35,23 @@ public static async void ShowShareUI(ShareUIOptions options)
// Because showing the Share UI is a fire-and-forget operation
// and retrieving data from DataPackage requires async-await,
// this method must be async void.
await ShowShareUIAsync(options, dataPackage);
var result = await ShowShareUIAsync(options, dataPackage);
if (result)
{
dataPackage.OnShareCompleted();
}
else
{
dataPackage.OnShareCanceled();
}
}
catch (Exception ex)
{
if (dataTransferManager.Log().IsEnabled(LogLevel.Error))
{
dataTransferManager.Log().LogError($"Exception occurred trying to show share UI: {ex}");
}
dataPackage.OnShareCanceled();
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ public partial class DataTransferManager
{
public static bool IsSupported() => true;

private static async Task ShowShareUIAsync(ShareUIOptions options, DataPackage dataPackage)
private static async Task<bool> ShowShareUIAsync(ShareUIOptions options, DataPackage dataPackage)
{
var rootViewController = UIApplication.SharedApplication?.KeyWindow?.RootViewController;
if (rootViewController == null)
Expand All @@ -27,7 +27,7 @@ private static async Task ShowShareUIAsync(ShareUIOptions options, DataPackage d
{
_instance.Value.Log().LogError("The Share API was called too early in the application lifecycle");
}
return;
return false;
}

var dataPackageView = dataPackage.GetView();
Expand Down Expand Up @@ -84,16 +84,7 @@ private static async Task ShowShareUIAsync(ShareUIOptions options, DataPackage d

await rootViewController.PresentViewControllerAsync(activityViewController, true);

var result = await completionSource.Task;

if (result)
{
dataPackage.OnShareCompleted();
}
else
{
dataPackage.OnShareCanceled();
}
return await completionSource.Task;
}

internal class DataActivityItemSource : UIActivityItemSource
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
#if !__WASM__ && !__IOS__
#if !__WASM__ && !__IOS__ && !__ANDROID__

namespace Windows.ApplicationModel.DataTransfer
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ public partial class DataTransferManager

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

private static async Task ShowShareUIAsync(ShareUIOptions options, DataPackage dataPackage)
private static async Task<bool> ShowShareUIAsync(ShareUIOptions options, DataPackage dataPackage)
{
var dataPackageView = dataPackage.GetView();

Expand All @@ -34,14 +34,7 @@ private static async Task ShowShareUIAsync(ShareUIOptions options, DataPackage d
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();
}
return bool.TryParse(result, out var boolResult) && boolResult;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ public partial class DataPackageView
}
}
#endif
#if __ANDROID__ || __IOS__ || NET461 || __WASM__ || __SKIA__ || __NETSTD_REFERENCE__ || __MACOS__
#if false || false || false || false || false || false || false
[global::Uno.NotImplemented("__ANDROID__", "__IOS__", "NET461", "__WASM__", "__SKIA__", "__NETSTD_REFERENCE__", "__MACOS__")]
public global::Windows.ApplicationModel.DataTransfer.DataPackagePropertySetView Properties
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,8 @@ public partial class DataTransferManager
// Forced skipping of method Windows.ApplicationModel.DataTransfer.DataTransferManager.TargetApplicationChosen.remove
// Forced skipping of method Windows.ApplicationModel.DataTransfer.DataTransferManager.ShareProvidersRequested.add
// Forced skipping of method Windows.ApplicationModel.DataTransfer.DataTransferManager.ShareProvidersRequested.remove
#if __ANDROID__ || false || NET461 || false || __SKIA__ || __NETSTD_REFERENCE__ || __MACOS__
[global::Uno.NotImplemented("__ANDROID__", "__IOS__", "NET461", "__WASM__", "__SKIA__", "__NETSTD_REFERENCE__", "__MACOS__")]
#if false || false || NET461 || false || __SKIA__ || __NETSTD_REFERENCE__ || __MACOS__
[global::Uno.NotImplemented("NET461", "__SKIA__", "__NETSTD_REFERENCE__", "__MACOS__")]
public static void ShowShareUI( global::Windows.ApplicationModel.DataTransfer.ShareUIOptions options)
{
global::Windows.Foundation.Metadata.ApiInformation.TryRaiseNotImplemented("Windows.ApplicationModel.DataTransfer.DataTransferManager", "void DataTransferManager.ShowShareUI(ShareUIOptions options)");
Expand All @@ -27,8 +27,8 @@ public static bool IsSupported()
throw new global::System.NotImplementedException("The member bool DataTransferManager.IsSupported() is not implemented in Uno.");
}
#endif
#if __ANDROID__ || false || NET461 || false || __SKIA__ || __NETSTD_REFERENCE__ || __MACOS__
[global::Uno.NotImplemented("__ANDROID__", "__IOS__", "NET461", "__WASM__", "__SKIA__", "__NETSTD_REFERENCE__", "__MACOS__")]
#if false || false || NET461 || false || __SKIA__ || __NETSTD_REFERENCE__ || __MACOS__
[global::Uno.NotImplemented("NET461", "__SKIA__", "__NETSTD_REFERENCE__", "__MACOS__")]
public static void ShowShareUI()
{
global::Windows.Foundation.Metadata.ApiInformation.TryRaiseNotImplemented("Windows.ApplicationModel.DataTransfer.DataTransferManager", "void DataTransferManager.ShowShareUI()");
Expand Down

0 comments on commit 4c2e6dd

Please sign in to comment.