1 /* 2 * Copyright (c) 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 #ifndef PPSOPENHARMONYSA_OPEN_CONNECT_ADS_STUB_H 16 #define PPSOPENHARMONYSA_OPEN_CONNECT_ADS_STUB_H 17 18 #include "extension_manager_client.h" 19 #include "ability_connect_callback_stub.h" 20 #include "oaid_common.h" 21 #include "oaid_service_define.h" 22 using OHOS::AAFwk::ExtensionManagerClient; 23 using OHOS::AAFwk::AbilityConnectionStub; 24 using OHOS::AppExecFwk::ElementName; 25 using OHOS::AAFwk::Want; 26 using OHOS::IRemoteObject; 27 using OHOS::sptr; 28 29 namespace OHOS { 30 namespace Cloud { 31 class AdsCallback : public IRemoteBroker { 32 public: 33 DECLARE_INTERFACE_DESCRIPTOR(u"ohos.cloud.oaid.AdsCallback"); 34 }; 35 36 class ADSCallbackStub : public IRemoteStub<AdsCallback> { 37 public: 38 DISALLOW_COPY_AND_MOVE(ADSCallbackStub); 39 ADSCallbackStub() = default; 40 virtual ~ADSCallbackStub() = default; 41 42 int OnRemoteRequest( 43 uint32_t code, MessageParcel& data, MessageParcel& reply, MessageOption& option) override; 44 }; 45 46 class ConnectAdsStub : public AbilityConnectionStub { 47 public: 48 OnAbilityConnectDone(const ElementName & element,const sptr<IRemoteObject> & remoteObject,int resultCode)49 void OnAbilityConnectDone(const ElementName &element, const sptr<IRemoteObject> &remoteObject, 50 int resultCode) override 51 { 52 OAID_HILOGI(OAID_MODULE_SERVICE, "enter OnAbilityConnectDone"); 53 proxy_ = remoteObject; 54 SendMessage(); 55 } 56 OnAbilityDisconnectDone(const ElementName & element,int resultCode)57 void OnAbilityDisconnectDone(const ElementName &element, int resultCode) override 58 { 59 OAID_HILOGI(OAID_MODULE_SERVICE, "enter OnAbilityDisconnectDone"); 60 proxy_ = nullptr; 61 } 62 GetRemoteObject()63 sptr<IRemoteObject> GetRemoteObject() 64 { 65 return proxy_; 66 } 67 SendMessage()68 void SendMessage() 69 { 70 OAID_HILOGI(OAID_MODULE_SERVICE, "SendMessage enter"); 71 if (proxy_ == nullptr) { 72 return; 73 } 74 MessageParcel data; 75 MessageParcel reply; 76 MessageOption option; 77 std::lock_guard<std::mutex> lock(checkMutex_); 78 if (OAID_INFO_TOKEN.empty() || !data.WriteInterfaceToken(OAID_INFO_TOKEN)) { 79 OAID_HILOGW(OAID_MODULE_SERVICE, "SendMessage WriteInterfaceToken failed"); 80 return; 81 } 82 auto callback = new ADSCallbackStub(); 83 if (!data.WriteRemoteObject(callback->AsObject())) { 84 OAID_HILOGW(OAID_MODULE_SERVICE, "Callback write failed."); 85 return; 86 } 87 proxy_->SendRequest(CODE_ALLOW_GET_OAID, data, reply, option); 88 OAID_HILOGI(OAID_MODULE_SERVICE, "SendMessage finished"); 89 } 90 setToken(std::u16string token)91 static void setToken(std::u16string token) 92 { 93 OAID_HILOGI(OAID_MODULE_SERVICE, "setToken enter"); 94 std::lock_guard<std::mutex> lock(checkMutex_); 95 OAID_INFO_TOKEN = token; 96 } 97 98 private: 99 sptr<IRemoteObject> proxy_; 100 static std::u16string OAID_INFO_TOKEN; 101 static std::mutex checkMutex_; 102 }; 103 std::u16string ConnectAdsStub::OAID_INFO_TOKEN = u""; 104 std::mutex ConnectAdsStub::checkMutex_; 105 106 class ConnectAdsManager { 107 public: 108 109 ConnectAdsManager(ConnectAdsManager &) = delete; 110 ConnectAdsManager& operator=(const ConnectAdsManager&)=delete; 111 ~ConnectAdsManager()112 ~ConnectAdsManager() 113 { 114 DisconnectService(); 115 OAID_HILOGI(OAID_MODULE_SERVICE, "destructor ConnectAdsManager"); 116 } 117 GetInstance()118 static ConnectAdsManager* GetInstance() 119 { 120 static ConnectAdsManager instance; 121 return &instance; 122 } 123 ConnectToAds(Want want)124 bool ConnectToAds(Want want) 125 { 126 OAID_HILOGI(OAID_MODULE_SERVICE, "enter ConnectToAds isConnect=%{public}d", isConnect); 127 if (!isConnect) { 128 OAID_HILOGI(OAID_MODULE_SERVICE, "start ConnectToAds "); 129 int32_t resultNumber = ExtensionManagerClient::GetInstance().ConnectServiceExtensionAbility(want, 130 connectObject_, nullptr, DEFAULT_VALUE); 131 OAID_HILOGI(OAID_MODULE_SERVICE, "ConnectToAds result=%{public}d", resultNumber); 132 if (resultNumber != ERR_OK) { 133 OAID_HILOGI(OAID_MODULE_SERVICE, " failed to ConnectToAds ability"); 134 return false; 135 } 136 isConnect = true; 137 } 138 return true; 139 } 140 DisconnectService()141 int32_t DisconnectService() 142 { 143 OAID_HILOGI(OAID_MODULE_SERVICE, "enter DisconnectService isConnect=%{public}d", isConnect); 144 if (isConnect) { 145 OAID_HILOGI(OAID_MODULE_SERVICE, "start DisconnectService "); 146 ExtensionManagerClient::GetInstance().DisconnectAbility(connectObject_); 147 isConnect = false; 148 } 149 return 0; 150 } 151 152 Want getWantInfo(); 153 154 bool checkAllowGetOaid(); 155 getAllowGetOAIDFromKit()156 static void getAllowGetOAIDFromKit() 157 { 158 OAID_HILOGI(OAID_MODULE_SERVICE, "getAllowGetOAIDFromKit isConnect = %{public}d", isConnect); 159 if (!isConnect) { 160 OAID_HILOGI(OAID_MODULE_SERVICE, "getAllowGetOAIDFromKit enter ConnectToAds"); 161 Want want = ConnectAdsManager::GetInstance()->getWantInfo(); 162 ConnectAdsManager::GetInstance()->ConnectToAds(want); 163 } 164 } 165 getConnection()166 sptr<ConnectAdsStub> getConnection() 167 { 168 return connectObject_; 169 } 170 171 private: 172 sptr<ConnectAdsStub> connectObject_; 173 int32_t DEFAULT_VALUE = -1; 174 static bool isConnect; ConnectAdsManager()175 ConnectAdsManager() 176 { 177 connectObject_ = sptr<ConnectAdsStub>(new ConnectAdsStub); 178 OAID_HILOGI(OAID_MODULE_SERVICE, "constructor ConnectAdsManager"); 179 } 180 }; 181 bool ConnectAdsManager::isConnect = false; 182 183 } // namespace Cloud 184 } // namespace OHOS 185 #endif //PPSOPENHARMONYSA_OPEN_CONNECT_ADS_STUB_H 186