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