diff --git a/services/audio_policy/server/service/service_main/include/audio_policy_server.h b/services/audio_policy/server/service/service_main/include/audio_policy_server.h index 32313acdbb2b10d4a9adb1b47b93c79874f8bf37..64aea780cfc74dd3c0ea14d8722dbd240e8dc077 100644 --- a/services/audio_policy/server/service/service_main/include/audio_policy_server.h +++ b/services/audio_policy/server/service/service_main/include/audio_policy_server.h @@ -183,6 +183,9 @@ public: int32_t UnexcludeOutputDevices(int32_t audioDevUsage, const std::vector> &audioDeviceDescriptors) override; + + int32_t CheckAndGetApiVersion(std::vector> &deviceDescs, + bool hasSystemPermission); int32_t GetExcludedDevices(int32_t audioDevUsage, std::vector> &audioDeviceDescriptors) override; diff --git a/services/audio_policy/server/service/service_main/src/audio_core_service_private.cpp b/services/audio_policy/server/service/service_main/src/audio_core_service_private.cpp index 3adf00b374ee7ca462d5c44573c3097f4a80f433..cbfb39bb6972440ae42eab1fe4463700b1713d24 100644 --- a/services/audio_policy/server/service/service_main/src/audio_core_service_private.cpp +++ b/services/audio_policy/server/service/service_main/src/audio_core_service_private.cpp @@ -2946,6 +2946,9 @@ int32_t AudioCoreService::ActivateNearlinkDevice(const std::shared_ptr> &deviceDescs, + bool hasSystemPermission) +{ + if (hasSystemPermission && !HasUsbDevice(deviceDescs)) { + return 0; + } + return GetApiTargetVersion(); +} + int32_t AudioPolicyServer::GetExcludedDevices(int32_t audioDevUsageIn, vector> &device) { AudioDeviceUsage audioDevUsage = static_cast(audioDevUsageIn); - CHECK_AND_RETURN_RET_LOG(PermissionUtil::VerifySystemPermission(), ERR_PERMISSION_DENIED, + bool hasSystemPermission = PermissionUtil::VerifySystemPermission(); + CHECK_AND_RETURN_RET_LOG(hasSystemPermission, ERR_PERMISSION_DENIED, "No system permission"); device = audioDeviceLock_.GetExcludedDevices(audioDevUsage); - int32_t apiVersion = GetApiTargetVersion(); + int32_t apiVersion = CheckAndGetApiVersion(device, hasSystemPermission); AudioDeviceDescriptor::ClientInfo clientInfo { apiVersion }; clientInfo.isSupportedNearlink_ = audioPolicyUtils_.IsSupportedNearlink(AudioBundleManager::GetBundleName(), apiVersion, true); @@ -1952,7 +1962,7 @@ int32_t AudioPolicyServer::GetDevices(int32_t deviceFlagIn, deviceDescs = eventEntry_->GetDevices(deviceFlag); - int32_t apiVersion = GetApiTargetVersion(); + int32_t apiVersion = CheckAndGetApiVersion(deviceDescs, hasSystemPermission); AudioDeviceDescriptor::ClientInfo clientInfo { apiVersion }; clientInfo.isSupportedNearlink_ = audioPolicyUtils_.IsSupportedNearlink(AudioBundleManager::GetBundleName(), apiVersion, hasSystemPermission); @@ -1998,13 +2008,14 @@ int32_t AudioPolicyServer::GetDevicesInner(int32_t deviceFlagIn, int32_t AudioPolicyServer::GetOutputDevice(const sptr &audioRendererFilter, std::vector> &deviceDescs) { - if (!PermissionUtil::VerifySystemPermission()) { + bool hasSystemPermission = PermissionUtil::VerifySystemPermission(); + if (!hasSystemPermission) { AUDIO_ERR_LOG("only for system app"); return ERR_INVALID_OPERATION; } deviceDescs = audioPolicyService_.GetOutputDevice(audioRendererFilter); - int32_t apiVersion = GetApiTargetVersion(); + int32_t apiVersion = CheckAndGetApiVersion(deviceDescs, hasSystemPermission); AudioDeviceDescriptor::ClientInfo clientInfo { apiVersion }; clientInfo.isSupportedNearlink_ = audioPolicyUtils_.IsSupportedNearlink(AudioBundleManager::GetBundleName(), apiVersion, true); @@ -2022,13 +2033,14 @@ int32_t AudioPolicyServer::GetOutputDevice(const sptr &audi int32_t AudioPolicyServer::GetInputDevice(const sptr &audioCapturerFilter, std::vector> &deviceDescs) { - if (!PermissionUtil::VerifySystemPermission()) { + bool hasSystemPermission = PermissionUtil::VerifySystemPermission(); + if (!hasSystemPermission) { AUDIO_ERR_LOG("only for system app"); return ERR_INVALID_OPERATION; } deviceDescs = audioPolicyService_.GetInputDevice(audioCapturerFilter); - int32_t apiVersion = GetApiTargetVersion(); + int32_t apiVersion = CheckAndGetApiVersion(deviceDescs, hasSystemPermission); AudioDeviceDescriptor::ClientInfo clientInfo { apiVersion }; clientInfo.isSupportedNearlink_ = audioPolicyUtils_.IsSupportedNearlink(AudioBundleManager::GetBundleName(), apiVersion, true); @@ -2070,8 +2082,8 @@ int32_t AudioPolicyServer::GetPreferredOutputDeviceDescriptors(const AudioRender audioPolicyService_.UpdateDescWhenNoBTPermission(deviceDescs); } - int32_t apiVersion = GetApiTargetVersion(); bool hasSystemPermission = PermissionUtil::VerifySystemPermission(); + int32_t apiVersion = CheckAndGetApiVersion(deviceDescs, hasSystemPermission); AudioDeviceDescriptor::ClientInfo clientInfo { apiVersion }; clientInfo.isSupportedNearlink_ = audioPolicyUtils_.IsSupportedNearlink(AudioBundleManager::GetBundleName(), apiVersion, hasSystemPermission); @@ -2099,10 +2111,11 @@ int32_t AudioPolicyServer::GetPreferredInputDeviceDescriptors(const AudioCapture if (!hasBTPermission) { audioPolicyService_.UpdateDescWhenNoBTPermission(deviceDescs); } - int32_t apiVersion = GetApiTargetVersion(); + bool hasSystemPermission = PermissionUtil::VerifySystemPermission(); + int32_t apiVersion = CheckAndGetApiVersion(deviceDescs, hasSystemPermission); AudioDeviceDescriptor::ClientInfo clientInfo { apiVersion }; clientInfo.isSupportedNearlink_ = audioPolicyUtils_.IsSupportedNearlink(AudioBundleManager::GetBundleName(), - apiVersion, PermissionUtil::VerifySystemPermission()); + apiVersion, hasSystemPermission); for (auto &desc : deviceDescs) { CHECK_AND_RETURN_RET_LOG(desc, ERR_MEMORY_ALLOC_FAILED, "nullptr"); desc->SetClientInfo(clientInfo); @@ -3828,7 +3841,7 @@ int32_t AudioPolicyServer::GetAvailableDevices(int32_t usageIn, } } - int32_t apiVersion = GetApiTargetVersion(); + int32_t apiVersion = CheckAndGetApiVersion(deviceDevices, hasSystemPermission); AudioDeviceDescriptor::ClientInfo clientInfo { apiVersion }; clientInfo.isSupportedNearlink_ = audioPolicyUtils_.IsSupportedNearlink(AudioBundleManager::GetBundleName(), apiVersion, hasSystemPermission); diff --git a/services/audio_policy/test/unittest/audio_interrupt_service_test/src/audio_policy_server_unit_test.cpp b/services/audio_policy/test/unittest/audio_interrupt_service_test/src/audio_policy_server_unit_test.cpp index e098462fa685dfc93243ec30b34676c2ec21ddc4..24a648995eb124be338ccc3f5ed8b43c111b8fca 100644 --- a/services/audio_policy/test/unittest/audio_interrupt_service_test/src/audio_policy_server_unit_test.cpp +++ b/services/audio_policy/test/unittest/audio_interrupt_service_test/src/audio_policy_server_unit_test.cpp @@ -3700,5 +3700,32 @@ HWTEST(AudioPolicyUnitTest, IsIntelligentNoiseReductionEnabledForCurrentDevice_0 int32_t ret = server->IsIntelligentNoiseReductionEnabledForCurrentDevice(sourceType, isSupport); EXPECT_EQ(ret, SUCCESS); } + +/** +* @tc.name : Test AudioPolicyServer. +* @tc.number: CheckAndGetApiVersion_001 +* @tc.desc : AudioPolicyServer::CheckAndGetApiVersion. +*/ +HWTEST(AudioPolicyUnitTest, CheckAndGetApiVersion_001, TestSize.Level1) +{ + sptr server = GetPolicyServerUnitTest(); + ASSERT_TRUE(server != nullptr); + + bool hasSystemPermission = false; + + std::shared_ptr desc = std::make_shared(); + desc->deviceType_ = DEVICE_TYPE_USB_HEADSET; + desc->hasPair_ = false; + std::vector> deviceDescs; + + int32_t apiVersion = server->CheckAndGetApiVersion(deviceDescs, hasSystemPermission); + EXPECT_EQ(apiVersion, 0); + hasSystemPermission = true; + apiVersion = server->CheckAndGetApiVersion(deviceDescs, hasSystemPermission); + EXPECT_EQ(apiVersion, 0); + deviceDescs.push_back(desc); + apiVersion = server->CheckAndGetApiVersion(deviceDescs, hasSystemPermission); + EXPECT_EQ(apiVersion, 0); +} } // AudioStandard } // OHOS