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 }
69 TAG_LOGW(AAFwkTag::APPMGR, "ApplicationStateObserverStub::OnRemoteRequest, default case, need check");
70 return IPCObjectStub::OnRemoteRequest(code, data, reply, option);
71 }
72
OnForegroundApplicationChanged(const AppStateData & appStateData)73 void ApplicationStateObserverStub::OnForegroundApplicationChanged(const AppStateData &appStateData)
74 {}
75
OnAbilityStateChanged(const AbilityStateData & abilityStateData)76 void ApplicationStateObserverStub::OnAbilityStateChanged(const AbilityStateData &abilityStateData)
77 {}
78
OnExtensionStateChanged(const AbilityStateData & abilityStateData)79 void ApplicationStateObserverStub::OnExtensionStateChanged(const AbilityStateData &abilityStateData)
80 {}
81
OnProcessCreated(const ProcessData & processData)82 void ApplicationStateObserverStub::OnProcessCreated(const ProcessData &processData)
83 {}
84
OnProcessStateChanged(const ProcessData & processData)85 void ApplicationStateObserverStub::OnProcessStateChanged(const ProcessData &processData)
86 {}
87
OnWindowShow(const ProcessData & processData)88 void ApplicationStateObserverStub::OnWindowShow(const ProcessData &processData)
89 {
90 TAG_LOGD(AAFwkTag::APPMGR, "ApplicationStateObserverStub::OnWindowShow called, bundleName:%{public}s,"
91 "pid:%{public}d, uid:%{public}d.", processData.bundleName.c_str(), processData.pid, processData.uid);
92 }
93
OnWindowHidden(const ProcessData & processData)94 void ApplicationStateObserverStub::OnWindowHidden(const ProcessData &processData)
95 {
96 TAG_LOGD(AAFwkTag::APPMGR, "ApplicationStateObserverStub::OnWindowHidden called, bundleName:%{public}s,"
97 "pid:%{public}d, uid:%{public}d.", processData.bundleName.c_str(), processData.pid, processData.uid);
98 }
99
OnProcessDied(const ProcessData & processData)100 void ApplicationStateObserverStub::OnProcessDied(const ProcessData &processData)
101 {}
102
OnApplicationStateChanged(const AppStateData & appStateData)103 void ApplicationStateObserverStub::OnApplicationStateChanged(const AppStateData &appStateData)
104 {}
105
OnAppStateChanged(const AppStateData & appStateData)106 void ApplicationStateObserverStub::OnAppStateChanged(const AppStateData &appStateData)
107 {}
108
OnProcessReused(const ProcessData & processData)109 void ApplicationStateObserverStub::OnProcessReused(const ProcessData &processData)
110 {}
111
OnAppStarted(const AppStateData & appStateData)112 void ApplicationStateObserverStub::OnAppStarted(const AppStateData &appStateData)
113 {}
114
OnAppStopped(const AppStateData & appStateData)115 void ApplicationStateObserverStub::OnAppStopped(const AppStateData &appStateData)
116 {}
117
OnPageShow(const PageStateData & pageStateData)118 void ApplicationStateObserverStub::OnPageShow(const PageStateData &pageStateData)
119 {}
120
OnPageHide(const PageStateData & pageStateData)121 void ApplicationStateObserverStub::OnPageHide(const PageStateData &pageStateData)
122 {}
123
OnAppCacheStateChanged(const AppStateData & appStateData)124 void ApplicationStateObserverStub::OnAppCacheStateChanged(const AppStateData &appStateData)
125 {}
126
HandleOnForegroundApplicationChanged(MessageParcel & data,MessageParcel & reply)127 int32_t ApplicationStateObserverStub::HandleOnForegroundApplicationChanged(MessageParcel &data, MessageParcel &reply)
128 {
129 std::unique_ptr<AppStateData> processData(data.ReadParcelable<AppStateData>());
130 if (!processData) {
131 TAG_LOGE(AAFwkTag::APPMGR, "ReadParcelable<AppStateData> failed");
132 return ERR_APPEXECFWK_PARCEL_ERROR;
133 }
134
135 OnForegroundApplicationChanged(*processData);
136 return NO_ERROR;
137 }
138
HandleOnAbilityStateChanged(MessageParcel & data,MessageParcel & reply)139 int32_t ApplicationStateObserverStub::HandleOnAbilityStateChanged(MessageParcel &data, MessageParcel &reply)
140 {
141 AbilityStateData* abilityStateData = nullptr;
142 {
143 std::unique_lock<std::mutex> lock(callbackMutex_);
144 abilityStateData = data.ReadParcelable<AbilityStateData>();
145 if (!abilityStateData) {
146 TAG_LOGE(AAFwkTag::APPMGR, "ReadParcelable<AbilityStateData> failed");
147 return ERR_APPEXECFWK_PARCEL_ERROR;
148 }
149 }
150 OnAbilityStateChanged(*abilityStateData);
151 {
152 // Protect Multi Thread Deconstruct IRemoteObject
153 std::unique_lock<std::mutex> lock(callbackMutex_);
154 delete abilityStateData;
155 }
156 return NO_ERROR;
157 }
158
HandleOnExtensionStateChanged(MessageParcel & data,MessageParcel & reply)159 int32_t ApplicationStateObserverStub::HandleOnExtensionStateChanged(MessageParcel &data, MessageParcel &reply)
160 {
161 AbilityStateData* abilityStateData = nullptr;
162 {
163 std::unique_lock<std::mutex> lock(callbackMutex_);
164 abilityStateData = data.ReadParcelable<AbilityStateData>();
165 if (!abilityStateData) {
166 TAG_LOGE(AAFwkTag::APPMGR, "ReadParcelable<AbilityStateData> failed");
167 return ERR_APPEXECFWK_PARCEL_ERROR;
168 }
169 }
170 OnExtensionStateChanged(*abilityStateData);
171 {
172 // Protect Multi Thread Deconstruct IRemoteObject
173 std::unique_lock<std::mutex> lock(callbackMutex_);
174 delete abilityStateData;
175 }
176 return NO_ERROR;
177 }
178
HandleOnProcessCreated(MessageParcel & data,MessageParcel & reply)179 int32_t ApplicationStateObserverStub::HandleOnProcessCreated(MessageParcel &data, MessageParcel &reply)
180 {
181 std::unique_ptr<ProcessData> processData(data.ReadParcelable<ProcessData>());
182 if (!processData) {
183 TAG_LOGE(AAFwkTag::APPMGR, "ReadParcelable<ProcessData> failed");
184 return ERR_APPEXECFWK_PARCEL_ERROR;
185 }
186
187 OnProcessCreated(*processData);
188 return NO_ERROR;
189 }
190
HandleOnProcessStateChanged(MessageParcel & data,MessageParcel & reply)191 int32_t ApplicationStateObserverStub::HandleOnProcessStateChanged(MessageParcel &data, MessageParcel &reply)
192 {
193 std::unique_ptr<ProcessData> processData(data.ReadParcelable<ProcessData>());
194 if (!processData) {
195 TAG_LOGE(AAFwkTag::APPMGR, "ReadParcelable<ProcessData> failed");
196 return ERR_APPEXECFWK_PARCEL_ERROR;
197 }
198
199 OnProcessStateChanged(*processData);
200 return NO_ERROR;
201 }
202
HandleOnWindowShow(MessageParcel & data,MessageParcel & reply)203 int32_t ApplicationStateObserverStub::HandleOnWindowShow(MessageParcel &data, MessageParcel &reply)
204 {
205 std::unique_ptr<ProcessData> processData(data.ReadParcelable<ProcessData>());
206 if (!processData) {
207 TAG_LOGE(AAFwkTag::APPMGR, "ReadParcelable<ProcessData> failed");
208 return ERR_APPEXECFWK_PARCEL_ERROR;
209 }
210
211 OnWindowShow(*processData);
212 return NO_ERROR;
213 }
214
HandleOnWindowHidden(MessageParcel & data,MessageParcel & reply)215 int32_t ApplicationStateObserverStub::HandleOnWindowHidden(MessageParcel &data, MessageParcel &reply)
216 {
217 std::unique_ptr<ProcessData> processData(data.ReadParcelable<ProcessData>());
218 if (!processData) {
219 TAG_LOGE(AAFwkTag::APPMGR, "ReadParcelable<ProcessData> failed");
220 return ERR_APPEXECFWK_PARCEL_ERROR;
221 }
222
223 OnWindowHidden(*processData);
224 return NO_ERROR;
225 }
226
HandleOnProcessDied(MessageParcel & data,MessageParcel & reply)227 int32_t ApplicationStateObserverStub::HandleOnProcessDied(MessageParcel &data, MessageParcel &reply)
228 {
229 std::unique_ptr<ProcessData> processData(data.ReadParcelable<ProcessData>());
230 if (!processData) {
231 TAG_LOGE(AAFwkTag::APPMGR, "ReadParcelable<ProcessData> failed");
232 return ERR_APPEXECFWK_PARCEL_ERROR;
233 }
234
235 OnProcessDied(*processData);
236 return NO_ERROR;
237 }
238
HandleOnApplicationStateChanged(MessageParcel & data,MessageParcel & reply)239 int32_t ApplicationStateObserverStub::HandleOnApplicationStateChanged(MessageParcel &data, MessageParcel &reply)
240 {
241 std::unique_ptr<AppStateData> processData(data.ReadParcelable<AppStateData>());
242 if (!processData) {
243 TAG_LOGE(AAFwkTag::APPMGR, "ReadParcelable<AppStateData> failed");
244 return ERR_APPEXECFWK_PARCEL_ERROR;
245 }
246
247 OnApplicationStateChanged(*processData);
248 return NO_ERROR;
249 }
250
HandleOnAppStateChanged(MessageParcel & data,MessageParcel & reply)251 int32_t ApplicationStateObserverStub::HandleOnAppStateChanged(MessageParcel &data, MessageParcel &reply)
252 {
253 std::unique_ptr<AppStateData> processData(data.ReadParcelable<AppStateData>());
254 if (!processData) {
255 TAG_LOGE(AAFwkTag::APPMGR, "ReadParcelable<AppStateData> failed");
256 return ERR_APPEXECFWK_PARCEL_ERROR;
257 }
258
259 OnAppStateChanged(*processData);
260 return NO_ERROR;
261 }
262
OnRemoteDied(const wptr<IRemoteObject> & remote)263 void ApplicationStateObserverRecipient::OnRemoteDied(const wptr<IRemoteObject> &__attribute__((unused)) remote)
264 {
265 TAG_LOGD(AAFwkTag::APPMGR, "called");
266 if (handler_) {
267 handler_(remote);
268 }
269 }
270
HandleOnProcessReused(MessageParcel & data,MessageParcel & reply)271 int32_t ApplicationStateObserverStub::HandleOnProcessReused(MessageParcel &data, MessageParcel &reply)
272 {
273 std::unique_ptr<ProcessData> processData(data.ReadParcelable<ProcessData>());
274 if (!processData) {
275 TAG_LOGE(AAFwkTag::APPMGR, "ReadParcelable<ProcessData> failed");
276 return ERR_APPEXECFWK_PARCEL_ERROR;
277 }
278
279 OnProcessReused(*processData);
280 return NO_ERROR;
281 }
282
HandleOnAppStarted(MessageParcel & data,MessageParcel & reply)283 int32_t ApplicationStateObserverStub::HandleOnAppStarted(MessageParcel &data, MessageParcel &reply)
284 {
285 std::unique_ptr<AppStateData> processData(data.ReadParcelable<AppStateData>());
286 if (!processData) {
287 TAG_LOGE(AAFwkTag::APPMGR, "ReadParcelable<AppStateData> failed");
288 return ERR_APPEXECFWK_PARCEL_ERROR;
289 }
290
291 OnAppStarted(*processData);
292 return NO_ERROR;
293 }
294
HandleOnAppStopped(MessageParcel & data,MessageParcel & reply)295 int32_t ApplicationStateObserverStub::HandleOnAppStopped(MessageParcel &data, MessageParcel &reply)
296 {
297 std::unique_ptr<AppStateData> processData(data.ReadParcelable<AppStateData>());
298 if (!processData) {
299 TAG_LOGE(AAFwkTag::APPMGR, "ReadParcelable<AppStateData> failed");
300 return ERR_APPEXECFWK_PARCEL_ERROR;
301 }
302
303 OnAppStopped(*processData);
304 return NO_ERROR;
305 }
306
HandleOnPageShow(MessageParcel & data,MessageParcel & reply)307 int32_t ApplicationStateObserverStub::HandleOnPageShow(MessageParcel &data, MessageParcel &reply)
308 {
309 std::unique_ptr<PageStateData> pageStateData(data.ReadParcelable<PageStateData>());
310 if (!pageStateData) {
311 TAG_LOGE(AAFwkTag::APPMGR, "ReadParcelable<pageStateData> failed");
312 return ERR_APPEXECFWK_PARCEL_ERROR;
313 }
314
315 OnPageShow(*pageStateData);
316 return NO_ERROR;
317 }
318
HandleOnPageHide(MessageParcel & data,MessageParcel & reply)319 int32_t ApplicationStateObserverStub::HandleOnPageHide(MessageParcel &data, MessageParcel &reply)
320 {
321 std::unique_ptr<PageStateData> pageStateData(data.ReadParcelable<PageStateData>());
322 if (!pageStateData) {
323 TAG_LOGE(AAFwkTag::APPMGR, "ReadParcelable<pageStateData> failed");
324 return ERR_APPEXECFWK_PARCEL_ERROR;
325 }
326
327 OnPageHide(*pageStateData);
328 return NO_ERROR;
329 }
330
HandleOnAppCacheStateChanged(MessageParcel & data,MessageParcel & reply)331 int32_t ApplicationStateObserverStub::HandleOnAppCacheStateChanged(MessageParcel &data, MessageParcel &reply)
332 {
333 std::unique_ptr<AppStateData> processData(data.ReadParcelable<AppStateData>());
334 if (!processData) {
335 TAG_LOGE(AAFwkTag::APPMGR, "ReadParcelable<AppStateData> failed");
336 return ERR_APPEXECFWK_PARCEL_ERROR;
337 }
338
339 OnAppCacheStateChanged(*processData);
340 return NO_ERROR;
341 }
342
ApplicationStateObserverRecipient(RemoteDiedHandler handler)343 ApplicationStateObserverRecipient::ApplicationStateObserverRecipient(RemoteDiedHandler handler) : handler_(handler)
344 {}
345
~ApplicationStateObserverRecipient()346 ApplicationStateObserverRecipient::~ApplicationStateObserverRecipient()
347 {}
348 } // namespace AppExecFwk
349 } // namespace OHOS
350