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

Commit 6dbaaf2d authored by Kyeongkab.Nam's avatar Kyeongkab.Nam
Browse files

Fix a lock issue in AudioPortEventHandler

It used "this" as a lock object to guard mListeners. but "this" is
pointing to mHandler in handler thread.
This causes the IndexOutOfBoundsException.

bug: 138951761
Test: manual
Change-Id: I826c7c68ecff4fc0d39addd3d56bc989e00848bc
parent cebe8f98
Loading
Loading
Loading
Loading
+11 −6
Original line number Diff line number Diff line
@@ -19,10 +19,12 @@ package android.media;
import android.annotation.UnsupportedAppUsage;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Looper;
import android.os.Message;
import java.util.ArrayList;

import com.android.internal.annotations.GuardedBy;

import java.lang.ref.WeakReference;
import java.util.ArrayList;

/**
 * The AudioPortEventHandler handles AudioManager.OnAudioPortUpdateListener callbacks
@@ -33,6 +35,9 @@ import java.lang.ref.WeakReference;
class AudioPortEventHandler {
    private Handler mHandler;
    private HandlerThread mHandlerThread;
    private final Object mLock = new Object();

    @GuardedBy("mLock")
    private final ArrayList<AudioManager.OnAudioPortUpdateListener> mListeners =
            new ArrayList<AudioManager.OnAudioPortUpdateListener>();

@@ -53,7 +58,7 @@ class AudioPortEventHandler {
    private long mJniCallback;

    void init() {
        synchronized (this) {
        synchronized (mLock) {
            if (mHandler != null) {
                return;
            }
@@ -66,7 +71,7 @@ class AudioPortEventHandler {
                    @Override
                    public void handleMessage(Message msg) {
                        ArrayList<AudioManager.OnAudioPortUpdateListener> listeners;
                        synchronized (this) {
                        synchronized (mLock) {
                            if (msg.what == AUDIOPORT_EVENT_NEW_LISTENER) {
                                listeners = new ArrayList<AudioManager.OnAudioPortUpdateListener>();
                                if (mListeners.contains(msg.obj)) {
@@ -152,7 +157,7 @@ class AudioPortEventHandler {
    private native void native_finalize();

    void registerListener(AudioManager.OnAudioPortUpdateListener l) {
        synchronized (this) {
        synchronized (mLock) {
            mListeners.add(l);
        }
        if (mHandler != null) {
@@ -162,7 +167,7 @@ class AudioPortEventHandler {
    }

    void unregisterListener(AudioManager.OnAudioPortUpdateListener l) {
        synchronized (this) {
        synchronized (mLock) {
            mListeners.remove(l);
        }
    }