Move all of the media button handling code into PlaybackService

Also disable MediaButtonReceiver when it is not needed
This commit is contained in:
Christopher Eby 2010-04-23 12:13:15 -05:00
parent 53eb34ec84
commit e49fde46cd
2 changed files with 51 additions and 21 deletions

View File

@ -21,24 +21,17 @@ package org.kreed.vanilla;
import android.content.Context;
import android.content.Intent;
import android.content.BroadcastReceiver;
import android.content.SharedPreferences;
import android.preference.PreferenceManager;
import android.telephony.TelephonyManager;
public class MediaButtonReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent)
{
if (Intent.ACTION_MEDIA_BUTTON.equals(intent.getAction())) {
SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(context);
if (settings.getBoolean("media_button", true)) {
TelephonyManager telephonyManager = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);
if (telephonyManager.getCallState() == TelephonyManager.CALL_STATE_IDLE) {
intent.setClass(context, PlaybackService.class);
context.startService(intent);
abortBroadcast();
}
if (!intent.getBooleanExtra("org.kreed.vanilla.resent", false)) {
intent.setClass(context, PlaybackService.class);
context.startService(intent);
abortBroadcast();
}
}
}
}
}

View File

@ -31,11 +31,13 @@ import android.app.Notification;
import android.app.NotificationManager;
import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.database.ContentObserver;
import android.media.AudioManager;
import android.media.MediaPlayer;
@ -82,6 +84,7 @@ public final class PlaybackService extends Service implements Handler.Callback,
boolean mHeadsetOnly;
private boolean mScrobble;
private int mNotificationMode;
private byte mHeadsetControls = -1;
private Looper mLooper;
private Handler mHandler;
@ -161,12 +164,22 @@ public final class PlaybackService extends Service implements Handler.Callback,
}
if (delta != -10) {
if (!mLoaded)
boolean showLoading = !mLoaded;
if (delta == 10 && !handleMediaKey((KeyEvent)intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT))) {
// We aborted this broadcast in MediaButtonReceiver.
// Since we did not handle it, we should pass it on
// to others.
intent.setComponent(null);
intent.putExtra("org.kreed.vanilla.resent", true);
sendOrderedBroadcast(intent, null);
showLoading = false;
}
if (showLoading)
Toast.makeText(this, R.string.starting, Toast.LENGTH_SHORT).show();
if (delta == 10)
handleMediaKey((KeyEvent)intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT));
else
if (delta != 10)
go(delta, false);
}
}
@ -196,6 +209,10 @@ public final class PlaybackService extends Service implements Handler.Callback,
// we haven't registered the receiver yet
}
// Renable the external receiver
PackageManager manager = getPackageManager();
manager.setComponentEnabledSetting(new ComponentName(this, MediaButtonReceiver.class), PackageManager.COMPONENT_ENABLED_STATE_DEFAULT, PackageManager.DONT_KILL_APP);
if (mWakeLock != null && mWakeLock.isHeld())
mWakeLock.release();
}
@ -260,9 +277,9 @@ public final class PlaybackService extends Service implements Handler.Callback,
}
}
mSettings = PreferenceManager.getDefaultSharedPreferences(this);
if (mSettings == null)
mSettings = PreferenceManager.getDefaultSharedPreferences(this);
mSettings.registerOnSharedPreferenceChangeListener(this);
mHeadsetPause = mSettings.getBoolean("headset_pause", true);
mHeadsetOnly = mSettings.getBoolean("headset_only", false);
mNotificationMode = Integer.parseInt(mSettings.getString("notification_mode", "1"));
mScrobble = mSettings.getBoolean("scrobble", false);
@ -307,6 +324,7 @@ public final class PlaybackService extends Service implements Handler.Callback,
}
}
} else if ("media_button".equals(key)) {
mHeadsetControls = (byte)(mSettings.getBoolean("media_button", true) ? 1 : 0);
setupReceiver();
}
}
@ -659,9 +677,22 @@ public final class PlaybackService extends Service implements Handler.Callback,
}
}
/**
* Return whether headset controls should be used, loading the preference
* if necessary.
*/
private boolean useHeadsetControls()
{
if (mSettings == null)
mSettings = PreferenceManager.getDefaultSharedPreferences(this);
if (mHeadsetControls == -1)
mHeadsetControls = (byte)(mSettings.getBoolean("media_button", true) ? 1 : 0);
return mHeadsetControls == 1;
}
boolean handleMediaKey(KeyEvent event)
{
if (mInCall)
if (mInCall || !useHeadsetControls())
return false;
int action = event.getAction();
@ -778,7 +809,7 @@ public final class PlaybackService extends Service implements Handler.Callback,
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_HEADSET_PLUG);
if (mSettings.getBoolean("media_button", true))
if (useHeadsetControls())
filter.addAction(Intent.ACTION_MEDIA_BUTTON);
filter.setPriority(2000);
registerReceiver(mReceiver, filter);
@ -845,8 +876,14 @@ public final class PlaybackService extends Service implements Handler.Callback,
initialize();
break;
case POST_CREATE:
mHeadsetPause = mSettings.getBoolean("headset_pause", true);
setupReceiver();
// Don't receive broadcasts through the external receiver now that
// we get them in the Service's receiver
PackageManager manager = getPackageManager();
manager.setComponentEnabledSetting(new ComponentName(this, MediaButtonReceiver.class), PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);
mCallListener = new InCallListener();
TelephonyManager telephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
telephonyManager.listen(mCallListener, PhoneStateListener.LISTEN_CALL_STATE);