Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Unverified Commit c2d9d7b4 authored by Michael Bestas's avatar Michael Bestas
Browse files

Merge tag 'android-15.0.0_r14' into staging/lineage-22.1_merge-android-15.0.0_r14

Android 15.0.0 Release 14 (AP4A.250205.002)

# -----BEGIN PGP SIGNATURE-----
#
# iF0EABECAB0WIQRDQNE1cO+UXoOBCWTorT+BmrEOeAUCZ6KKkQAKCRDorT+BmrEO
# eIkCAJ0bqxDDs0hImADXCxDKqBp5+El0SgCcDgRE1k6bg/4zMAe1GZPmeN8HxhM=
# =sV/E
# -----END PGP SIGNATURE-----
# gpg: Signature made Tue Feb  4 23:45:53 2025 EET
# gpg:                using DSA key 4340D13570EF945E83810964E8AD3F819AB10E78
# gpg: Good signature from "The Android Open Source Project <initial-contribution@android.com>" [ultimate]

# By Atneya Nair
# Via Android Build Coastguard Worker
* tag 'android-15.0.0_r14':
  Revert "Fix audio AppOps refcount mismatch"

 Conflicts:
	services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp

Change-Id: Ie977ecfbcf8543ad2770a68cf798c1afc441bb1d
parents e8bbb3a8 10ff44e8
Loading
Loading
Loading
Loading
+9 −13
Original line number Diff line number Diff line
@@ -41,10 +41,6 @@

namespace android {

namespace {
constexpr auto PERMISSION_HARD_DENIED = permission::PermissionChecker::PERMISSION_HARD_DENIED;
}

using content::AttributionSourceState;

static const String16 sAndroidPermissionRecordAudio("android.permission.RECORD_AUDIO");
@@ -119,7 +115,7 @@ std::optional<AttributionSourceState> resolveAttributionSource(
    return std::optional<AttributionSourceState>{myAttributionSource};
}

