diff --git a/media/utils/ServiceUtilities.cpp b/media/utils/ServiceUtilities.cpp index 7fd5be5d3685538158b8969fed60feb36cf4142e..81662f1ad4e4a7a03e656e67e5b09e5a674be9b9 100644 --- a/media/utils/ServiceUtilities.cpp +++ b/media/utils/ServiceUtilities.cpp @@ -172,9 +172,28 @@ static int checkRecordingInternal(const AttributionSourceState &attributionSourc permission::PermissionChecker permissionChecker; int permitted; if (start) { - permitted = permissionChecker.checkPermissionForStartDataDeliveryFromDatasource( + // Do a double-check, where we first check without actually starting in order to handle + // the behavior of AppOps where ops are sometimes started but paused for SOFT_DENIED. + // Since there is no way to maintain reference consensus due to this behavior, avoid + // starting an op when a restriction is in place by first checking. In the case where we + // startOp would fail, call a noteOp (which will also fail) instead. This preserves + // behavior that is reliant on listening to op rejected events (such as the hint + // dialogue to unmute the microphone). Technically racy, but very unlikely. + // + // TODO(b/294609684) To be removed when the pause state for an OP is removed. + permitted = permissionChecker.checkPermissionForPreflightFromDatasource( sAndroidPermissionRecordAudio, resolvedAttributionSource.value(), msg, attributedOpCode); + if (permitted == PERMISSION_GRANTED) { + permitted = permissionChecker.checkPermissionForStartDataDeliveryFromDatasource( + sAndroidPermissionRecordAudio, resolvedAttributionSource.value(), msg, + attributedOpCode); + } else { + // intentionally don't set permitted + permissionChecker.checkPermissionForDataDeliveryFromDatasource( + sAndroidPermissionRecordAudio, resolvedAttributionSource.value(), msg, + attributedOpCode); + } } else { permitted = permissionChecker.checkPermissionForPreflightFromDatasource( sAndroidPermissionRecordAudio, resolvedAttributionSource.value(), msg, diff --git a/services/audiopolicy/service/AudioRecordClient.cpp b/services/audiopolicy/service/AudioRecordClient.cpp index 79a745863f77d1cc15621e2ccf30b0b99893e415..aec43ca22da5109d7d6d61f5291ae85fc0cf13a6 100644 --- a/services/audiopolicy/service/AudioRecordClient.cpp +++ b/services/audiopolicy/service/AudioRecordClient.cpp @@ -50,7 +50,7 @@ int getTargetSdkForPackageName(std::string_view packageName) { if (pm != nullptr) { const auto status = pm->getTargetSdkVersionForPackage( String16{packageName.data(), packageName.size()}, &targetSdk); - return status.isOk() ? targetSdk : -1; + return status.isOk() ? targetSdk : __ANDROID_API_FUTURE__; } } return targetSdk;