eclair snapshot

This commit is contained in:
Jean-Baptiste Queru
2009-11-12 18:45:53 -08:00
parent 6c63ee4fc4
commit 9db3d07b96
3587 changed files with 991748 additions and 69172 deletions

View File

@@ -41,10 +41,16 @@ 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 static final int BIT_HEADSET = (1 << 0);
private static final int BIT_HEADSET_NO_MIC = (1 << 1);
private static final int BIT_TTY = (1 << 2);
private static final int BIT_FM_HEADSET = (1 << 3);
private static final int BIT_FM_SPEAKER = (1 << 4);
private int mHeadsetState;
private int mPrevHeadsetState;
private String mHeadsetName;
private boolean mAudioRouteNeedsUpdate;
private AudioManager mAudioManager;
private boolean mPendingIntent;
private final Context mContext;
private final WakeLock mWakeLock; // held while there is a pending route change
@@ -76,6 +82,7 @@ class HeadsetObserver extends UEventObserver {
String newName = mHeadsetName;
int newState = mHeadsetState;
mPrevHeadsetState = mHeadsetState;
try {
FileReader file = new FileReader(HEADSET_STATE_PATH);
int len = file.read(buffer, 0, 1024);
@@ -91,20 +98,25 @@ class HeadsetObserver extends UEventObserver {
Log.e(TAG, "" , e);
}
mAudioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);
update(newName, newState);
}
private synchronized final void update(String newName, int newState) {
if (newName != mHeadsetName || newState != mHeadsetState) {
boolean isUnplug = (newState == 0 && mHeadsetState == 1);
boolean isUnplug = false;
if ( (mHeadsetState & BIT_HEADSET) > 0 || (mHeadsetState & BIT_HEADSET_NO_MIC) > 0) {
if ((newState & BIT_HEADSET) == 0 && (newState & BIT_HEADSET_NO_MIC) == 0)
isUnplug = true;
}
mHeadsetName = newName;
mPrevHeadsetState = mHeadsetState;
mHeadsetState = newState;
mAudioRouteNeedsUpdate = true;
sendIntent(isUnplug);
mPendingIntent = true;
if (isUnplug) {
Intent intent = new Intent(AudioManager.ACTION_AUDIO_BECOMING_NOISY);
mContext.sendBroadcast(intent);
// It can take hundreds of ms flush the audio pipeline after
// apps pause audio playback, but audio route changes are
// immediate, so delay the route change by 1000ms.
@@ -113,12 +125,13 @@ class HeadsetObserver extends UEventObserver {
mWakeLock.acquire();
mHandler.sendEmptyMessageDelayed(0, 1000);
} else {
updateAudioRoute();
sendIntent();
mPendingIntent = false;
}
}
}
private synchronized final void sendIntent(boolean isUnplug) {
private synchronized final void sendIntent() {
// Pack up the values and broadcast them to everyone
Intent intent = new Intent(Intent.ACTION_HEADSET_PLUG);
intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY);
@@ -128,24 +141,15 @@ class HeadsetObserver extends UEventObserver {
// TODO: Should we require a permission?
ActivityManagerNative.broadcastStickyIntent(intent, null);
if (isUnplug) {
intent = new Intent(AudioManager.ACTION_AUDIO_BECOMING_NOISY);
mContext.sendBroadcast(intent);
}
}
private synchronized final void updateAudioRoute() {
if (mAudioRouteNeedsUpdate) {
mAudioManager.setWiredHeadsetOn(mHeadsetState == 1);
mAudioRouteNeedsUpdate = false;
}
}
private final Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
updateAudioRoute();
if (mPendingIntent) {
sendIntent();
mPendingIntent = false;
}
mWakeLock.release();
}
};