diff --git a/shell/platform/tizen/channels/platform_channel.cc b/shell/platform/tizen/channels/platform_channel.cc index 172bd4a942610..5051a50af6b1a 100644 --- a/shell/platform/tizen/channels/platform_channel.cc +++ b/shell/platform/tizen/channels/platform_channel.cc @@ -214,11 +214,9 @@ void PlatformChannel::HandleMethodCall( result->Error(error_cause, error_message); } else if (method == "Clipboard.getData") { - result->NotImplemented(); + Clipboard::GetData(call, std::move(result)); } else if (method == "Clipboard.setData") { - result->NotImplemented(); - } else if (method == "Clipboard.hasStrings") { - result->NotImplemented(); + Clipboard::SetData(call, std::move(result)); } else if (method == "SystemChrome.setPreferredOrientations") { if (renderer_) { static const std::string kPortraitUp = "DeviceOrientation.portraitUp"; @@ -268,3 +266,53 @@ void PlatformChannel::HandleMethodCall( result->NotImplemented(); } } + +// Clipboard constants and variables +namespace Clipboard { + +// naive implementation using std::string as a container of internal clipboard +// data +std::string string_clipboard = ""; + +static constexpr char kTextKey[] = "text"; +static constexpr char kTextPlainFormat[] = "text/plain"; +static constexpr char kUnknownClipboardFormatError[] = + "Unknown clipboard format error"; +static constexpr char kUnknownClipboardError[] = + "Unknown error during clipboard data retrieval"; + +void GetData( + const flutter::MethodCall& call, + std::unique_ptr> result) { + const rapidjson::Value& format = call.arguments()[0]; + + // https://api.flutter.dev/flutter/services/Clipboard/kTextPlain-constant.html + // API supports only kTextPlain format + if (strcmp(format.GetString(), kTextPlainFormat) != 0) { + result->Error(kUnknownClipboardFormatError, + "Clipboard API only supports text."); + return; + } + + rapidjson::Document document; + document.SetObject(); + rapidjson::Document::AllocatorType& allocator = document.GetAllocator(); + document.AddMember(rapidjson::Value(kTextKey, allocator), + rapidjson::Value(string_clipboard, allocator), + allocator); + result->Success(document); +} + +void SetData( + const flutter::MethodCall& call, + std::unique_ptr> result) { + const rapidjson::Value& document = *call.arguments(); + rapidjson::Value::ConstMemberIterator itr = document.FindMember(kTextKey); + if (itr == document.MemberEnd()) { + result->Error(kUnknownClipboardError, "Invalid message format"); + return; + } + string_clipboard = itr->value.GetString(); + result->Success(); +} +} // namespace Clipboard diff --git a/shell/platform/tizen/channels/platform_channel.h b/shell/platform/tizen/channels/platform_channel.h index 50b73756b4863..7224a2238b31e 100644 --- a/shell/platform/tizen/channels/platform_channel.h +++ b/shell/platform/tizen/channels/platform_channel.h @@ -28,4 +28,13 @@ class PlatformChannel { TizenRenderer* renderer_; }; +namespace Clipboard { +void GetData( + const flutter::MethodCall& call, + std::unique_ptr> result); +void SetData( + const flutter::MethodCall& call, + std::unique_ptr> result); +}; + #endif // EMBEDDER_PLATFORM_CHANNEL_H_