1 /*
2 * Copyright (c) 2021-2024 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 "application_state_observer_stub.h"
17 #include "appexecfwk_errors.h"
18 #include "hilog_tag_wrapper.h"
19 #include "ipc_types.h"
20 #include "iremote_object.h"
21
22 namespace OHOS {
23 namespace AppExecFwk {
24 std::mutex ApplicationStateObserverStub::callbackMutex_;
OnRemoteRequest(uint32_t code,MessageParcel & data,MessageParcel & reply,MessageOption & option)25 int ApplicationStateObserverStub::OnRemoteRequest(
26 uint32_t code, MessageParcel &data, MessageParcel &reply, MessageOption &option)
27 {
28 std::u16string descriptor = ApplicationStateObserverStub::GetDescriptor();
29 std::u16string remoteDescriptor = data.ReadInterfaceToken();
30 if (descriptor != remoteDescriptor) {
31 TAG_LOGE(AAFwkTag::APPMGR, "local descriptor is not equal to remote.");
32 return ERR_INVALID_STATE;
33 }
34
35 switch (static_cast<Message>(code)) {
36 case Message::TRANSACT_ON_FOREGROUND_APPLICATION_CHANGED:
37 return HandleOnForegroundApplicationChanged(data, reply);
38 case Message::TRANSACT_ON_ABILITY_STATE_CHANGED:
39 return HandleOnAbilityStateChanged(data, reply);
40 case Message::TRANSACT_ON_EXTENSION_STATE_CHANGED:
41 return HandleOnExtensionStateChanged(data, reply);
42 case Message::TRANSACT_ON_PROCESS_CREATED:
43 return HandleOnProcessCreated(data, reply);
44 case Message::TRANSACT_ON_PROCESS_STATE_CHANGED:
45 return HandleOnProcessStateChanged(data, reply);
46 case Message::TRANSACT_ON_PROCESS_DIED:
47 return HandleOnProcessDied(data, reply);
48 case Message::TRANSACT_ON_APPLICATION_STATE_CHANGED:
49 return HandleOnApplicationStateChanged(data, reply);
50 case Message::TRANSACT_ON_APP_STATE_CHANGED:
51 return HandleOnAppStateChanged(data, reply);
52 case Message::TRANSACT_ON_PROCESS_REUSED:
53 return HandleOnProcessReused(data, reply);
54 case Message::TRANSACT_ON_APP_STARTED:
55 return HandleOnAppStarted(data, reply);
56 case Message::TRANSACT_ON_APP_STOPPED:
57 return HandleOnAppStopped(data, reply);
58 case Message::TRANSACT_ON_PAGE_SHOW:
59 return HandleOnPageShow(data, reply);
60 case Message::TRANSACT_ON_PAGE_HIDE:
61 return HandleOnPageHide(data, reply);
62 case Message::TRANSACT_ON_APP_CACHE_STATE_CHANGED:
63 return HandleOnAppCacheStateChanged(data, reply);
64 case Message::TRANSACT_ON_WINDOW_SHOW:
65 return HandleOnWindowShow(data, reply);
66 case Message::TRANSACT_ON_WINDOW_HIDDEN:
67 return HandleOnWindowHidden(data, reply);
68 case Message::TRANSACT_ON_PROCESS_BINDINGRELATION_CHANGED:
69 return HandleOnProcessBindingRelationChanged(data, reply);
70 case Message::TRANSACT_ON_KEEP_ALIVE_STATE_CHANGED:
71 return HandleOnKeepAliveStateChanged(data, reply);
72 case Message::TRANSACT_ON_PRELOAD_PROCESS_STATE_CHANGED:
73 return HandleOnProcessPreForegroundChanged(data, reply);
74 }
75 TAG_LOGW(AAFwkTag::APPMGR, "ApplicationStateObserverStub::OnRemoteRequest, default case, need check");
76 return IPCObjectStub::OnRemoteRequest(code, data, reply, option);
77 }
78
OnForegroundApplicationChanged(const AppStateData & appStateData)79 void ApplicationStateObserverStub::OnForegroundApplicationChanged(const AppStateData &appStateData)
80 {}
81
OnAbilityStateChanged(const AbilityStateData & abilityStateData)82 void ApplicationStateObserverStub::OnAbilityStateChanged(const AbilityStateData &abilityStateData)
83 {}
84
OnExtensionStateChanged(const AbilityStateData & abilityStateData)85 void ApplicationStateObserverStub::OnExtensionStateChanged(const AbilityStateData &abilityStateData)
86 {}
87
OnProcessCreated(const ProcessData & processData)88 void ApplicationStateObserverStub::OnProcessCreated(const ProcessData &processData)
89 {}
90
OnProcessStateChanged(const ProcessData & processData)91 void ApplicationStateObserverStub::OnProcessStateChanged(const ProcessData &processData)
92 {}
93
OnWindowShow(const ProcessData & processData)94 void ApplicationStateObserverStub::OnWindowShow(const ProcessData &processData)
95 {
96 TAG_LOGD(AAFwkTag::APPMGR, "ApplicationStateObserverStub::OnWindowShow called, bundleName:%{public}s,"
97 "pid:%{public}d, uid:%{public}d.", processData.bundleName.c_str(), processData.pid, processData.uid);
98 }
99
OnWindowHidden(const ProcessData & processData)100 void ApplicationStateObserverStub::OnWindowHidden(const ProcessData &processData)
101 {
102 TAG_LOGD(AAFwkTag::APPMGR, "ApplicationStateObserverStub::OnWindowHidden called, bundleName:%{public}s,"
103 "pid:%{public}d, uid:%{public}d.", processData.bundleName.c_str(), processData.pid, processData.uid);
104 }
105
OnProcessDied(const ProcessData & processData)106 void ApplicationStateObserverStub::OnProcessDied(const ProcessData &processData)
107 {}
108
OnApplicationStateChanged(const AppStateData & appStateData)109 void ApplicationStateObserverStub::OnApplicationStateChanged(const AppStateData &appStateData)
110 {}
111
OnAppStateChanged(const AppStateData & appStateData)112 void ApplicationStateObserverStub::OnAppStateChanged(const AppStateData &appStateData)
113 {}
114
OnProcessReused(const ProcessData & processData)115 void ApplicationStateObserverStub::OnProcessReused(const ProcessData &processData)
116 {}
117
OnAppStarted(const AppStateData & appStateData)118 void ApplicationStateObserverStub::OnAppStarted(const AppStateData &appStateData)
119 {}
120
OnAppStopped(const AppStateData & appStateData)121 void ApplicationStateObserverStub::OnAppStopped(const AppStateData &appStateData)
122 {}
123
OnPageShow(const PageStateData & pageStateData)124 void ApplicationStateObserverStub::OnPageShow(const PageStateData &pageStateData)
125 {}
126
OnPageHide(const PageStateData & pageStateData)127 void ApplicationStateObserverStub::OnPageHide(const PageStateData &pageStateData)
128 {}
129
OnAppCacheStateChanged(const AppStateData & appStateData)130 void ApplicationStateObserverStub::OnAppCacheStateChanged(const AppStateData &appStateData)
131 {}
132
OnProcessBindingRelationChanged(const ProcessBindData & processBindData)133 void ApplicationStateObserverStub::OnProcessBindingRelationChanged(const ProcessBindData &processBindData)
134 {}
135
OnKeepAliveStateChanged(const ProcessData & processData)136 void ApplicationStateObserverStub::OnKeepAliveStateChanged(const ProcessData &processData)
137 {}
138
OnProcessPreForegroundChanged(const PreloadProcessData & preloadProcessData)139 void ApplicationStateObserverStub::OnProcessPreForegroundChanged(const PreloadProcessData &preloadProcessData)
140 {}
141
HandleOnForegroundApplicationChanged(MessageParcel & data,MessageParcel & reply)142 int32_t ApplicationStateObserverStub::HandleOnForegroundApplicationChanged(MessageParcel &data, MessageParcel &reply)
143 {
144 std::unique_ptr<AppStateData> processData(data.ReadParcelable<AppStateData>());
145 if (!processData) {
146 TAG_LOGE(AAFwkTag::APPMGR, "ReadParcelable<AppStateData> failed");
147 return ERR_APPEXECFWK_PARCEL_ERROR;
148 }
149
150 OnForegroundApplicationChanged(*processData);
151 return NO_ERROR;
152 }
153
HandleOnAbilityStateChanged(MessageParcel & data,MessageParcel & reply)154 int32_t ApplicationStateObserverStub::HandleOnAbilityStateChanged(MessageParcel &data, MessageParcel &reply)
155 {
156 AbilityStateData* abilityStateData = nullptr;
157 {
158 std::unique_lock<std::mutex> lock(callbackMutex_);
159 abilityStateData = data.ReadParcelable<AbilityStateData>();
160 if (!abilityStateData) {
161 TAG_LOGE(AAFwkTag::APPMGR, "ReadParcelable<AbilityStateData> failed");
162 return ERR_APPEXECFWK_PARCEL_ERROR;
163 }
164 }
165 OnAbilityStateChanged(*abilityStateData);
166 {
167 // Protect Multi Thread Deconstruct IRemoteObject
168 std::unique_lock<std::mutex> lock(callbackMutex_);
169 delete abilityStateData;
170 }
171 return NO_ERROR;
172 }
173
HandleOnExtensionStateChanged(MessageParcel & data,MessageParcel & reply)174 int32_t ApplicationStateObserverStub::HandleOnExtensionStateChanged(MessageParcel &data, MessageParcel &reply)
175 {
176 AbilityStateData* abilityStateData = nullptr;
177 {
178 std::unique_lock<std::mutex> lock(callbackMutex_);
179 abilityStateData = data.ReadParcelable<AbilityStateData>();
180 if (!abilityStateData) {
181 TAG_LOGE(AAFwkTag::APPMGR, "ReadParcelable<AbilityStateData> failed");
182 return ERR_APPEXECFWK_PARCEL_ERROR;
183 }
184 }
185 OnExtensionStateChanged(*abilityStateData);
186 {
187 // Protect Multi Thread Deconstruct IRemoteObject
188 std::unique_lock<std::mutex> lock(callbackMutex_);
189 delete abilityStateData;
190 }
191 return NO_ERROR;
192 }
193
HandleOnProcessCreated(MessageParcel & data,MessageParcel & reply)194 int32_t ApplicationStateObserverStub::HandleOnProcessCreated(MessageParcel &data, MessageParcel &reply)
195 {
196 std::unique_ptr<ProcessData> processData(data.ReadParcelable<ProcessData>());
197 if (!processData) {
198 TAG_LOGE(AAFwkTag::APPMGR, "ReadParcelable<ProcessData> failed");
199 return ERR_APPEXECFWK_PARCEL_ERROR;
200 }
201
202 OnProcessCreated(*processData);
203 return NO_ERROR;
204 }
205
HandleOnProcessStateChanged(MessageParcel & data,MessageParcel & reply)206 int32_t ApplicationStateObserverStub::HandleOnProcessStateChanged(MessageParcel &data, MessageParcel &reply)
207 {
208 std::unique_ptr<ProcessData> processData(data.ReadParcelable<ProcessData>());
209 if (!processData) {
210 TAG_LOGE(AAFwkTag::APPMGR, "ReadParcelable<ProcessData> failed");
211 return ERR_APPEXECFWK_PARCEL_ERROR;
212 }
213
214 OnProcessStateChanged(*processData);
215 return NO_ERROR;
216 }
217
HandleOnWindowShow(MessageParcel & data,MessageParcel & reply)218 int32_t ApplicationStateObserverStub::HandleOnWindowShow(MessageParcel &data, MessageParcel &reply)
219 {
220 std::unique_ptr<ProcessData> processData(data.ReadParcelable<ProcessData>());
221 if (!processData) {
222 TAG_LOGE(AAFwkTag::APPMGR, "ReadParcelable<ProcessData> failed");
223 return ERR_APPEXECFWK_PARCEL_ERROR;
224 }
225
226 OnWindowShow(*processData);
227 return NO_ERROR;
228 }
229
HandleOnWindowHidden(MessageParcel & data,MessageParcel & reply)230 int32_t ApplicationStateObserverStub::HandleOnWindowHidden(MessageParcel &data, MessageParcel &reply)
231 {
232 std::unique_ptr<ProcessData> processData(data.ReadParcelable<ProcessData>());
233 if (!processData) {
234 TAG_LOGE(AAFwkTag::APPMGR, "ReadParcelable<ProcessData> failed");
235 return ERR_APPEXECFWK_PARCEL_ERROR;
236 }
237
238 OnWindowHidden(*processData);
239 return NO_ERROR;
240 }
241
HandleOnProcessDied(MessageParcel & data,MessageParcel & reply)242 int32_t ApplicationStateObserverStub::HandleOnProcessDied(MessageParcel &data, MessageParcel &reply)
243 {
244 std::unique_ptr<ProcessData> processData(data.ReadParcelable<ProcessData>());
245 if (!processData) {
246 TAG_LOGE(AAFwkTag::APPMGR, "ReadParcelable<ProcessData> failed");
247 return ERR_APPEXECFWK_PARCEL_ERROR;
248 }
249
250 OnProcessDied(*processData);
251 return NO_ERROR;
252 }
253
HandleOnApplicationStateChanged(MessageParcel & data,MessageParcel & reply)254 int32_t ApplicationStateObserverStub::HandleOnApplicationStateChanged(MessageParcel &data, MessageParcel &reply)
255 {
256 std::unique_ptr<AppStateData> processData(data.ReadParcelable<AppStateData>());
257 if (!processData) {
258 TAG_LOGE(AAFwkTag::APPMGR, "ReadParcelable<AppStateData> failed");
259 return ERR_APPEXECFWK_PARCEL_ERROR;
260 }
261
262 OnApplicationStateChanged(*processData);
263 return NO_ERROR;
264 }
265
HandleOnAppStateChanged(MessageParcel & data,MessageParcel & reply)266 int32_t ApplicationStateObserverStub::HandleOnAppStateChanged(MessageParcel &data, MessageParcel &reply)
267 {
268 std::unique_ptr<AppStateData> processData(data.ReadParcelable<AppStateData>());
269 if (!processData) {
270 TAG_LOGE(AAFwkTag::APPMGR, "ReadParcelable<AppStateData> failed");
271 return ERR_APPEXECFWK_PARCEL_ERROR;
272 }
273
274 OnAppStateChanged(*processData);
275 return NO_ERROR;
276 }
277
OnRemoteDied(const wptr<IRemoteObject> & remote)278 void ApplicationStateObserverRecipient::OnRemoteDied(const wptr<IRemoteObject> &__attribute__((unused)) remote)
279 {
280 TAG_LOGD(AAFwkTag::APPMGR, "called");
281 if (handler_) {
282 handler_(remote);
283 }
284 }
285
HandleOnProcessReused(MessageParcel & data,MessageParcel & reply)286 int32_t ApplicationStateObserverStub::HandleOnProcessReused(MessageParcel &data, MessageParcel &reply)
287 {
288 std::unique_ptr<ProcessData> processData(data.ReadParcelable<ProcessData>());
289 if (!processData) {
290 TAG_LOGE(AAFwkTag::APPMGR, "ReadParcelable<ProcessData> failed");
291 return ERR_APPEXECFWK_PARCEL_ERROR;
292 }
293
294 OnProcessReused(*processData);
295 return NO_ERROR;
296 }
297
HandleOnAppStarted(MessageParcel & data,MessageParcel & reply)298 int32_t ApplicationStateObserverStub::HandleOnAppStarted(MessageParcel &data, MessageParcel &reply)
299 {
300 std::unique_ptr<AppStateData> processData(data.ReadParcelable<AppStateData>());
301 if (!processData) {
302 TAG_LOGE(AAFwkTag::APPMGR, "ReadParcelable<AppStateData> failed");
303 return ERR_APPEXECFWK_PARCEL_ERROR;
304 }
305
306 OnAppStarted(*processData);
307 return NO_ERROR;
308 }
309
HandleOnAppStopped(MessageParcel & data,MessageParcel & reply)310 int32_t ApplicationStateObserverStub::HandleOnAppStopped(MessageParcel &data, MessageParcel &reply)
311 {
312 std::unique_ptr<AppStateData> processData(data.ReadParcelable<AppStateData>());
313 if (!processData) {
314 TAG_LOGE(AAFwkTag::APPMGR, "ReadParcelable<AppStateData> failed");
315 return ERR_APPEXECFWK_PARCEL_ERROR;
316 }
317
318 OnAppStopped(*processData);
319 return NO_ERROR;
320 }
321
HandleOnPageShow(MessageParcel & data,MessageParcel & reply)322 int32_t ApplicationStateObserverStub::HandleOnPageShow(MessageParcel &data, MessageParcel &reply)
323 {
324 std::unique_ptr<PageStateData> pageStateData(data.ReadParcelable<PageStateData>());
325 if (!pageStateData) {
326 TAG_LOGE(AAFwkTag::APPMGR, "ReadParcelable<pageStateData> failed");
327 return ERR_APPEXECFWK_PARCEL_ERROR;
328 }
329
330 OnPageShow(*pageStateData);
331 return NO_ERROR;
332 }
333
HandleOnPageHide(MessageParcel & data,MessageParcel & reply)334 int32_t ApplicationStateObserverStub::HandleOnPageHide(MessageParcel &data, MessageParcel &reply)
335 {
336 std::unique_ptr<PageStateData> pageStateData(data.ReadParcelable<PageStateData>());
337 if (!pageStateData) {
338 TAG_LOGE(AAFwkTag::APPMGR, "ReadParcelable<pageStateData> failed");
339 return ERR_APPEXECFWK_PARCEL_ERROR;
340 }
341
342 OnPageHide(*pageStateData);
343 return NO_ERROR;
344 }
345
HandleOnAppCacheStateChanged(MessageParcel & data,MessageParcel & reply)346 int32_t ApplicationStateObserverStub::HandleOnAppCacheStateChanged(MessageParcel &data, MessageParcel &reply)
347 {
348 std::unique_ptr<AppStateData> processData(data.ReadParcelable<AppStateData>());
349 if (!processData) {
350 TAG_LOGE(AAFwkTag::APPMGR, "ReadParcelable<AppStateData> failed");
351 return ERR_APPEXECFWK_PARCEL_ERROR;
352 }
353
354 OnAppCacheStateChanged(*processData);
355 return NO_ERROR;
356 }
357
HandleOnProcessBindingRelationChanged(MessageParcel & data,MessageParcel & reply)358 int32_t ApplicationStateObserverStub::HandleOnProcessBindingRelationChanged(MessageParcel &data, MessageParcel &reply)
359 {
360 std::unique_ptr<ProcessBindData> processBindData(data.ReadParcelable<ProcessBindData>());
361 if (!processBindData) {
362 TAG_LOGE(AAFwkTag::APPMGR, "ReadParcelable<ProcessBindData> failed");
363 return ERR_APPEXECFWK_PARCEL_ERROR;
364 }
365
366 OnProcessBindingRelationChanged(*processBindData);
367 return NO_ERROR;
368 }
369
HandleOnKeepAliveStateChanged(MessageParcel & data,MessageParcel & reply)370 int32_t ApplicationStateObserverStub::HandleOnKeepAliveStateChanged(MessageParcel &data, MessageParcel &reply)
371 {
372 std::unique_ptr<ProcessData> processData(data.ReadParcelable<ProcessData>());
373 if (!processData) {
374 TAG_LOGE(AAFwkTag::APPMGR, "Handle OnKeepAliveStateChanged read ProcessData failed");
375 return ERR_APPEXECFWK_PARCEL_ERROR;
376 }
377
378 OnKeepAliveStateChanged(*processData);
379 return NO_ERROR;
380 }
381
HandleOnProcessPreForegroundChanged(MessageParcel & data,MessageParcel & reply)382 int32_t ApplicationStateObserverStub::HandleOnProcessPreForegroundChanged(MessageParcel &data, MessageParcel &reply)
383 {
384 std::unique_ptr<PreloadProcessData> preloadProcessData(data.ReadParcelable<PreloadProcessData>());
385 if (!preloadProcessData) {
386 TAG_LOGE(AAFwkTag::APPMGR, "ReadParcelable<PreloadProcessData> failed");
387 return ERR_APPEXECFWK_PARCEL_ERROR;
388 }
389
390 OnProcessPreForegroundChanged(*preloadProcessData);
391 return NO_ERROR;
392 }
393
ApplicationStateObserverRecipient(RemoteDiedHandler handler)394 ApplicationStateObserverRecipient::ApplicationStateObserverRecipient(RemoteDiedHandler handler) : handler_(handler)
395 {}
396
~ApplicationStateObserverRecipient()397 ApplicationStateObserverRecipient::~ApplicationStateObserverRecipient()
398 {}
399 } // namespace AppExecFwk
400 } // namespace OHOS
401