• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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