/
Share.ios.cs
117 lines (94 loc) · 4.04 KB
/
Share.ios.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
using System.Collections.Generic;
using System.Drawing;
using System.Threading.Tasks;
using Foundation;
using LinkPresentation;
using UIKit;
namespace Xamarin.Essentials
{
public static partial class Share
{
static async Task PlatformRequestAsync(ShareTextRequest request)
{
var src = new TaskCompletionSource<bool>();
var items = new List<NSObject>();
if (!string.IsNullOrWhiteSpace(request.Text))
{
items.Add(GetShareItem(new NSString(request.Text), request.Title));
}
if (!string.IsNullOrWhiteSpace(request.Uri))
{
items.Add(GetShareItem(NSUrl.FromString(request.Uri), request.Title));
}
var activityController = new UIActivityViewController(items.ToArray(), null)
{
CompletionWithItemsHandler = (a, b, c, d) =>
{
src.TrySetResult(true);
}
};
var vc = Platform.GetCurrentViewController();
if (activityController.PopoverPresentationController != null)
{
activityController.PopoverPresentationController.SourceView = vc.View;
if (request.PresentationSourceBounds != Rectangle.Empty || Platform.HasOSVersion(13, 0))
activityController.PopoverPresentationController.SourceRect = request.PresentationSourceBounds.ToPlatformRectangle();
}
await vc.PresentViewControllerAsync(activityController, true);
await src.Task;
}
static async Task PlatformRequestAsync(ShareMultipleFilesRequest request)
{
var src = new TaskCompletionSource<bool>();
var items = new List<NSObject>();
foreach (var file in request.Files)
{
var fileUrl = NSUrl.FromFilename(file.FullPath);
items.Add(GetShareItem(fileUrl, request.Title));
}
var activityController = new UIActivityViewController(items.ToArray(), null)
{
CompletionWithItemsHandler = (a, b, c, d) =>
{
src.TrySetResult(true);
}
};
var vc = Platform.GetCurrentViewController();
if (activityController.PopoverPresentationController != null)
{
activityController.PopoverPresentationController.SourceView = vc.View;
if (request.PresentationSourceBounds != Rectangle.Empty || Platform.HasOSVersion(13, 0))
activityController.PopoverPresentationController.SourceRect = request.PresentationSourceBounds.ToPlatformRectangle();
}
await vc.PresentViewControllerAsync(activityController, true);
await src.Task;
}
static NSObject GetShareItem(NSString obj, string title)
=> new ShareActivityItemSource(obj, string.IsNullOrWhiteSpace(title) ? obj : title);
static NSObject GetShareItem(NSObject obj, string title)
=> string.IsNullOrWhiteSpace(title)
? obj
: new ShareActivityItemSource(obj, title);
}
class ShareActivityItemSource : UIActivityItemSource
{
readonly NSObject item;
readonly string title;
internal ShareActivityItemSource(NSObject item, string title)
{
this.item = item;
this.title = title;
}
public override NSObject GetItemForActivity(UIActivityViewController activityViewController, NSString activityType) => item;
public override NSObject GetPlaceholderData(UIActivityViewController activityViewController) => item;
public override LPLinkMetadata GetLinkMetadata(UIActivityViewController activityViewController)
{
var meta = new LPLinkMetadata();
if (!string.IsNullOrWhiteSpace(title))
meta.Title = title;
if (item is NSUrl url)
meta.Url = url;
return meta;
}
}
}