    static int checkRecordingInternal(const AttributionSourceState &attributionSource,
    static bool checkRecordingInternal(const AttributionSourceState &attributionSource,
                                       const uint32_t virtualDeviceId,
                                       const String16 &msg, bool start, audio_source_t source) {
    // Okay to not track in app ops as audio server or media server is us and if
@@ -142,15 +138,15 @@ std::optional<AttributionSourceState> resolveAttributionSource(
    const int32_t attributedOpCode = getOpForSource(source);

    permission::PermissionChecker permissionChecker;
    int permitted;
    bool permitted = false;
    if (start) {
        permitted = permissionChecker.checkPermissionForStartDataDeliveryFromDatasource(
        permitted = (permissionChecker.checkPermissionForStartDataDeliveryFromDatasource(
                sAndroidPermissionRecordAudio, resolvedAttributionSource.value(), msg,
                attributedOpCode);
                attributedOpCode) != permission::PermissionChecker::PERMISSION_HARD_DENIED);
    } else {
        permitted = permissionChecker.checkPermissionForPreflightFromDatasource(
        permitted = (permissionChecker.checkPermissionForPreflightFromDatasource(
                sAndroidPermissionRecordAudio, resolvedAttributionSource.value(), msg,
                attributedOpCode);
                attributedOpCode) != permission::PermissionChecker::PERMISSION_HARD_DENIED);
    }

    return permitted;
@@ -160,17 +156,17 @@ static constexpr int DEVICE_ID_DEFAULT = 0;

bool recordingAllowed(const AttributionSourceState &attributionSource, audio_source_t source) {
    return checkRecordingInternal(attributionSource, DEVICE_ID_DEFAULT, String16(), /*start*/ false,
                                  source) != PERMISSION_HARD_DENIED;
                                  source);
}

bool recordingAllowed(const AttributionSourceState &attributionSource,
                      const uint32_t virtualDeviceId,
                      audio_source_t source) {
    return checkRecordingInternal(attributionSource, virtualDeviceId,
                                  String16(), /*start*/ false, source) != PERMISSION_HARD_DENIED;
                                  String16(), /*start*/ false, source);
}

int startRecording(const AttributionSourceState& attributionSource,
bool startRecording(const AttributionSourceState& attributionSource,
                    const uint32_t virtualDeviceId,
                    const String16& msg,
                    audio_source_t source) {
+1 −1
Original line number Diff line number Diff line
@@ -92,7 +92,7 @@ bool recordingAllowed(const AttributionSourceState& attributionSource,
bool recordingAllowed(const AttributionSourceState &attributionSource,
                      uint32_t virtualDeviceId,
                      audio_source_t source);
int startRecording(const AttributionSourceState& attributionSource, uint32_t virtualDeviceId,
bool startRecording(const AttributionSourceState& attributionSource, uint32_t virtualDeviceId,
                    const String16& msg, audio_source_t source);
void finishRecording(const AttributionSourceState& attributionSource, uint32_t virtualDeviceId,
                     audio_source_t source);
+15 −29
Original line number Diff line number Diff line
@@ -89,10 +89,6 @@ using media::audio::common::AudioUuid;
using media::audio::common::Int;

constexpr int kDefaultVirtualDeviceId = 0;
namespace {
constexpr auto PERMISSION_HARD_DENIED = permission::PermissionChecker::PERMISSION_HARD_DENIED;
constexpr auto PERMISSION_GRANTED = permission::PermissionChecker::PERMISSION_GRANTED;
}

const std::vector<audio_usage_t>& SYSTEM_USAGES = {
    AUDIO_USAGE_CALL_ASSISTANT,
@@ -910,14 +906,14 @@ Status AudioPolicyService::startInput(int32_t portIdAidl)

    std::stringstream msg;
    msg << "Audio recording on session " << client->session;
    const auto permitted = isAudioServerOrMediaServerUid(client->attributionSource.uid) ||
            startRecording(client->attributionSource, client->virtualDeviceId,
            String16(msg.str().c_str()), client->attributes.source);

    // check calling permissions
    if (permitted == PERMISSION_HARD_DENIED && client->attributes.source != AUDIO_SOURCE_FM_TUNER
            && client->attributes.source != AUDIO_SOURCE_REMOTE_SUBMIX
            && client->attributes.source != AUDIO_SOURCE_ECHO_REFERENCE) {
    if (!isAudioServerOrMediaServerUid(client->attributionSource.uid)
            && !(startRecording(client->attributionSource, client->virtualDeviceId,
                         String16(msg.str().c_str()), client->attributes.source)
            || client->attributes.source == AUDIO_SOURCE_FM_TUNER
            || client->attributes.source == AUDIO_SOURCE_REMOTE_SUBMIX
            || client->attributes.source == AUDIO_SOURCE_ECHO_REFERENCE)) {
        ALOGE("%s permission denied: recording not allowed for attribution source %s",
                __func__, client->attributionSource.toString().c_str());
        return binderStatusFromStatusT(PERMISSION_DENIED);
@@ -937,17 +933,13 @@ Status AudioPolicyService::startInput(int32_t portIdAidl)
        return binderStatusFromStatusT(INVALID_OPERATION);
    }

    // Force the possibly silenced client to match the state on the appops side
    // following the call to startRecording (i.e. unsilenced iff call succeeded)
    // At this point in time, the client is inactive, so no calls to appops are
    // sent in setAppState_l. This ensures existing clients have the same
    // behavior as new clients.
    // Force the possibly silenced client to be unsilenced since we just called
    // startRecording (i.e. we have assumed it is unsilenced).
    // At this point in time, the client is inactive, so no calls to appops are sent in
    // setAppState_l.
    // This ensures existing clients have the same behavior as new clients (starting unsilenced).
    // TODO(b/282076713)
    if (permitted == PERMISSION_GRANTED) {
    setAppState_l(client, APP_STATE_TOP);
    } else {
        setAppState_l(client, APP_STATE_IDLE);
    }

    client->active = true;
    client->startTimeNs = systemTime();
@@ -1033,11 +1025,9 @@ Status AudioPolicyService::startInput(int32_t portIdAidl)
        client->active = false;
        client->startTimeNs = 0;
        updateUidStates_l();
        if (!client->silenced) {
        finishRecording(client->attributionSource, client->virtualDeviceId,
                        client->attributes.source);
    }
    }

    return binderStatusFromStatusT(status);
}
@@ -1065,11 +1055,7 @@ Status AudioPolicyService::stopInput(int32_t portIdAidl)
    updateUidStates_l();

    // finish the recording app op
    if (!client->silenced) {
        finishRecording(client->attributionSource, client->virtualDeviceId,
                client->attributes.source);
    }

    finishRecording(client->attributionSource, client->virtualDeviceId, client->attributes.source);
    AutoCallerClear acc;
    return binderStatusFromStatusT(mAudioPolicyManager->stopInput(portId));
}
+3 −8
Original line number Diff line number Diff line
@@ -61,10 +61,6 @@ static const nsecs_t kAudioCommandTimeoutNs = seconds(3); // 3 seconds

static const String16 sManageAudioPolicyPermission("android.permission.MANAGE_AUDIO_POLICY");

namespace {
constexpr auto PERMISSION_GRANTED = permission::PermissionChecker::PERMISSION_GRANTED;
}

// Creates an association between Binder code to name for IAudioPolicyService.
#define IAUDIOPOLICYSERVICE_BINDER_METHOD_MACRO_LIST \
BINDER_METHOD_ENTRY(onNewAudioModulesAvailable) \
@@ -1220,10 +1216,9 @@ void AudioPolicyService::setAppState_l(sp<AudioRecordClient> client, app_state_t
                } else {
                    std::stringstream msg;
                    msg << "Audio recording un-silenced on session " << client->session;
                    if (startRecording(client->attributionSource, client->virtualDeviceId,
                                String16(msg.str().c_str()), client->attributes.source)
                                != PERMISSION_GRANTED) {
                        return;
                    if (!startRecording(client->attributionSource, client->virtualDeviceId,
                                        String16(msg.str().c_str()), client->attributes.source)) {
                        silenced = true;
                    }
                }
            }