Skip to content

Commit d960717

Browse files
committed
[Clipboard] setData and getData implementations added
[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);
1 parent e629333 commit d960717

File tree

2 files changed

+78
-3
lines changed

2 files changed

+78
-3
lines changed

shell/platform/tizen/channels/platform_channel.cc

Lines changed: 69 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
#include "platform_channel.h"
66

77
#include <app.h>
8+
#include <mutex>
89

910
#include "flutter/shell/platform/common/cpp/json_method_codec.h"
1011
#include "flutter/shell/platform/tizen/tizen_log.h"
@@ -13,7 +14,9 @@ static constexpr char kChannelName[] = "flutter/platform";
1314

1415
PlatformChannel::PlatformChannel(flutter::BinaryMessenger* messenger)
1516
: channel_(std::make_unique<flutter::MethodChannel<rapidjson::Document>>(
16-
messenger, kChannelName, &flutter::JsonMethodCodec::GetInstance())) {
17+
messenger,
18+
kChannelName,
19+
&flutter::JsonMethodCodec::GetInstance())) {
1720
channel_->SetMethodCallHandler(
1821
[this](
1922
const flutter::MethodCall<rapidjson::Document>& call,
@@ -29,6 +32,7 @@ void PlatformChannel::HandleMethodCall(
2932
std::unique_ptr<flutter::MethodResult<rapidjson::Document>> result) {
3033
const auto method = call.method_name();
3134

35+
FT_LOGI("pkosko Called method : %s", method.c_str());
3236
if (method == "SystemNavigator.pop") {
3337
ui_app_exit();
3438
result->Success();
@@ -37,9 +41,9 @@ void PlatformChannel::HandleMethodCall(
3741
} else if (method == "HapticFeedback.vibrate") {
3842
result->NotImplemented();
3943
} else if (method == "Clipboard.getData") {
40-
result->NotImplemented();
44+
Clipboard::GetData(call, std::move(result));
4145
} else if (method == "Clipboard.setData") {
42-
result->NotImplemented();
46+
Clipboard::SetData(call, std::move(result));
4347
} else if (method == "Clipboard.hasStrings") {
4448
result->NotImplemented();
4549
} else if (method == "SystemChrome.setPreferredOrientations") {
@@ -57,3 +61,65 @@ void PlatformChannel::HandleMethodCall(
5761
result->NotImplemented();
5862
}
5963
}
64+
65+
// Clipboard constants and variables
66+
namespace Clipboard {
67+
68+
// naive implementation using std::string as a container of internal clipboard
69+
// data
70+
std::mutex is_processing_mutex;
71+
std::string string_clipboard = "";
72+
73+
static constexpr char kTextKey[] = "text";
74+
static constexpr char kTextPlainFormat[] = "text/plain";
75+
static constexpr char kUnknownClipboardFormatError[] =
76+
"Unknown clipboard format error";
77+
static constexpr char kUnknownClipboardError[] =
78+
"Unknown error during clipboard data retrieval";
79+
80+
void GetData(
81+
const flutter::MethodCall<rapidjson::Document>& call,
82+
std::unique_ptr<flutter::MethodResult<rapidjson::Document>> result) {
83+
const rapidjson::Value& format = call.arguments()[0];
84+
85+
// https://api.flutter.dev/flutter/services/Clipboard/kTextPlain-constant.html
86+
// API supports only kTextPlain format
87+
if (strcmp(format.GetString(), kTextPlainFormat) != 0) {
88+
result->Error(kUnknownClipboardFormatError,
89+
"Clipboard API only supports text.");
90+
return;
91+
}
92+
93+
{
94+
std::unique_lock<std::mutex> lock(is_processing_mutex);
95+
if (string_clipboard.empty()) {
96+
result->Error(kUnknownClipboardError, "No clipboard data available.");
97+
} else {
98+
rapidjson::Document document;
99+
document.SetObject();
100+
rapidjson::Document::AllocatorType& allocator = document.GetAllocator();
101+
document.AddMember(rapidjson::Value(kTextKey, allocator),
102+
rapidjson::Value(string_clipboard, allocator),
103+
allocator);
104+
result->Success(document);
105+
}
106+
}
107+
}
108+
109+
void SetData(
110+
const flutter::MethodCall<rapidjson::Document>& call,
111+
std::unique_ptr<flutter::MethodResult<rapidjson::Document>> result) {
112+
const rapidjson::Value& document = *call.arguments();
113+
rapidjson::Value::ConstMemberIterator itr = document.FindMember(kTextKey);
114+
if (itr == document.MemberEnd()) {
115+
result->Error(kUnknownClipboardError, "Invalid message format");
116+
return;
117+
}
118+
{
119+
std::unique_lock<std::mutex> lock(is_processing_mutex);
120+
string_clipboard = itr->value.GetString();
121+
FT_LOGI("pkosko Set value of clipboard : %s", string_clipboard.c_str());
122+
result->Success();
123+
}
124+
}
125+
} // namespace Clipboard

shell/platform/tizen/channels/platform_channel.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,4 +22,13 @@ class PlatformChannel {
2222
std::unique_ptr<flutter::MethodResult<rapidjson::Document>> result);
2323
};
2424

25+
namespace Clipboard {
26+
void GetData(
27+
const flutter::MethodCall<rapidjson::Document>& call,
28+
std::unique_ptr<flutter::MethodResult<rapidjson::Document>> result);
29+
void SetData(
30+
const flutter::MethodCall<rapidjson::Document>& call,
31+
std::unique_ptr<flutter::MethodResult<rapidjson::Document>> result);
32+
};
33+
2534
#endif // EMBEDDER_PLATFORM_CHANNEL_H_

0 commit comments

Comments
 (0)