• 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     }
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