1 /* 2 * Copyright (c) 2023 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_FORM_FWK_FORM_RENDER_MGR_INNER_H 17 #define OHOS_FORM_FWK_FORM_RENDER_MGR_INNER_H 18 19 #include <atomic> 20 #include <queue> 21 #include <shared_mutex> 22 #include <unordered_map> 23 24 #include "data_center/form_record/form_record.h" 25 #include "form_render/form_render_connection.h" 26 #include "form_render_interface.h" 27 #include "want.h" 28 29 namespace OHOS { 30 namespace AppExecFwk { 31 using Want = OHOS::AAFwk::Want; 32 using WantParams = OHOS::AAFwk::WantParams; 33 /** 34 * @class FormRenderMgrInner 35 * FormRenderMgrInner provides a facility for managing form render life cycle. 36 */ 37 class FormRenderMgrInner { 38 public: 39 FormRenderMgrInner(); 40 virtual ~FormRenderMgrInner(); 41 42 virtual ErrCode RenderForm( 43 const FormRecord &formRecord, Want &want, const sptr<IRemoteObject> &hostToken = nullptr); 44 45 ErrCode UpdateRenderingForm(FormRecord &formRecord, const FormProviderData &formProviderData, 46 const WantParams &wantParams, bool mergeData); 47 48 ErrCode StopRenderingForm(int64_t formId, const FormRecord &formRecord, 49 const std::string &compId = "", const sptr<IRemoteObject> &hostToken = nullptr); 50 51 ErrCode ReloadForm(const std::vector<FormRecord> &&formRecords, const std::string &bundleName, int32_t userId); 52 53 ErrCode StopRenderingFormCallback(int64_t formId, const Want &want); 54 55 ErrCode AddConnection(int64_t formId, sptr<FormRenderConnection> connection); 56 57 void RemoveConnection(int64_t formId); 58 59 ErrCode checkConnectionsFormIds(std::vector<int64_t> formIds, std::vector<int64_t> &needconFormIds); 60 61 void AddRenderDeathRecipient(const sptr<IRemoteObject> &renderRemoteObj); 62 63 void RerenderAllForms(); 64 65 void CleanFormHost(const sptr<IRemoteObject> &host); 66 67 void OnRenderingBlock(const std::string &bundleName); 68 69 ErrCode ReleaseRenderer(int64_t formId, const FormRecord &formRecord, const std::string &compId); 70 71 void PostOnUnlockTask(); 72 73 void NotifyScreenOn(); 74 75 void PostSetVisibleChangeTask(int64_t formId, bool isVisible); 76 77 int32_t GetReRenderCount() const; 78 79 sptr<IFormRender> GetRenderRemoteObj() const; 80 81 void SetRenderRemoteObj(sptr<IFormRender> remoteObject); 82 83 ErrCode RecycleForms(const std::vector<int64_t> &formIds, const Want &want, 84 const sptr<IRemoteObject> &remoteObjectOfHost); 85 86 ErrCode RecoverForms(const std::vector<int64_t> &formIds, const WantParams &wantParams); 87 88 ErrCode UpdateFormSize(const int64_t &formId, float width, float height, float borderWidth); 89 90 void SetUserId(int32_t userId); 91 92 int32_t GetUserId() const; 93 94 void RerenderAllFormsImmediate(); 95 96 void DisconnectAllRenderConnections(); 97 98 bool GetIsFRSDiedInLowMemory(); 99 100 private: 101 ErrCode ConnectRenderService(const sptr<FormRenderConnection> &connection, int32_t level) const; 102 103 void DisconnectRenderService(const sptr<FormRenderConnection> connection, size_t size) const; 104 105 void AddHostToken(const sptr<IRemoteObject> &host, int64_t formId); 106 107 void RemoveHostToken(const sptr<IRemoteObject> &host); 108 109 void NotifyHostRenderServiceIsDead() const; 110 111 void FillBundleInfo(Want &want, const std::string &bundleName) const; 112 113 void CheckIfFormRecycled(FormRecord &formRecord, Want& want) const; 114 115 ErrCode GetConnectionAndRenderForm(FormRecord &formRecord, Want &want); 116 117 ErrCode GetRenderObject(sptr<IRemoteObject> &renderObj); 118 119 bool GetRenderFormConnectId(const int64_t formId, int32_t& connectId); 120 121 bool GetRenderFormConnection(sptr<FormRenderConnection> &connection, const int64_t formId); 122 123 void GetConnectedForms(const std::vector<int64_t> &formIds, std::vector<int64_t> &connectedForms); 124 125 ErrCode RenderConnectedForm(const FormRecord &formRecord, Want &want, const sptr<FormRenderConnection> &connection); 126 127 ErrCode PostStopRenderingFormTask(const FormRecord &formRecord, Want &want); 128 129 ErrCode CheckRenderConnectionExistById(int64_t formId); 130 131 /** 132 * Recovers the Form Render Service (FRS) process when a form event. 133 * 134 * This function is triggered to revive the FRS process under the following conditions: 135 * 1. A form event (e.g., RenderForm, RecoverForms) occurs. 136 * 2. The FRS process was previously terminated by the system's low-memory killer. 137 */ 138 void RecoverFRSOnFormActivity(); 139 140 private: 141 class RemoteObjHash { 142 public: operator()143 size_t operator() (const sptr<IRemoteObject> &remoteObj) const 144 { 145 return reinterpret_cast<size_t>(remoteObj.GetRefPtr()); 146 } 147 }; 148 149 mutable std::mutex resourceMutex_; 150 mutable std::shared_mutex renderRemoteObjMutex_; 151 // <formId, connectionToRenderService> 152 std::unordered_map<int64_t, sptr<FormRenderConnection>> renderFormConnections_; 153 // <hostToken, formIds> 154 std::unordered_map<sptr<IRemoteObject>, std::unordered_set<int64_t>, RemoteObjHash> etsHosts_; 155 sptr<IFormRender> renderRemoteObj_ = nullptr; 156 sptr<IRemoteObject::DeathRecipient> renderDeathRecipient_ = nullptr; 157 std::atomic<int32_t> atomicRerenderCount_ = 0; 158 // userId_ is Active User 159 bool isActiveUser_ = true; 160 int32_t userId_ = 0; 161 std::atomic_bool isFrsDiedInLowMemory_ = false; 162 }; 163 164 /** 165 * @class FormRenderRecipient 166 * FormRenderRecipient notices IRemoteBroker died. 167 */ 168 class FormRenderRecipient : public IRemoteObject::DeathRecipient { 169 public: 170 using RemoteDiedHandler = std::function<void()>; 171 172 explicit FormRenderRecipient(RemoteDiedHandler handler); 173 174 virtual ~FormRenderRecipient(); 175 176 void OnRemoteDied(const wptr<IRemoteObject> &remote) override; 177 178 private: 179 RemoteDiedHandler handler_; 180 }; 181 } // namespace AppExecFwk 182 } // namespace OHOS 183 #endif // OHOS_FORM_FWK_FORM_RENDER_MGR_INNER_H 184