diff --git a/services/java/com/android/server/HeadsetObserver.java b/services/java/com/android/server/HeadsetObserver.java index c9066bedd96bd..3fc1e0ea58794 100644 --- a/services/java/com/android/server/HeadsetObserver.java +++ b/services/java/com/android/server/HeadsetObserver.java @@ -21,6 +21,8 @@ import android.content.Context; import android.content.Intent; import android.os.Handler; import android.os.Message; +import android.os.PowerManager; +import android.os.PowerManager.WakeLock; import android.os.UEventObserver; import android.util.Log; import android.media.AudioManager; @@ -38,15 +40,19 @@ class HeadsetObserver extends UEventObserver { private static final String HEADSET_STATE_PATH = "/sys/class/switch/h2w/state"; private static final String HEADSET_NAME_PATH = "/sys/class/switch/h2w/name"; - private Context mContext; - private int mHeadsetState; private String mHeadsetName; private boolean mAudioRouteNeedsUpdate; private AudioManager mAudioManager; + private final Context mContext; + private final WakeLock mWakeLock; // held while there is a pending route change + public HeadsetObserver(Context context) { mContext = context; + PowerManager pm = (PowerManager)context.getSystemService(Context.POWER_SERVICE); + mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "HeadsetObserver"); + mWakeLock.setReferenceCounted(false); startObserving(HEADSET_UEVENT_MATCH); @@ -103,6 +109,7 @@ class HeadsetObserver extends UEventObserver { // immediate, so delay the route change by 1000ms. // This could be improved once the audio sub-system provides an // interface to clear the audio pipeline. + mWakeLock.acquire(); mHandler.sendEmptyMessageDelayed(0, 1000); } else { updateAudioRoute(); @@ -138,7 +145,8 @@ class HeadsetObserver extends UEventObserver { @Override public void handleMessage(Message msg) { updateAudioRoute(); + mWakeLock.release(); } - }; + }; }