Add attributionTag to audio-recordings
... by replacing packageName/uid/pid by the Identity class.
This allows us to track which parts of the app trigger audio-recordings.
90% of the code is just sending around the additional parameters.
This adds it for the Java and native API.
Test: atest CtsAppOpsTestCases
CtsNativeMediaAAudioTestCases
Fixes: 160150145
Change-Id: Ibd7b884f7fcd4668a4e27f997e59cfc3217a9e89
diff --git a/media/libmedia/IMediaPlayerService.cpp b/media/libmedia/IMediaPlayerService.cpp
index 11005c6..0f189ee 100644
--- a/media/libmedia/IMediaPlayerService.cpp
+++ b/media/libmedia/IMediaPlayerService.cpp
@@ -35,6 +35,8 @@
namespace android {
+using media::permission::Identity;
+
enum {
CREATE = IBinder::FIRST_CALL_TRANSACTION,
CREATE_MEDIA_RECORDER,
@@ -63,22 +65,22 @@
virtual sp<IMediaPlayer> create(
const sp<IMediaPlayerClient>& client, audio_session_t audioSessionId,
- const std::string opPackageName) {
+ const Identity& identity) {
Parcel data, reply;
data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor());
data.writeStrongBinder(IInterface::asBinder(client));
data.writeInt32(audioSessionId);
- data.writeCString(opPackageName.c_str());
+ data.writeParcelable(identity);
remote()->transact(CREATE, data, &reply);
return interface_cast<IMediaPlayer>(reply.readStrongBinder());
}
- virtual sp<IMediaRecorder> createMediaRecorder(const String16 &opPackageName)
+ virtual sp<IMediaRecorder> createMediaRecorder(const Identity& identity)
{
Parcel data, reply;
data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor());
- data.writeString16(opPackageName);
+ data.writeParcelable(identity);
remote()->transact(CREATE_MEDIA_RECORDER, data, &reply);
return interface_cast<IMediaRecorder>(reply.readStrongBinder());
}
@@ -129,19 +131,23 @@
sp<IMediaPlayerClient> client =
interface_cast<IMediaPlayerClient>(data.readStrongBinder());
audio_session_t audioSessionId = (audio_session_t) data.readInt32();
- const char* opPackageName = data.readCString();
- if (opPackageName == nullptr) {
- return FAILED_TRANSACTION;
+ Identity identity;
+ status_t status = data.readParcelable(&identity);
+ if (status != NO_ERROR) {
+ return status;
}
- std::string opPackageNameStr(opPackageName);
- sp<IMediaPlayer> player = create(client, audioSessionId, opPackageNameStr);
+ sp<IMediaPlayer> player = create(client, audioSessionId, identity);
reply->writeStrongBinder(IInterface::asBinder(player));
return NO_ERROR;
} break;
case CREATE_MEDIA_RECORDER: {
CHECK_INTERFACE(IMediaPlayerService, data, reply);
- const String16 opPackageName = data.readString16();
- sp<IMediaRecorder> recorder = createMediaRecorder(opPackageName);
+ Identity identity;
+ status_t status = data.readParcelable(&identity);
+ if (status != NO_ERROR) {
+ return status;
+ }
+ sp<IMediaRecorder> recorder = createMediaRecorder(identity);
reply->writeStrongBinder(IInterface::asBinder(recorder));
return NO_ERROR;
} break;