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