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