1 /*
2 * Copyright (c) 2021 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
16 #include "app_scheduler.h"
17
18 #include "hilog_wrapper.h"
19 #include "ability_util.h"
20 #include "ability_manager_errors.h"
21 #include "ability_record.h"
22 #include "appmgr/app_mgr_constants.h"
23
24 namespace OHOS {
25 namespace AAFwk {
AppScheduler()26 AppScheduler::AppScheduler() : appMgrClient_(std::make_unique<AppExecFwk::AppMgrClient>())
27 {}
28
~AppScheduler()29 AppScheduler::~AppScheduler()
30 {}
31
Init(const std::weak_ptr<AppStateCallback> & callback)32 bool AppScheduler::Init(const std::weak_ptr<AppStateCallback> &callback)
33 {
34 CHECK_POINTER_RETURN_BOOL(callback.lock());
35 CHECK_POINTER_RETURN_BOOL(appMgrClient_);
36
37 callback_ = callback;
38 /* because the errcode type of AppMgr Client API will be changed to int,
39 * so must to covert the return result */
40 int result = static_cast<int>(appMgrClient_->ConnectAppMgrService());
41 if (result != ERR_OK) {
42 HILOG_ERROR("failed to ConnectAppMgrService");
43 return false;
44 }
45 this->IncStrongRef(this);
46 result = static_cast<int>(appMgrClient_->RegisterAppStateCallback(sptr<AppScheduler>(this)));
47 if (result != ERR_OK) {
48 HILOG_ERROR("failed to RegisterAppStateCallback");
49 return false;
50 }
51 HILOG_INFO("success to ConnectAppMgrService");
52 return true;
53 }
54
LoadAbility(const sptr<IRemoteObject> & token,const sptr<IRemoteObject> & preToken,const AppExecFwk::AbilityInfo & abilityInfo,const AppExecFwk::ApplicationInfo & applicationInfo)55 int AppScheduler::LoadAbility(const sptr<IRemoteObject> &token, const sptr<IRemoteObject> &preToken,
56 const AppExecFwk::AbilityInfo &abilityInfo, const AppExecFwk::ApplicationInfo &applicationInfo)
57 {
58 HILOG_DEBUG("Load ability.");
59 CHECK_POINTER_AND_RETURN(appMgrClient_, INNER_ERR);
60 /* because the errcode type of AppMgr Client API will be changed to int,
61 * so must to covert the return result */
62 int ret = static_cast<int>(appMgrClient_->LoadAbility(token, preToken, abilityInfo, applicationInfo));
63 if (ret != ERR_OK) {
64 HILOG_ERROR("AppScheduler fail to LoadAbility. ret %d", ret);
65 return INNER_ERR;
66 }
67 return ERR_OK;
68 }
69
TerminateAbility(const sptr<IRemoteObject> & token)70 int AppScheduler::TerminateAbility(const sptr<IRemoteObject> &token)
71 {
72 HILOG_DEBUG("Terminate ability.");
73 CHECK_POINTER_AND_RETURN(appMgrClient_, INNER_ERR);
74 /* because the errcode type of AppMgr Client API will be changed to int,
75 * so must to covert the return result */
76 int ret = static_cast<int>(appMgrClient_->TerminateAbility(token));
77 if (ret != ERR_OK) {
78 HILOG_ERROR("AppScheduler fail to TerminateAbility. ret %d", ret);
79 return INNER_ERR;
80 }
81 return ERR_OK;
82 }
83
MoveToForground(const sptr<IRemoteObject> & token)84 void AppScheduler::MoveToForground(const sptr<IRemoteObject> &token)
85 {
86 HILOG_DEBUG("Move to forground.");
87 CHECK_POINTER(appMgrClient_);
88 appMgrClient_->UpdateAbilityState(token, AppExecFwk::AbilityState::ABILITY_STATE_FOREGROUND);
89 }
90
MoveToBackground(const sptr<IRemoteObject> & token)91 void AppScheduler::MoveToBackground(const sptr<IRemoteObject> &token)
92 {
93 HILOG_DEBUG("Move to background.");
94 CHECK_POINTER(appMgrClient_);
95 appMgrClient_->UpdateAbilityState(token, AppExecFwk::AbilityState::ABILITY_STATE_BACKGROUND);
96 }
97
AbilityBehaviorAnalysis(const sptr<IRemoteObject> & token,const sptr<IRemoteObject> & preToken,const int32_t visibility,const int32_t perceptibility,const int32_t connectionState)98 void AppScheduler::AbilityBehaviorAnalysis(const sptr<IRemoteObject> &token, const sptr<IRemoteObject> &preToken,
99 const int32_t visibility, const int32_t perceptibility, const int32_t connectionState)
100 {
101 HILOG_DEBUG("Ability behavior analysis.");
102 CHECK_POINTER(appMgrClient_);
103 appMgrClient_->AbilityBehaviorAnalysis(token, preToken, visibility, perceptibility, connectionState);
104 }
105
KillProcessByAbilityToken(const sptr<IRemoteObject> & token)106 void AppScheduler::KillProcessByAbilityToken(const sptr<IRemoteObject> &token)
107 {
108 HILOG_DEBUG("Kill process by ability token.");
109 CHECK_POINTER(appMgrClient_);
110 appMgrClient_->KillProcessByAbilityToken(token);
111 }
112
ConvertToAppAbilityState(const int32_t state)113 AppAbilityState AppScheduler::ConvertToAppAbilityState(const int32_t state)
114 {
115 AppExecFwk::AbilityState abilityState = static_cast<AppExecFwk::AbilityState>(state);
116 switch (abilityState) {
117 case AppExecFwk::AbilityState::ABILITY_STATE_FOREGROUND: {
118 return AppAbilityState::ABILITY_STATE_FOREGROUND;
119 }
120 case AppExecFwk::AbilityState::ABILITY_STATE_BACKGROUND: {
121 return AppAbilityState::ABILITY_STATE_BACKGROUND;
122 }
123 default:
124 return AppAbilityState::ABILITY_STATE_UNDEFINED;
125 }
126 }
127
GetAbilityState() const128 AppAbilityState AppScheduler::GetAbilityState() const
129 {
130 return appAbilityState_;
131 }
132
OnAbilityRequestDone(const sptr<IRemoteObject> & token,const AppExecFwk::AbilityState state)133 void AppScheduler::OnAbilityRequestDone(const sptr<IRemoteObject> &token, const AppExecFwk::AbilityState state)
134 {
135 HILOG_INFO("On ability request done, state:%{public}d", static_cast<int32_t>(state));
136 auto callback = callback_.lock();
137 CHECK_POINTER(callback);
138 appAbilityState_ = ConvertToAppAbilityState(static_cast<int32_t>(state));
139 callback->OnAbilityRequestDone(token, static_cast<int32_t>(state));
140 }
141
KillApplication(const std::string & bundleName)142 int AppScheduler::KillApplication(const std::string &bundleName)
143 {
144 CHECK_POINTER_AND_RETURN(appMgrClient_, INNER_ERR);
145 int ret = (int)appMgrClient_->KillApplication(bundleName);
146 if (ret != ERR_OK) {
147 HILOG_ERROR("Fail to kill application.");
148 return INNER_ERR;
149 }
150
151 return ERR_OK;
152 }
153
AttachTimeOut(const sptr<IRemoteObject> & token)154 void AppScheduler::AttachTimeOut(const sptr<IRemoteObject> &token)
155 {
156 CHECK_POINTER(appMgrClient_);
157 appMgrClient_->AbilityAttachTimeOut(token);
158 }
159
CompelVerifyPermission(const std::string & permission,int pid,int uid,std::string & message)160 int AppScheduler::CompelVerifyPermission(const std::string &permission, int pid, int uid, std::string &message)
161 {
162 CHECK_POINTER_AND_RETURN(appMgrClient_, INNER_ERR);
163 auto ret = static_cast<int>(appMgrClient_->CompelVerifyPermission(permission, pid, uid, message));
164 if (ret != ERR_OK) {
165 HILOG_ERROR("Compel verify permission failed.");
166 return INNER_ERR;
167 }
168
169 return ERR_OK;
170 }
171
OnAppStateChanged(const AppExecFwk::AppProcessData & appData)172 void AppScheduler::OnAppStateChanged(const AppExecFwk::AppProcessData &appData)
173 {
174 auto callback = callback_.lock();
175 CHECK_POINTER(callback);
176 AppInfo info;
177 info.appName = appData.appName;
178 info.processName = appData.processName;
179 info.uid = appData.uid;
180 info.state = static_cast<AppState>(appData.appState);
181 callback->OnAppStateChanged(info);
182 }
183 } // namespace AAFwk
184 } // namespace OHOS
185