1 /* 2 * Copyright (c) 2021-2022 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 #include "ui_controller.h" 16 17 namespace OHOS::uitest { 18 using namespace std; 19 mutex UiController::controllerAccessMutex_; 20 list<unique_ptr<UiController>> UiController::controllers_; 21 UiControllerProvider UiController::controllerProvider_; 22 UiController(string_view name)23 UiController::UiController(string_view name) : name_(name) {} 24 RegisterControllerProvider(UiControllerProvider func)25 void UiController::RegisterControllerProvider(UiControllerProvider func) 26 { 27 controllerProvider_ = move(func); 28 } 29 RegisterController(unique_ptr<UiController> controller,Priority priority)30 void UiController::RegisterController(unique_ptr<UiController> controller, Priority priority) 31 { 32 if (controller == nullptr) { 33 return; 34 } 35 LOG_I("Add controller '%{public}s', priority=%{public}d", controller->GetName().c_str(), priority); 36 controller->SetPriority(priority); 37 lock_guard<mutex> guard(controllerAccessMutex_); 38 controllers_.push_back(move(controller)); 39 // sort controllers by priority descending 40 controllers_.sort(UiController::Comparator); 41 } 42 InstallFromProvider()43 void UiController::InstallFromProvider() 44 { 45 if (controllers_.empty() && controllerProvider_ != nullptr) { 46 // install controller on-demand 47 LOG_I("Begin to install UiControllers"); 48 auto receiver = list<unique_ptr<UiController>>(); 49 controllerProvider_(receiver); 50 for (auto &uPtr : receiver) { 51 const auto priority = uPtr->priority_; 52 RegisterController(move(uPtr), priority); 53 } 54 } 55 } 56 GetController()57 UiController *UiController::GetController() 58 { 59 lock_guard<mutex> guard(controllerAccessMutex_); 60 for (auto &ctrl : controllers_) { 61 if (ctrl->IsWorkable()) { 62 return ctrl.get(); 63 } 64 } 65 return nullptr; 66 } 67 Comparator(const unique_ptr<UiController> & c1,const unique_ptr<UiController> & c2)68 bool UiController::Comparator(const unique_ptr<UiController> &c1, const unique_ptr<UiController> &c2) 69 { 70 return c1->priority_ > c2->priority_; 71 } 72 RemoveController(string_view name)73 void UiController::RemoveController(string_view name) 74 { 75 lock_guard<mutex> guard(controllerAccessMutex_); 76 auto iter = controllers_.begin(); 77 while (iter != controllers_.end()) { 78 if ((*iter)->name_ == name) { 79 iter = controllers_.erase(iter); 80 } else { 81 iter++; 82 } 83 } 84 } 85 RemoveAllControllers()86 void UiController::RemoveAllControllers() 87 { 88 lock_guard<mutex> guard(controllerAccessMutex_); 89 controllerProvider_ = nullptr; 90 controllers_.clear(); 91 } 92 } // namespace OHOS::uitest 93