Skip to content

Commit bc1842d

Browse files
pkoskoswift-kim
authored andcommitted
[Clipboard] setData and getData implementations added (#76)
* [Clipboard] setData and getData implementations added and also removed code for hasStrings, as this API is not present in documentation. [Before] Clipboard.setData and Clipboard.getData feature was not implemented [After] Naive implementation of clipboard shared only inside Flutter application and only via Clipboard API. Such decision was done because of supporting partial functionality on all profiles. CBHM API is supported only on mobile and currently it is not possible to support it in other way. Dart code below is able to set/get internal clipboard data: ClipboardData cd = ClipboardData(text: 'some text'); Clipboard.setData(cd); Future<ClipboardData?> d = Clipboard.getData(Clipboard.kTextPlain); void dataCallback(ClipboardData? d) { if (d != null) { String? text = d.text; if(text != null) { print("Clipboard data $text"); } } } d.then(dataCallback); * [Clipboard] Fixes after review * Removed unnecessary mutex * Cleaned temporary logs
1 parent 2713898 commit bc1842d

File tree

2 files changed

+61
-4
lines changed

2 files changed

+61
-4
lines changed

shell/platform/tizen/channels/platform_channel.cc

+52-4
Original file line numberDiff line numberDiff line change
@@ -214,11 +214,9 @@ void PlatformChannel::HandleMethodCall(
214214

215215
result->Error(error_cause, error_message);
216216
} else if (method == "Clipboard.getData") {
217-
result->NotImplemented();
217+
Clipboard::GetData(call, std::move(result));
218218
} else if (method == "Clipboard.setData") {
219-
result->NotImplemented();
220-
} else if (method == "Clipboard.hasStrings") {
221-
result->NotImplemented();
219+
Clipboard::SetData(call, std::move(result));
222220
} else if (method == "SystemChrome.setPreferredOrientations") {
223221
if (renderer_) {
224222
static const std::string kPortraitUp = "DeviceOrientation.portraitUp";
@@ -268,3 +266,53 @@ void PlatformChannel::HandleMethodCall(
268266
result->NotImplemented();
269267
}
270268
}
269+
270+
// Clipboard constants and variables
271+
namespace Clipboard {
272+
273+
// naive implementation using std::string as a container of internal clipboard
274+
// data
275+
std::string string_clipboard = "";
276+
277+
static constexpr char kTextKey[] = "text";
278+
static constexpr char kTextPlainFormat[] = "text/plain";
279+
static constexpr char kUnknownClipboardFormatError[] =
280+
"Unknown clipboard format error";
281+
static constexpr char kUnknownClipboardError[] =
282+
"Unknown error during clipboard data retrieval";
283+
284+
void GetData(
285+
const flutter::MethodCall<rapidjson::Document>& call,
286+
std::unique_ptr<flutter::MethodResult<rapidjson::Document>> result) {
287+
const rapidjson::Value& format = call.arguments()[0];
288+
289+
// https://api.flutter.dev/flutter/services/Clipboard/kTextPlain-constant.html
290+
// API supports only kTextPlain format
291+
if (strcmp(format.GetString(), kTextPlainFormat) != 0) {
292+
result->Error(kUnknownClipboardFormatError,
293+
"Clipboard API only supports text.");
294+
return;
295+
}
296+
297+
rapidjson::Document document;
298+
document.SetObject();
299+
rapidjson::Document::AllocatorType& allocator = document.GetAllocator();
300+
document.AddMember(rapidjson::Value(kTextKey, allocator),
301+
rapidjson::Value(string_clipboard, allocator),
302+
allocator);
303+
result->Success(document);
304+
}
305+
306+
void SetData(
307+
const flutter::MethodCall<rapidjson::Document>& call,
308+
std::unique_ptr<flutter::MethodResult<rapidjson::Document>> result) {
309+
const rapidjson::Value& document = *call.arguments();
310+
rapidjson::Value::ConstMemberIterator itr = document.FindMember(kTextKey);
311+
if (itr == document.MemberEnd()) {
312+
result->Error(kUnknownClipboardError, "Invalid message format");
313+
return;
314+
}
315+
string_clipboard = itr->value.GetString();
316+
result->Success();
317+
}
318+
} // namespace Clipboard

shell/platform/tizen/channels/platform_channel.h

+9
Original file line numberDiff line numberDiff line change
@@ -28,4 +28,13 @@ class PlatformChannel {
2828
TizenRenderer* renderer_;
2929
};
3030

31+
namespace Clipboard {
32+
void GetData(
33+
const flutter::MethodCall<rapidjson::Document>& call,
34+
std::unique_ptr<flutter::MethodResult<rapidjson::Document>> result);
35+
void SetData(
36+
const flutter::MethodCall<rapidjson::Document>& call,
37+
std::unique_ptr<flutter::MethodResult<rapidjson::Document>> result);
38+
};
39+
3140
#endif // EMBEDDER_PLATFORM_CHANNEL_H_

0 commit comments

Comments
 (0)