From e49fde46cdd09771b8041b0f4c796fd882e0283f Mon Sep 17 00:00:00 2001 From: Christopher Eby Date: Fri, 23 Apr 2010 12:13:15 -0500 Subject: [PATCH] Move all of the media button handling code into PlaybackService Also disable MediaButtonReceiver when it is not needed --- .../kreed/vanilla/MediaButtonReceiver.java | 17 ++---- src/org/kreed/vanilla/PlaybackService.java | 55 ++++++++++++++++--- 2 files changed, 51 insertions(+), 21 deletions(-) diff --git a/src/org/kreed/vanilla/MediaButtonReceiver.java b/src/org/kreed/vanilla/MediaButtonReceiver.java index 4676b1ba..d420f0f3 100644 --- a/src/org/kreed/vanilla/MediaButtonReceiver.java +++ b/src/org/kreed/vanilla/MediaButtonReceiver.java @@ -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(); } } } -} \ No newline at end of file +} diff --git a/src/org/kreed/vanilla/PlaybackService.java b/src/org/kreed/vanilla/PlaybackService.java index 8f47b01a..c1a058bb 100644 --- a/src/org/kreed/vanilla/PlaybackService.java +++ b/src/org/kreed/vanilla/PlaybackService.java @@ -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);