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 LOG_TAG
16 #define LOG_TAG "ClientTypeManagerHandler"
17 #endif
18
19 #include "client_type_manager_handler.h"
20
21 namespace OHOS {
22 namespace AudioStandard {
ClientTypeManagerHandler()23 ClientTypeManagerHandler::ClientTypeManagerHandler() : AppExecFwk::EventHandler(
24 AppExecFwk::EventRunner::Create("OS_ClientTypeAsyncRunner"))
25 {
26 AUDIO_INFO_LOG("ctor");
27 }
28
~ClientTypeManagerHandler()29 ClientTypeManagerHandler::~ClientTypeManagerHandler()
30 {
31 AUDIO_WARNING_LOG("dtor should not happen");
32 };
33
RegisterClientTypeListener(ClientTypeListener * clientTypeListener)34 void ClientTypeManagerHandler::RegisterClientTypeListener(ClientTypeListener *clientTypeListener)
35 {
36 AUDIO_INFO_LOG("In");
37 clientTypeListener_ = clientTypeListener;
38 }
39
SendGetClientType(const std::string & bundleName,uint32_t uid)40 bool ClientTypeManagerHandler::SendGetClientType(const std::string &bundleName, uint32_t uid)
41 {
42 #ifdef FEATURE_APPGALLERY
43 auto eventContextObj = std::make_shared<EventObj>();
44 CHECK_AND_RETURN_RET_LOG(eventContextObj != nullptr, false, "Event obj is null");
45 eventContextObj->bundleName = bundleName;
46 eventContextObj->uid = uid;
47
48 std::lock_guard<mutex> runnerlock(runnerMutex_);
49 bool ret = true;
50 ret = SendEvent(AppExecFwk::InnerEvent::Get(EventClientTypeManagerCmd::GET_CLIENT_TYPE, eventContextObj));
51 CHECK_AND_RETURN_RET_LOG(ret, ret, "Send event failed");
52 return ret;
53 #else
54 return true;
55 #endif
56 }
57
SetQueryClientTypeCallback(const sptr<IStandardAudioPolicyManagerListener> & callback)58 void ClientTypeManagerHandler::SetQueryClientTypeCallback(const sptr<IStandardAudioPolicyManagerListener> &callback)
59 {
60 AUDIO_INFO_LOG("In");
61 std::lock_guard<std::mutex> lock(callbackMutex_);
62 if (queryClientTypeCallback_ != nullptr) {
63 AUDIO_INFO_LOG("Already register");
64 return;
65 }
66 queryClientTypeCallback_ = callback;
67 }
68
HandleGetClientType(const AppExecFwk::InnerEvent::Pointer & event)69 void ClientTypeManagerHandler::HandleGetClientType(const AppExecFwk::InnerEvent::Pointer &event)
70 {
71 AUDIO_INFO_LOG("In");
72 #ifdef FEATURE_APPGALLERY
73 std::shared_ptr<EventObj> eventContextObj = event->GetSharedObject<EventObj>();
74 CHECK_AND_RETURN_LOG(eventContextObj != nullptr, "EventtObj get nullptr");
75 std::string bundleName = eventContextObj->bundleName;
76 uint32_t uid = eventContextObj->uid;
77
78 if (bundleName == "" || uid == 0) {
79 AUDIO_ERR_LOG("bundle name: %{public}s, uid: %{public}u", bundleName.c_str(), uid);
80 return;
81 }
82
83 std::unique_lock<std::mutex> callbackLock(callbackMutex_);
84 if (queryClientTypeCallback_ == nullptr) {
85 AUDIO_WARNING_LOG("Query callback is not inited");
86 return;
87 }
88 bool isGame = queryClientTypeCallback_->OnQueryClientType(bundleName, uid);
89 callbackLock.unlock();
90 if (isGame) {
91 AUDIO_INFO_LOG("%{public}u is game type", uid);
92 clientTypeListener_->OnClientTypeQueryCompleted(uid, CLIENT_TYPE_GAME);
93 } else {
94 AUDIO_INFO_LOG("%{public}u not is game type", uid);
95 clientTypeListener_->OnClientTypeQueryCompleted(uid, CLIENT_TYPE_OTHERS);
96 }
97 #endif
98 }
99
ReleaseEventRunner()100 void ClientTypeManagerHandler::ReleaseEventRunner()
101 {
102 AUDIO_INFO_LOG("release all events");
103 SetEventRunner(nullptr);
104 }
105
ProcessEvent(const AppExecFwk::InnerEvent::Pointer & event)106 void ClientTypeManagerHandler::ProcessEvent(const AppExecFwk::InnerEvent::Pointer &event)
107 {
108 uint32_t eventId = event->GetInnerEventId();
109 AUDIO_DEBUG_LOG("handler process eventId:%{public}u", eventId);
110
111 switch (eventId) {
112 case EventClientTypeManagerCmd::GET_CLIENT_TYPE:
113 HandleGetClientType(event);
114 break;
115 default:
116 break;
117 }
118 }
119 } // namespace AudioStandard
120 } // namespace OHOS
121