1 /*
2  * Copyright (c) 2022-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 #ifndef OHOS_ABILITY_RUNTIME_FREE_INSTALL_MANAGER_H
17 #define OHOS_ABILITY_RUNTIME_FREE_INSTALL_MANAGER_H
18 
19 #include <future>
20 #include "cpp/mutex.h"
21 
22 #include <iremote_object.h>
23 #include <iremote_stub.h>
24 #include <memory>
25 
26 #include "ability_info.h"
27 #include "free_install_observer_manager.h"
28 #include "want.h"
29 
30 namespace OHOS {
31 namespace AAFwk {
32 class AbilityManagerService;
33 
34 struct FreeInstallInfo {
35     Want want;
36     int32_t userId = -1;
37     int32_t requestCode = -1;
38     std::shared_ptr<std::promise<int32_t>> promise;
39     bool isInstalled = false;
40     std::string identity;
41     sptr<IRemoteObject> callerToken = nullptr;
42     sptr<IRemoteObject> dmsCallback = nullptr;
43     bool isPreStartMissionCalled = false;
44     bool isStartUIAbilityBySCBCalled = false;
45     uint32_t specifyTokenId = 0;
46     bool isFreeInstallFinished = false;
47     int resultCode = 0;
48     bool isOpenAtomicServiceShortUrl = false;
49     std::shared_ptr<Want> originalWant = nullptr;
50 };
51 
52 /**
53  * @class FreeInstallManager
54  * FreeInstallManager.
55  */
56 class FreeInstallManager : public std::enable_shared_from_this<FreeInstallManager> {
57 public:
58     explicit FreeInstallManager(const std::weak_ptr<AbilityManagerService> &server);
59     virtual ~FreeInstallManager() = default;
60 
61     /**
62      * OnInstallFinished, StartFreeInstall is complete.
63      *
64      * @param resultCode, ERR_OK on success, others on failure.
65      * @param want, installed ability.
66      * @param userId, user`s id.
67      */
68     void OnInstallFinished(int32_t recordId, int resultCode, const Want &want, int32_t userId, bool isAsync = false);
69 
70     /**
71      * OnRemoteInstallFinished, DMS has finished.
72      *
73      * @param resultCode, ERR_OK on success, others on failure.
74      * @param want, installed ability.
75      * @param userId, user`s id.
76      */
77     void OnRemoteInstallFinished(int32_t recordId, int resultCode, const Want &want, int32_t userId);
78 
79     /**
80      * Start to free install.
81      *
82      * @param want, the want of the ability to free install.
83      * @param userId, designation User ID.
84      * @param requestCode, ability request code.
85      * @param callerToken, caller ability token.
86      * @param isAsync, the request is async.
87      * @param isOpenAtomicServiceShortUrl, the flag of open atomic service short url.
88      * @return Returns ERR_OK on success, others on failure.
89      */
90     int StartFreeInstall(const Want &want, int32_t userId, int requestCode, const sptr<IRemoteObject> &callerToken,
91         bool isAsync = false, uint32_t specifyTokenId = 0, bool isOpenAtomicServiceShortUrl = false,
92         std::shared_ptr<Want> originalWant = nullptr);
93 
94     /**
95      * Start to remote free install.
96      *
97      * @param want, the want of the ability to free install.
98      * @param requestCode, ability request code.
99      * @param validUserId, designation User ID.
100      * @param callerToken, caller ability token.
101      * @return Returns ERR_OK on success, others on failure.
102      */
103     int StartRemoteFreeInstall(const Want &want, int requestCode, int32_t validUserId,
104         const sptr<IRemoteObject> &callerToken);
105 
106     /**
107      * Start to free install from another devices.
108      * The request is send from DMS.
109      *
110      * @param want, the want of the ability to free install.
111      * @param callback, used to notify caller the result of free install.
112      * @param userId, designation User ID.
113      * @param requestCode, ability request code.
114      * @return Returns ERR_OK on success, others on failure.
115      */
116     int FreeInstallAbilityFromRemote(const Want &want, const sptr<IRemoteObject> &callback,
117         int32_t userId, int requestCode);
118 
119     /**
120      * Connect if the request is free install.
121      * @param want, the want of the ability to free install.
122      * @param userId, designation User ID.
123      * @param callerToken, caller ability token.
124      * @param localDeviceId, the device id of local.
125      * @return Returns ERR_OK on success, others on failure.
126      */
127     int ConnectFreeInstall(const Want &want, int32_t userId, const sptr<IRemoteObject> &callerToken,
128         const std::string& localDeviceId);
129 
130     /**
131      * Add an observer from application into freeInstallObserverManager.
132      * @param observer, the observer of the ability to free install.
133      * @return Returns ERR_OK on success, others on failure.
134      */
135     int AddFreeInstallObserver(const sptr<IRemoteObject> &callerToken,
136         const sptr<AbilityRuntime::IFreeInstallObserver> &observer);
137 
138     /**
139      * Get free install task info.
140      *
141      * @param bundleName, the bundle name of the task.
142      * @param abilityName, the ability name of the task.
143      * @param startTime, the start time of the task.
144      * @param taskInfo, the found task info
145      * @return Returns true on success, false on failure.
146     */
147     bool GetFreeInstallTaskInfo(const std::string& bundleName, const std::string& abilityName,
148         const std::string& startTime, FreeInstallInfo& taskInfo);
149 
150     /**
151      * Get free install task info.
152      *
153      * @param sessionId, the sessionId of the task.
154      * @param taskInfo, the found task info
155      * @return Returns true on success, false on failure.
156     */
157     bool GetFreeInstallTaskInfo(const std::string& sessionId, FreeInstallInfo& taskInfo);
158 
159     /**
160      * Set the isStartUIAbilityBySCBCalled flag of the given free install task.
161      *
162      * @param bundleName, the bundle name of the task.
163      * @param abilityName, the abilitu name of the task.
164      * @param startTime, the start time of the task.
165      * @param scbCallStatus, the status of whether StartUIAbilityBySCB is called.
166     */
167     void SetSCBCallStatus(const std::string& bundleName, const std::string& abilityName,
168         const std::string& startTime, bool scbCallStatus);
169 
170     /**
171      * Set the isPreStartMissionCalled flag of the given free install task.
172      *
173      * @param bundleName, the bundle name of the task.
174      * @param abilityName, the abilitu name of the task.
175      * @param startTime, the start time of the task.
176      * @param preStartMissionCallStatus, the status of whether PreStartMission is called.
177     */
178     void SetPreStartMissionCallStatus(const std::string& bundleName, const std::string& abilityName,
179         const std::string& startTime, bool preStartMissionCallStatus);
180 
181     /**
182      * Set the sessionId of the given free install task.
183      *
184      * @param bundleName, the bundle name of the task.
185      * @param abilityName, the abilitu name of the task.
186      * @param startTime, the start time of the task.
187      * @param sessionId, the sessionId of the free install task.
188     */
189     void SetFreeInstallTaskSessionId(const std::string& bundleName, const std::string& abilityName,
190         const std::string& startTime, const std::string& sessionId);
191 
192 private:
193     std::weak_ptr<AbilityManagerService> server_;
194     std::vector<FreeInstallInfo> freeInstallList_;
195     std::vector<FreeInstallInfo> dmsFreeInstallCbs_;
196     std::map<std::string, std::time_t> timeStampMap_;
197     ffrt::mutex distributedFreeInstallLock_;
198     ffrt::mutex freeInstallListLock_;
199     ffrt::mutex freeInstallObserverLock_;
200 
201     int SetAppRunningState(Want &want);
202 
203     /**
204      * Start remote free install.
205      *
206      * @param want, the want of the ability to remote free install.
207      * @param userId, designation User ID.
208      * @param requestCode, ability request code.
209      * @param callerToken, caller ability token.
210      * @return Returns ERR_OK on success, others on failure.
211      */
212     int RemoteFreeInstall(const Want &want, int32_t userId, int requestCode, const sptr<IRemoteObject> &callerToken);
213 
214     int NotifyDmsCallback(const Want &want, int resultCode);
215     bool IsTopAbility(const sptr<IRemoteObject> &callerToken);
216     void NotifyFreeInstallResult(int32_t recordId, const Want &want, int resultCode, bool isAsync = false);
217     FreeInstallInfo BuildFreeInstallInfo(const Want &want, int32_t userId, int requestCode,
218         const sptr<IRemoteObject> &callerToken, bool isAsync, uint32_t specifyTokenId = 0,
219         bool isOpenAtomicServiceShortUrl = false, std::shared_ptr<Want> originalWant = nullptr);
220     std::time_t GetTimeStamp();
221 
222     void RemoveFreeInstallInfo(const std::string &bundleName, const std::string &abilityName,
223         const std::string &startTime);
224 
225     void PostUpgradeAtomicServiceTask(int resultCode, const Want &want, int32_t userId);
226 
227     void RemoveTimeoutTask(const std::string &bundleName, const std::string &abilityName, const std::string &startTime);
228 
229     void StartAbilityByFreeInstall(FreeInstallInfo &info, std::string &bundleName, std::string &abilityName,
230         std::string &startTime);
231     void StartAbilityByPreInstall(int32_t recordId, FreeInstallInfo &info, std::string &bundleName,
232         std::string &abilityName, std::string &startTime);
233     int32_t UpdateElementName(Want &want, int32_t userId) const;
234     void HandleFreeInstallResult(int32_t recordId, FreeInstallInfo &freeInstallInfo, int resultCode, bool isAsync);
235     void HandleOnFreeInstallSuccess(int32_t recordId, FreeInstallInfo &freeInstallInfo, bool isAsync);
236     void HandleOnFreeInstallFail(int32_t recordId, FreeInstallInfo &freeInstallInfo, int resultCode, bool isAsync);
237     void NotifySCBToHandleException(const FreeInstallInfo &info, int resultCode);
238     void StartAbilityByConvertedWant(FreeInstallInfo &info, const std::string &startTime);
239     void StartAbilityByOriginalWant(FreeInstallInfo &info, const std::string &startTime);
240     bool VerifyStartFreeInstallPermission(const sptr<IRemoteObject> &callerToken);
241     int32_t GetRecordIdByToken(const sptr<IRemoteObject> &callerToken);
242     void NotifyInsightIntentFreeInstallResult(const Want &want, int resultCode);
243     void NotifyInsightIntentExecuteDone(const Want &want, int resultCode);
244 };
245 }  // namespace AAFwk
246 }  // namespace OHOS
247 #endif  // OHOS_ABILITY_RUNTIME_FREE_INSTALL_MANAGER_H
248