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