1c29fa5a6Sopenharmony_ci/* 2c29fa5a6Sopenharmony_ci * Copyright (c) 2023 Huawei Device Co., Ltd. 3c29fa5a6Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4c29fa5a6Sopenharmony_ci * you may not use this file except in compliance with the License. 5c29fa5a6Sopenharmony_ci * You may obtain a copy of the License at 6c29fa5a6Sopenharmony_ci * 7c29fa5a6Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8c29fa5a6Sopenharmony_ci * 9c29fa5a6Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10c29fa5a6Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11c29fa5a6Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12c29fa5a6Sopenharmony_ci * See the License for the specific language governing permissions and 13c29fa5a6Sopenharmony_ci * limitations under the License. 14c29fa5a6Sopenharmony_ci */ 15c29fa5a6Sopenharmony_ci 16c29fa5a6Sopenharmony_ci#include "cooperate.h" 17c29fa5a6Sopenharmony_ci 18c29fa5a6Sopenharmony_ci#ifdef ENABLE_PERFORMANCE_CHECK 19c29fa5a6Sopenharmony_ci#include <sstream> 20c29fa5a6Sopenharmony_ci#include "utility.h" 21c29fa5a6Sopenharmony_ci#endif // ENABLE_PERFORMANCE_CHECK 22c29fa5a6Sopenharmony_ci 23c29fa5a6Sopenharmony_ci#include "devicestatus_define.h" 24c29fa5a6Sopenharmony_ci 25c29fa5a6Sopenharmony_ci#undef LOG_TAG 26c29fa5a6Sopenharmony_ci#define LOG_TAG "Cooperate" 27c29fa5a6Sopenharmony_ci 28c29fa5a6Sopenharmony_cinamespace OHOS { 29c29fa5a6Sopenharmony_cinamespace Msdp { 30c29fa5a6Sopenharmony_cinamespace DeviceStatus { 31c29fa5a6Sopenharmony_cinamespace Cooperate { 32c29fa5a6Sopenharmony_ci 33c29fa5a6Sopenharmony_ciCooperate::Cooperate(IContext *env) 34c29fa5a6Sopenharmony_ci : env_(env), context_(env), sm_(env) 35c29fa5a6Sopenharmony_ci{ 36c29fa5a6Sopenharmony_ci auto [sender, receiver] = Channel<CooperateEvent>::OpenChannel(); 37c29fa5a6Sopenharmony_ci receiver_ = receiver; 38c29fa5a6Sopenharmony_ci receiver_.Enable(); 39c29fa5a6Sopenharmony_ci context_.AttachSender(sender); 40c29fa5a6Sopenharmony_ci context_.Enable(); 41c29fa5a6Sopenharmony_ci StartWorker(); 42c29fa5a6Sopenharmony_ci} 43c29fa5a6Sopenharmony_ci 44c29fa5a6Sopenharmony_ciCooperate::~Cooperate() 45c29fa5a6Sopenharmony_ci{ 46c29fa5a6Sopenharmony_ci StopWorker(); 47c29fa5a6Sopenharmony_ci context_.Disable(); 48c29fa5a6Sopenharmony_ci} 49c29fa5a6Sopenharmony_ci 50c29fa5a6Sopenharmony_civoid Cooperate::AddObserver(std::shared_ptr<ICooperateObserver> observer) 51c29fa5a6Sopenharmony_ci{ 52c29fa5a6Sopenharmony_ci CALL_DEBUG_ENTER; 53c29fa5a6Sopenharmony_ci auto ret = context_.Sender().Send(CooperateEvent( 54c29fa5a6Sopenharmony_ci CooperateEventType::ADD_OBSERVER, 55c29fa5a6Sopenharmony_ci AddObserverEvent { 56c29fa5a6Sopenharmony_ci .observer = observer 57c29fa5a6Sopenharmony_ci })); 58c29fa5a6Sopenharmony_ci if (ret != Channel<CooperateEvent>::NO_ERROR) { 59c29fa5a6Sopenharmony_ci FI_HILOGE("Failed to send event via channel, error:%{public}d", ret); 60c29fa5a6Sopenharmony_ci } 61c29fa5a6Sopenharmony_ci} 62c29fa5a6Sopenharmony_ci 63c29fa5a6Sopenharmony_civoid Cooperate::RemoveObserver(std::shared_ptr<ICooperateObserver> observer) 64c29fa5a6Sopenharmony_ci{ 65c29fa5a6Sopenharmony_ci CALL_DEBUG_ENTER; 66c29fa5a6Sopenharmony_ci auto ret = context_.Sender().Send(CooperateEvent( 67c29fa5a6Sopenharmony_ci CooperateEventType::REMOVE_OBSERVER, 68c29fa5a6Sopenharmony_ci RemoveObserverEvent { 69c29fa5a6Sopenharmony_ci .observer = observer 70c29fa5a6Sopenharmony_ci })); 71c29fa5a6Sopenharmony_ci if (ret != Channel<CooperateEvent>::NO_ERROR) { 72c29fa5a6Sopenharmony_ci FI_HILOGE("Failed to send event via channel, error:%{public}d", ret); 73c29fa5a6Sopenharmony_ci } 74c29fa5a6Sopenharmony_ci} 75c29fa5a6Sopenharmony_ci 76c29fa5a6Sopenharmony_ciint32_t Cooperate::RegisterListener(int32_t pid) 77c29fa5a6Sopenharmony_ci{ 78c29fa5a6Sopenharmony_ci CALL_DEBUG_ENTER; 79c29fa5a6Sopenharmony_ci auto ret = context_.Sender().Send(CooperateEvent( 80c29fa5a6Sopenharmony_ci CooperateEventType::REGISTER_LISTENER, 81c29fa5a6Sopenharmony_ci RegisterListenerEvent { 82c29fa5a6Sopenharmony_ci .pid = pid 83c29fa5a6Sopenharmony_ci })); 84c29fa5a6Sopenharmony_ci if (ret != Channel<CooperateEvent>::NO_ERROR) { 85c29fa5a6Sopenharmony_ci FI_HILOGE("Failed to send event via channel, error:%{public}d", ret); 86c29fa5a6Sopenharmony_ci } 87c29fa5a6Sopenharmony_ci return RET_OK; 88c29fa5a6Sopenharmony_ci} 89c29fa5a6Sopenharmony_ci 90c29fa5a6Sopenharmony_ciint32_t Cooperate::UnregisterListener(int32_t pid) 91c29fa5a6Sopenharmony_ci{ 92c29fa5a6Sopenharmony_ci CALL_DEBUG_ENTER; 93c29fa5a6Sopenharmony_ci auto ret = context_.Sender().Send(CooperateEvent( 94c29fa5a6Sopenharmony_ci CooperateEventType::UNREGISTER_LISTENER, 95c29fa5a6Sopenharmony_ci UnregisterListenerEvent { 96c29fa5a6Sopenharmony_ci .pid = pid 97c29fa5a6Sopenharmony_ci })); 98c29fa5a6Sopenharmony_ci if (ret != Channel<CooperateEvent>::NO_ERROR) { 99c29fa5a6Sopenharmony_ci FI_HILOGE("Failed to send event via channel, error:%{public}d", ret); 100c29fa5a6Sopenharmony_ci } 101c29fa5a6Sopenharmony_ci return RET_OK; 102c29fa5a6Sopenharmony_ci} 103c29fa5a6Sopenharmony_ci 104c29fa5a6Sopenharmony_ciint32_t Cooperate::RegisterHotAreaListener(int32_t pid) 105c29fa5a6Sopenharmony_ci{ 106c29fa5a6Sopenharmony_ci CALL_DEBUG_ENTER; 107c29fa5a6Sopenharmony_ci auto ret = context_.Sender().Send(CooperateEvent( 108c29fa5a6Sopenharmony_ci CooperateEventType::REGISTER_HOTAREA_LISTENER, 109c29fa5a6Sopenharmony_ci RegisterHotareaListenerEvent { 110c29fa5a6Sopenharmony_ci .pid = pid 111c29fa5a6Sopenharmony_ci })); 112c29fa5a6Sopenharmony_ci if (ret != Channel<CooperateEvent>::NO_ERROR) { 113c29fa5a6Sopenharmony_ci FI_HILOGE("Failed to send event via channel, error:%{public}d", ret); 114c29fa5a6Sopenharmony_ci } 115c29fa5a6Sopenharmony_ci return RET_OK; 116c29fa5a6Sopenharmony_ci} 117c29fa5a6Sopenharmony_ci 118c29fa5a6Sopenharmony_ciint32_t Cooperate::UnregisterHotAreaListener(int32_t pid) 119c29fa5a6Sopenharmony_ci{ 120c29fa5a6Sopenharmony_ci CALL_DEBUG_ENTER; 121c29fa5a6Sopenharmony_ci auto ret = context_.Sender().Send(CooperateEvent( 122c29fa5a6Sopenharmony_ci CooperateEventType::UNREGISTER_HOTAREA_LISTENER, 123c29fa5a6Sopenharmony_ci UnregisterHotareaListenerEvent { 124c29fa5a6Sopenharmony_ci .pid = pid 125c29fa5a6Sopenharmony_ci })); 126c29fa5a6Sopenharmony_ci if (ret != Channel<CooperateEvent>::NO_ERROR) { 127c29fa5a6Sopenharmony_ci FI_HILOGE("Failed to send event via channel, error:%{public}d", ret); 128c29fa5a6Sopenharmony_ci } 129c29fa5a6Sopenharmony_ci return RET_OK; 130c29fa5a6Sopenharmony_ci} 131c29fa5a6Sopenharmony_ci 132c29fa5a6Sopenharmony_ciint32_t Cooperate::Enable(int32_t tokenId, int32_t pid, int32_t userData) 133c29fa5a6Sopenharmony_ci{ 134c29fa5a6Sopenharmony_ci CALL_DEBUG_ENTER; 135c29fa5a6Sopenharmony_ci auto ret = context_.Sender().Send(CooperateEvent( 136c29fa5a6Sopenharmony_ci CooperateEventType::ENABLE, 137c29fa5a6Sopenharmony_ci EnableCooperateEvent { 138c29fa5a6Sopenharmony_ci .tokenId = tokenId, 139c29fa5a6Sopenharmony_ci .pid = pid, 140c29fa5a6Sopenharmony_ci .userData = userData, 141c29fa5a6Sopenharmony_ci })); 142c29fa5a6Sopenharmony_ci if (ret != Channel<CooperateEvent>::NO_ERROR) { 143c29fa5a6Sopenharmony_ci FI_HILOGE("Failed to send event via channel, error:%{public}d", ret); 144c29fa5a6Sopenharmony_ci } 145c29fa5a6Sopenharmony_ci return RET_OK; 146c29fa5a6Sopenharmony_ci} 147c29fa5a6Sopenharmony_ci 148c29fa5a6Sopenharmony_ciint32_t Cooperate::Disable(int32_t pid, int32_t userData) 149c29fa5a6Sopenharmony_ci{ 150c29fa5a6Sopenharmony_ci CALL_DEBUG_ENTER; 151c29fa5a6Sopenharmony_ci auto ret = context_.Sender().Send(CooperateEvent( 152c29fa5a6Sopenharmony_ci CooperateEventType::DISABLE, 153c29fa5a6Sopenharmony_ci DisableCooperateEvent { 154c29fa5a6Sopenharmony_ci .pid = pid, 155c29fa5a6Sopenharmony_ci .userData = userData, 156c29fa5a6Sopenharmony_ci })); 157c29fa5a6Sopenharmony_ci if (ret != Channel<CooperateEvent>::NO_ERROR) { 158c29fa5a6Sopenharmony_ci FI_HILOGE("Failed to send event via channel, error:%{public}d", ret); 159c29fa5a6Sopenharmony_ci } 160c29fa5a6Sopenharmony_ci return RET_OK; 161c29fa5a6Sopenharmony_ci} 162c29fa5a6Sopenharmony_ci 163c29fa5a6Sopenharmony_ciint32_t Cooperate::Start(int32_t pid, int32_t userData, const std::string &remoteNetworkId, int32_t startDeviceId) 164c29fa5a6Sopenharmony_ci{ 165c29fa5a6Sopenharmony_ci CALL_DEBUG_ENTER; 166c29fa5a6Sopenharmony_ci 167c29fa5a6Sopenharmony_ci#ifdef ENABLE_PERFORMANCE_CHECK 168c29fa5a6Sopenharmony_ci std::ostringstream ss; 169c29fa5a6Sopenharmony_ci ss << "start_cooperation_with_" << Utility::Anonymize(remoteNetworkId).c_str(); 170c29fa5a6Sopenharmony_ci context_.StartTrace(ss.str()); 171c29fa5a6Sopenharmony_ci#endif // ENABLE_PERFORMANCE_CHECK 172c29fa5a6Sopenharmony_ci StartCooperateEvent event { 173c29fa5a6Sopenharmony_ci .pid = pid, 174c29fa5a6Sopenharmony_ci .userData = userData, 175c29fa5a6Sopenharmony_ci .remoteNetworkId = remoteNetworkId, 176c29fa5a6Sopenharmony_ci .startDeviceId = startDeviceId, 177c29fa5a6Sopenharmony_ci .errCode = std::make_shared<std::promise<int32_t>>(), 178c29fa5a6Sopenharmony_ci }; 179c29fa5a6Sopenharmony_ci auto errCode = event.errCode->get_future(); 180c29fa5a6Sopenharmony_ci auto ret = context_.Sender().Send(CooperateEvent(CooperateEventType::START, event)); 181c29fa5a6Sopenharmony_ci if (ret != Channel<CooperateEvent>::NO_ERROR) { 182c29fa5a6Sopenharmony_ci FI_HILOGE("Failed to send event via channel, error:%{public}d", ret); 183c29fa5a6Sopenharmony_ci } 184c29fa5a6Sopenharmony_ci return errCode.get(); 185c29fa5a6Sopenharmony_ci} 186c29fa5a6Sopenharmony_ci 187c29fa5a6Sopenharmony_ciint32_t Cooperate::Stop(int32_t pid, int32_t userData, bool isUnchained) 188c29fa5a6Sopenharmony_ci{ 189c29fa5a6Sopenharmony_ci CALL_DEBUG_ENTER; 190c29fa5a6Sopenharmony_ci auto ret = context_.Sender().Send(CooperateEvent( 191c29fa5a6Sopenharmony_ci CooperateEventType::STOP, 192c29fa5a6Sopenharmony_ci StopCooperateEvent { 193c29fa5a6Sopenharmony_ci .pid = pid, 194c29fa5a6Sopenharmony_ci .userData = userData, 195c29fa5a6Sopenharmony_ci .isUnchained = isUnchained, 196c29fa5a6Sopenharmony_ci })); 197c29fa5a6Sopenharmony_ci if (ret != Channel<CooperateEvent>::NO_ERROR) { 198c29fa5a6Sopenharmony_ci FI_HILOGE("Failed to send event via channel, error:%{public}d", ret); 199c29fa5a6Sopenharmony_ci } 200c29fa5a6Sopenharmony_ci return RET_OK; 201c29fa5a6Sopenharmony_ci} 202c29fa5a6Sopenharmony_ci 203c29fa5a6Sopenharmony_ciint32_t Cooperate::GetCooperateState(int32_t pid, int32_t userData, const std::string &networkId) 204c29fa5a6Sopenharmony_ci{ 205c29fa5a6Sopenharmony_ci CALL_DEBUG_ENTER; 206c29fa5a6Sopenharmony_ci auto ret = context_.Sender().Send(CooperateEvent( 207c29fa5a6Sopenharmony_ci CooperateEventType::GET_COOPERATE_STATE, 208c29fa5a6Sopenharmony_ci GetCooperateStateEvent { 209c29fa5a6Sopenharmony_ci .pid = pid, 210c29fa5a6Sopenharmony_ci .userData = userData, 211c29fa5a6Sopenharmony_ci .networkId = networkId, 212c29fa5a6Sopenharmony_ci })); 213c29fa5a6Sopenharmony_ci if (ret != Channel<CooperateEvent>::NO_ERROR) { 214c29fa5a6Sopenharmony_ci FI_HILOGE("Failed to send event via channel, error:%{public}d", ret); 215c29fa5a6Sopenharmony_ci } 216c29fa5a6Sopenharmony_ci return RET_OK; 217c29fa5a6Sopenharmony_ci} 218c29fa5a6Sopenharmony_ci 219c29fa5a6Sopenharmony_ciint32_t Cooperate::RegisterEventListener(int32_t pid, const std::string &networkId) 220c29fa5a6Sopenharmony_ci{ 221c29fa5a6Sopenharmony_ci CALL_DEBUG_ENTER; 222c29fa5a6Sopenharmony_ci auto ret = context_.Sender().Send(CooperateEvent( 223c29fa5a6Sopenharmony_ci CooperateEventType::REGISTER_EVENT_LISTENER, 224c29fa5a6Sopenharmony_ci RegisterEventListenerEvent { 225c29fa5a6Sopenharmony_ci .pid = pid, 226c29fa5a6Sopenharmony_ci .networkId = networkId, 227c29fa5a6Sopenharmony_ci })); 228c29fa5a6Sopenharmony_ci if (ret != Channel<CooperateEvent>::NO_ERROR) { 229c29fa5a6Sopenharmony_ci FI_HILOGE("Failed to send event via channel, error:%{public}d", ret); 230c29fa5a6Sopenharmony_ci } 231c29fa5a6Sopenharmony_ci return RET_OK; 232c29fa5a6Sopenharmony_ci} 233c29fa5a6Sopenharmony_ci 234c29fa5a6Sopenharmony_ciint32_t Cooperate::UnregisterEventListener(int32_t pid, const std::string &networkId) 235c29fa5a6Sopenharmony_ci{ 236c29fa5a6Sopenharmony_ci CALL_DEBUG_ENTER; 237c29fa5a6Sopenharmony_ci auto ret = context_.Sender().Send(CooperateEvent( 238c29fa5a6Sopenharmony_ci CooperateEventType::UNREGISTER_EVENT_LISTENER, 239c29fa5a6Sopenharmony_ci UnregisterEventListenerEvent { 240c29fa5a6Sopenharmony_ci .pid = pid, 241c29fa5a6Sopenharmony_ci .networkId = networkId, 242c29fa5a6Sopenharmony_ci })); 243c29fa5a6Sopenharmony_ci if (ret != Channel<CooperateEvent>::NO_ERROR) { 244c29fa5a6Sopenharmony_ci FI_HILOGE("Failed to send event via channel, error:%{public}d", ret); 245c29fa5a6Sopenharmony_ci } 246c29fa5a6Sopenharmony_ci return RET_OK; 247c29fa5a6Sopenharmony_ci} 248c29fa5a6Sopenharmony_ci 249c29fa5a6Sopenharmony_ciint32_t Cooperate::GetCooperateState(const std::string &udId, bool &state) 250c29fa5a6Sopenharmony_ci{ 251c29fa5a6Sopenharmony_ci CALL_DEBUG_ENTER; 252c29fa5a6Sopenharmony_ci state = sm_.IsCooperateEnable(); 253c29fa5a6Sopenharmony_ci return RET_OK; 254c29fa5a6Sopenharmony_ci} 255c29fa5a6Sopenharmony_ci 256c29fa5a6Sopenharmony_ciint32_t Cooperate::Update(uint32_t mask, uint32_t flag) 257c29fa5a6Sopenharmony_ci{ 258c29fa5a6Sopenharmony_ci auto ret = context_.Sender().Send(CooperateEvent( 259c29fa5a6Sopenharmony_ci CooperateEventType::UPDATE_COOPERATE_FLAG, 260c29fa5a6Sopenharmony_ci UpdateCooperateFlagEvent { 261c29fa5a6Sopenharmony_ci .mask = mask, 262c29fa5a6Sopenharmony_ci .flag = flag, 263c29fa5a6Sopenharmony_ci })); 264c29fa5a6Sopenharmony_ci if (ret != Channel<CooperateEvent>::NO_ERROR) { 265c29fa5a6Sopenharmony_ci FI_HILOGE("Failed to send event via channel, error:%{public}d", ret); 266c29fa5a6Sopenharmony_ci } 267c29fa5a6Sopenharmony_ci return RET_OK; 268c29fa5a6Sopenharmony_ci} 269c29fa5a6Sopenharmony_ci 270c29fa5a6Sopenharmony_civoid Cooperate::Dump(int32_t fd) 271c29fa5a6Sopenharmony_ci{ 272c29fa5a6Sopenharmony_ci CALL_DEBUG_ENTER; 273c29fa5a6Sopenharmony_ci auto ret = context_.Sender().Send(CooperateEvent( 274c29fa5a6Sopenharmony_ci CooperateEventType::DUMP, 275c29fa5a6Sopenharmony_ci DumpEvent { 276c29fa5a6Sopenharmony_ci .fd = fd 277c29fa5a6Sopenharmony_ci })); 278c29fa5a6Sopenharmony_ci if (ret != Channel<CooperateEvent>::NO_ERROR) { 279c29fa5a6Sopenharmony_ci FI_HILOGE("Failed to send event via channel, error:%{public}d", ret); 280c29fa5a6Sopenharmony_ci } 281c29fa5a6Sopenharmony_ci} 282c29fa5a6Sopenharmony_ci 283c29fa5a6Sopenharmony_civoid Cooperate::Loop() 284c29fa5a6Sopenharmony_ci{ 285c29fa5a6Sopenharmony_ci CALL_DEBUG_ENTER; 286c29fa5a6Sopenharmony_ci bool running = true; 287c29fa5a6Sopenharmony_ci SetThreadName("OS_Cooperate"); 288c29fa5a6Sopenharmony_ci LoadMotionDrag(); 289c29fa5a6Sopenharmony_ci 290c29fa5a6Sopenharmony_ci while (running) { 291c29fa5a6Sopenharmony_ci CooperateEvent event = receiver_.Receive(); 292c29fa5a6Sopenharmony_ci switch (event.type) { 293c29fa5a6Sopenharmony_ci case CooperateEventType::NOOP: { 294c29fa5a6Sopenharmony_ci break; 295c29fa5a6Sopenharmony_ci } 296c29fa5a6Sopenharmony_ci case CooperateEventType::QUIT: { 297c29fa5a6Sopenharmony_ci FI_HILOGI("Skip out of loop"); 298c29fa5a6Sopenharmony_ci running = false; 299c29fa5a6Sopenharmony_ci break; 300c29fa5a6Sopenharmony_ci } 301c29fa5a6Sopenharmony_ci default: { 302c29fa5a6Sopenharmony_ci sm_.OnEvent(context_, event); 303c29fa5a6Sopenharmony_ci break; 304c29fa5a6Sopenharmony_ci } 305c29fa5a6Sopenharmony_ci } 306c29fa5a6Sopenharmony_ci } 307c29fa5a6Sopenharmony_ci} 308c29fa5a6Sopenharmony_ci 309c29fa5a6Sopenharmony_civoid Cooperate::StartWorker() 310c29fa5a6Sopenharmony_ci{ 311c29fa5a6Sopenharmony_ci CALL_DEBUG_ENTER; 312c29fa5a6Sopenharmony_ci std::lock_guard guard(lock_); 313c29fa5a6Sopenharmony_ci if (!workerStarted_) { 314c29fa5a6Sopenharmony_ci workerStarted_ = true; 315c29fa5a6Sopenharmony_ci worker_ = std::thread([this] { this->Loop(); }); 316c29fa5a6Sopenharmony_ci } 317c29fa5a6Sopenharmony_ci} 318c29fa5a6Sopenharmony_ci 319c29fa5a6Sopenharmony_civoid Cooperate::StopWorker() 320c29fa5a6Sopenharmony_ci{ 321c29fa5a6Sopenharmony_ci CALL_DEBUG_ENTER; 322c29fa5a6Sopenharmony_ci std::lock_guard guard(lock_); 323c29fa5a6Sopenharmony_ci if (workerStarted_) { 324c29fa5a6Sopenharmony_ci auto ret = context_.Sender().Send(CooperateEvent(CooperateEventType::QUIT)); 325c29fa5a6Sopenharmony_ci if (ret != Channel<CooperateEvent>::NO_ERROR) { 326c29fa5a6Sopenharmony_ci FI_HILOGE("Failed to send event via channel, error:%{public}d", ret); 327c29fa5a6Sopenharmony_ci } 328c29fa5a6Sopenharmony_ci if (worker_.joinable()) { 329c29fa5a6Sopenharmony_ci worker_.join(); 330c29fa5a6Sopenharmony_ci } 331c29fa5a6Sopenharmony_ci workerStarted_ = false; 332c29fa5a6Sopenharmony_ci } 333c29fa5a6Sopenharmony_ci} 334c29fa5a6Sopenharmony_ci 335c29fa5a6Sopenharmony_civoid Cooperate::LoadMotionDrag() 336c29fa5a6Sopenharmony_ci{ 337c29fa5a6Sopenharmony_ci FI_HILOGI("Load 'MotionDrag' module"); 338c29fa5a6Sopenharmony_ci IMotionDrag *motionDrag = env_->GetPluginManager().LoadMotionDrag(); 339c29fa5a6Sopenharmony_ci if (motionDrag == nullptr) { 340c29fa5a6Sopenharmony_ci FI_HILOGE("Failed to load motion drag"); 341c29fa5a6Sopenharmony_ci return; 342c29fa5a6Sopenharmony_ci } 343c29fa5a6Sopenharmony_ci motionDrag->Enable(context_.EventHandler()); 344c29fa5a6Sopenharmony_ci} 345c29fa5a6Sopenharmony_ci 346c29fa5a6Sopenharmony_ciextern "C" ICooperate* CreateInstance(IContext *env) 347c29fa5a6Sopenharmony_ci{ 348c29fa5a6Sopenharmony_ci CHKPP(env); 349c29fa5a6Sopenharmony_ci return new Cooperate(env); 350c29fa5a6Sopenharmony_ci} 351c29fa5a6Sopenharmony_ci 352c29fa5a6Sopenharmony_ciextern "C" void DestroyInstance(ICooperate *instance) 353c29fa5a6Sopenharmony_ci{ 354c29fa5a6Sopenharmony_ci if (instance != nullptr) { 355c29fa5a6Sopenharmony_ci delete instance; 356c29fa5a6Sopenharmony_ci } 357c29fa5a6Sopenharmony_ci} 358c29fa5a6Sopenharmony_ci} // namespace Cooperate 359c29fa5a6Sopenharmony_ci} // namespace DeviceStatus 360c29fa5a6Sopenharmony_ci} // namespace Msdp 361c29fa5a6Sopenharmony_ci} // namespace OHOS