55#include " app_control.h"
66
77#include " flutter/shell/platform/tizen/channels/app_control_channel.h"
8+ #include " flutter/shell/platform/tizen/logger.h"
9+
10+ intptr_t NativeInitializeDartApi (void * data) {
11+ return Dart_InitializeApiDL (data);
12+ }
13+
14+ int32_t NativeCreateAppControl (Dart_Handle handle) {
15+ auto app_control = std::make_unique<flutter::AppControl>();
16+ if (!app_control->handle ()) {
17+ return -1 ;
18+ }
19+ auto id = app_control->id ();
20+ Dart_NewFinalizableHandle_DL (
21+ handle, app_control.get (), 64 ,
22+ [](void * isolate_callback_data, void * peer) {
23+ auto app_control = reinterpret_cast <flutter::AppControl*>(peer);
24+ flutter::AppControlManager::GetInstance ().Remove (app_control->id ());
25+ });
26+ flutter::AppControlManager::GetInstance ().Insert (std::move (app_control));
27+ return id;
28+ }
29+
30+ bool NativeAttachAppControl (int32_t id, Dart_Handle handle) {
31+ auto app_control = flutter::AppControlManager::GetInstance ().FindById (id);
32+ if (!app_control || !app_control->handle ()) {
33+ return false ;
34+ }
35+ Dart_NewFinalizableHandle_DL (
36+ handle, app_control, 64 , [](void * isolate_callback_data, void * peer) {
37+ auto app_control = reinterpret_cast <flutter::AppControl*>(peer);
38+ flutter::AppControlManager::GetInstance ().Remove (app_control->id ());
39+ });
40+ return true ;
41+ }
842
943namespace flutter {
1044
11- int AppControl::next_id_ = 0 ;
45+ int32_t AppControl::next_id_ = 0 ;
1246
13- AppControl::AppControl (app_control_h app_control) : id_(next_id_++) {
14- handle_ = app_control;
47+ AppControl::AppControl () : id_(next_id_++) {
48+ app_control_h handle = nullptr ;
49+ AppControlResult ret = app_control_create (&handle);
50+ if (!ret) {
51+ FT_LOG (Error) << " app_control_create() failed: " << ret.message ();
52+ return ;
53+ }
54+ handle_ = handle;
55+ }
56+
57+ AppControl::AppControl (app_control_h handle) : id_(next_id_++) {
58+ app_control_h clone = nullptr ;
59+ AppControlResult ret = app_control_clone (&clone, handle);
60+ if (!ret) {
61+ FT_LOG (Error) << " app_control_clone() failed: " << ret.message ();
62+ return ;
63+ }
64+ handle_ = clone;
1565}
1666
1767AppControl::~AppControl () {
18- app_control_destroy (handle_);
68+ if (handle_) {
69+ app_control_destroy (handle_);
70+ }
1971}
2072
2173AppControlResult AppControl::GetString (std::string& str,
@@ -109,14 +161,6 @@ AppControlResult AppControl::SetExtraData(const EncodableMap& map) {
109161 return AppControlResult ();
110162}
111163
112- void AppControl::SetManager (AppControlChannel* manager) {
113- manager_ = manager;
114- }
115-
116- AppControlChannel* AppControl::GetManager () {
117- return manager_;
118- }
119-
120164AppControlResult AppControl::GetOperation (std::string& operation) {
121165 return GetString (operation, app_control_get_operation);
122166}
@@ -183,6 +227,12 @@ AppControlResult AppControl::SetLaunchMode(const std::string& launch_mode) {
183227 return AppControlResult (ret);
184228}
185229
230+ bool AppControl::IsReplyRequested () {
231+ bool requested = false ;
232+ app_control_is_reply_requested (handle_, &requested);
233+ return requested;
234+ }
235+
186236EncodableValue AppControl::SerializeAppControlToMap () {
187237 std::string app_id, operation, mime, category, uri, caller_id, launch_mode;
188238 AppControlResult results[7 ];
@@ -202,43 +252,31 @@ EncodableValue AppControl::SerializeAppControlToMap() {
202252 }
203253 }
204254 EncodableMap map;
205- map[EncodableValue (" id" )] = EncodableValue (GetId ());
255+ map[EncodableValue (" id" )] = EncodableValue (id ());
206256 map[EncodableValue (" appId" )] = EncodableValue (app_id);
207257 map[EncodableValue (" operation" )] = EncodableValue (operation);
208258 map[EncodableValue (" mime" )] = EncodableValue (mime);
209259 map[EncodableValue (" category" )] = EncodableValue (category);
210260 map[EncodableValue (" uri" )] = EncodableValue (uri);
211- map[EncodableValue (" callerId " )] = EncodableValue (caller_id);
261+ map[EncodableValue (" callerAppId " )] = EncodableValue (caller_id);
212262 map[EncodableValue (" launchMode" )] = EncodableValue (launch_mode);
213263 map[EncodableValue (" extraData" )] = EncodableValue (extra_data);
264+ map[EncodableValue (" shouldReply" )] = EncodableValue (IsReplyRequested ());
214265
215266 return EncodableValue (map);
216267}
217268
218269AppControlResult AppControl::SendLaunchRequest () {
219- AppControlResult ret =
220- app_control_send_launch_request (handle_, nullptr , nullptr );
221- return ret;
270+ return app_control_send_launch_request (handle_, nullptr , nullptr );
222271}
223272
224273AppControlResult AppControl::SendLaunchRequestWithReply (
225- std::shared_ptr<EventSink<EncodableValue>> reply_sink,
226- AppControlChannel* manager) {
227- SetManager (manager);
228- auto on_reply = [](app_control_h request, app_control_h reply,
229- app_control_result_e result, void * user_data) {
274+ ReplyCallback on_reply) {
275+ auto reply_callback = [](app_control_h request, app_control_h reply,
276+ app_control_result_e result, void * user_data) {
230277 AppControl* app_control = static_cast <AppControl*>(user_data);
231- app_control_h clone = nullptr ;
232- AppControlResult ret = app_control_clone (&clone, reply);
233- if (!ret) {
234- FT_LOG (Error) << " Could not clone app_control: " << ret.message ();
235- return ;
236- }
237-
238- std::shared_ptr<AppControl> app_control_reply =
239- std::make_shared<AppControl>(clone);
278+ auto app_control_reply = std::make_unique<AppControl>(reply);
240279 EncodableMap map;
241- map[EncodableValue (" id" )] = EncodableValue (app_control->GetId ());
242280 map[EncodableValue (" reply" )] =
243281 app_control_reply->SerializeAppControlToMap ();
244282 if (result == APP_CONTROL_RESULT_APP_STARTED) {
@@ -250,23 +288,20 @@ AppControlResult AppControl::SendLaunchRequestWithReply(
250288 } else if (result == APP_CONTROL_RESULT_CANCELED) {
251289 map[EncodableValue (" result" )] = EncodableValue (" canceled" );
252290 }
253-
254- app_control->reply_sink_ ->Success (EncodableValue (map));
255- app_control->GetManager ()->AddExistingAppControl (
256- std::move (app_control_reply));
291+ app_control->on_reply_ (EncodableValue (map));
292+ app_control->on_reply_ = nullptr ;
293+ AppControlManager::GetInstance ().Insert (std::move (app_control_reply));
257294 };
258- reply_sink_ = std::move (reply_sink);
259- AppControlResult ret =
260- app_control_send_launch_request (handle_, on_reply, this );
261- return ret;
295+ on_reply_ = on_reply;
296+ return app_control_send_launch_request (handle_, reply_callback, this );
262297}
263298
264299AppControlResult AppControl::SendTerminateRequest () {
265300 AppControlResult ret = app_control_send_terminate_request (handle_);
266301 return ret;
267302}
268303
269- AppControlResult AppControl::Reply (std::shared_ptr< AppControl> reply,
304+ AppControlResult AppControl::Reply (AppControl* reply,
270305 const std::string& result) {
271306 app_control_result_e result_e;
272307 if (result == " appStarted" ) {
@@ -281,7 +316,7 @@ AppControlResult AppControl::Reply(std::shared_ptr<AppControl> reply,
281316 return AppControlResult (APP_CONTROL_ERROR_INVALID_PARAMETER);
282317 }
283318 AppControlResult ret = app_control_reply_to_launch_request (
284- reply->Handle (), this ->handle_ , result_e);
319+ reply->handle (), this ->handle_ , result_e);
285320 return ret;
286321}
287322
0 commit comments