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

Commit f5a7a289 authored by android-build-team Robot's avatar android-build-team Robot Committed by Android (Google) Code Review
Browse files

Merge "Log audio recording and dynamic policy registration history" into pi-dev

parents e93daa46 12a8676b
Loading
Loading
Loading
Loading
+9 −3
Original line number Diff line number Diff line
@@ -6994,6 +6994,7 @@ public class AudioService extends IAudioService.Stub
    final int LOG_NB_EVENTS_WIRED_DEV_CONNECTION = 30;
    final int LOG_NB_EVENTS_FORCE_USE = 20;
    final int LOG_NB_EVENTS_VOLUME = 40;
    final int LOG_NB_EVENTS_DYN_POLICY = 10;

    final private AudioEventLogger mModeLogger = new AudioEventLogger(LOG_NB_EVENTS_PHONE_STATE,
            "phone state (logged after successfull call to AudioSystem.setPhoneState(int))");
@@ -7010,6 +7011,9 @@ public class AudioService extends IAudioService.Stub
    final private AudioEventLogger mVolumeLogger = new AudioEventLogger(LOG_NB_EVENTS_VOLUME,
            "volume changes (logged when command received by AudioService)");

    final private AudioEventLogger mDynPolicyLogger = new AudioEventLogger(LOG_NB_EVENTS_DYN_POLICY,
            "dynamic policy events (logged when command received by AudioService)");

    private static final String[] RINGER_MODE_NAMES = new String[] {
            "SILENT",
            "VIBRATE",
@@ -7077,6 +7081,7 @@ public class AudioService extends IAudioService.Stub
        pw.print("  mAvrcpAbsVolSupported="); pw.println(mAvrcpAbsVolSupported);

        dumpAudioPolicies(pw);
        mDynPolicyLogger.dump(pw);

        mPlaybackMonitor.dump(pw);

@@ -7401,8 +7406,6 @@ public class AudioService extends IAudioService.Stub
            boolean hasFocusListener, boolean isFocusPolicy, boolean isVolumeController) {
        AudioSystem.setDynamicPolicyCallback(mDynPolicyCallback);

        if (DEBUG_AP) Log.d(TAG, "registerAudioPolicy for " + pcb.asBinder()
                + " with config:" + policyConfig);
        String regId = null;
        // error handling
        boolean hasPermissionForPolicy =
@@ -7414,6 +7417,8 @@ public class AudioService extends IAudioService.Stub
            return null;
        }

        mDynPolicyLogger.log((new AudioEventLogger.StringEvent("registerAudioPolicy for "
                + pcb.asBinder() + " with config:" + policyConfig)).printLog(TAG));
        synchronized (mAudioPolicies) {
            try {
                if (mAudioPolicies.containsKey(pcb.asBinder())) {
@@ -7436,7 +7441,8 @@ public class AudioService extends IAudioService.Stub
    }

    public void unregisterAudioPolicyAsync(IAudioPolicyCallback pcb) {
        if (DEBUG_AP) Log.d(TAG, "unregisterAudioPolicyAsync for " + pcb.asBinder());
        mDynPolicyLogger.log((new AudioEventLogger.StringEvent("unregisterAudioPolicyAsync for "
                + pcb.asBinder()).printLog(TAG)));
        synchronized (mAudioPolicies) {
            AudioPolicyProxy app = mAudioPolicies.remove(pcb.asBinder());
            if (app == null) {
+41 −0
Original line number Diff line number Diff line
@@ -103,6 +103,9 @@ public final class RecordingActivityMonitor implements AudioSystem.AudioRecordin
                conf.dump(pw);
            }
        }
        pw.println("\n");
        // log
        sEventLogger.dump(pw);
    }

    private ArrayList<AudioRecordingConfiguration> anonymizeForPublicConsumption(
@@ -190,6 +193,9 @@ public final class RecordingActivityMonitor implements AudioSystem.AudioRecordin
            case AudioManager.RECORD_CONFIG_EVENT_STOP:
                // return failure if an unknown recording session stopped
                configChanged = (mRecordConfigs.remove(new Integer(session)) != null);
                if (configChanged) {
                    sEventLogger.log(new RecordingEvent(event, uid, session, source, null));
                }
                break;
            case AudioManager.RECORD_CONFIG_EVENT_START:
                final AudioFormat clientFormat = new AudioFormat.Builder()
@@ -231,6 +237,9 @@ public final class RecordingActivityMonitor implements AudioSystem.AudioRecordin
                    mRecordConfigs.put(sessionKey, updatedConfig);
                    configChanged = true;
                }
                if (configChanged) {
                    sEventLogger.log(new RecordingEvent(event, uid, session, source, packageName));
                }
                break;
            default:
                Log.e(TAG, String.format("Unknown event %d for session %d, source %d",
@@ -281,4 +290,36 @@ public final class RecordingActivityMonitor implements AudioSystem.AudioRecordin
            mDispatcherCb.asBinder().unlinkToDeath(this, 0);
        }
    }

    /**
     * Inner class for recording event logging
     */
    private static final class RecordingEvent extends AudioEventLogger.Event {
        private final int mRecEvent;
        private final int mClientUid;
        private final int mSession;
        private final int mSource;
        private final String mPackName;

        RecordingEvent(int event, int uid, int session, int source, String packName) {
            mRecEvent = event;
            mClientUid = uid;
            mSession = session;
            mSource = source;
            mPackName = packName;
        }

        @Override
        public String eventToString() {
            return new StringBuilder("rec ").append(
                        mRecEvent == AudioManager.RECORD_CONFIG_EVENT_START ? "start" : "stop ")
                    .append(" uid:").append(mClientUid)
                    .append(" session:").append(mSession)
                    .append(" src:").append(MediaRecorder.toLogFriendlyAudioSource(mSource))
                    .append(mPackName == null ? "" : " pack:" + mPackName).toString();
        }
    }

    private static final AudioEventLogger sEventLogger = new AudioEventLogger(50,
            "recording activity as reported through AudioSystem.AudioRecordingCallback");
}