diff options
-rw-r--r-- | android/src/org/rockbox/Helper/MediaButtonReceiver.java | 46 | ||||
-rw-r--r-- | android/src/org/rockbox/RockboxService.java | 5 |
2 files changed, 32 insertions, 19 deletions
diff --git a/android/src/org/rockbox/Helper/MediaButtonReceiver.java b/android/src/org/rockbox/Helper/MediaButtonReceiver.java index a57bdd4831..eebdbb985b 100644 --- a/android/src/org/rockbox/Helper/MediaButtonReceiver.java +++ b/android/src/org/rockbox/Helper/MediaButtonReceiver.java | |||
@@ -21,7 +21,6 @@ | |||
21 | 21 | ||
22 | package org.rockbox.Helper; | 22 | package org.rockbox.Helper; |
23 | 23 | ||
24 | import java.lang.reflect.Method; | ||
25 | import org.rockbox.RockboxFramebuffer; | 24 | import org.rockbox.RockboxFramebuffer; |
26 | import org.rockbox.RockboxService; | 25 | import org.rockbox.RockboxService; |
27 | import android.content.BroadcastReceiver; | 26 | import android.content.BroadcastReceiver; |
@@ -30,6 +29,7 @@ import android.content.Context; | |||
30 | import android.content.Intent; | 29 | import android.content.Intent; |
31 | import android.content.IntentFilter; | 30 | import android.content.IntentFilter; |
32 | import android.media.AudioManager; | 31 | import android.media.AudioManager; |
32 | import android.util.Log; | ||
33 | import android.view.KeyEvent; | 33 | import android.view.KeyEvent; |
34 | 34 | ||
35 | public class MediaButtonReceiver | 35 | public class MediaButtonReceiver |
@@ -55,7 +55,9 @@ public class MediaButtonReceiver | |||
55 | { | 55 | { |
56 | try { | 56 | try { |
57 | api = new NewApi(c); | 57 | api = new NewApi(c); |
58 | } catch (Exception e) { | 58 | } catch (Throwable t) { |
59 | /* Throwable includes Exception and the expected | ||
60 | * NoClassDefFoundError */ | ||
59 | api = new OldApi(c); | 61 | api = new OldApi(c); |
60 | } | 62 | } |
61 | } | 63 | } |
@@ -102,46 +104,54 @@ public class MediaButtonReceiver | |||
102 | void unregister(); | 104 | void unregister(); |
103 | } | 105 | } |
104 | 106 | ||
105 | private static class NewApi implements IMultiMediaReceiver | 107 | private static class NewApi |
108 | implements IMultiMediaReceiver, AudioManager.OnAudioFocusChangeListener | ||
106 | { | 109 | { |
107 | private Method register_method; | ||
108 | private Method unregister_method; | ||
109 | private AudioManager audio_manager; | 110 | private AudioManager audio_manager; |
110 | private ComponentName receiver_name; | 111 | private ComponentName receiver_name; |
111 | /* the constructor gets the methods through reflection so that | 112 | private boolean running = false; |
112 | * this compiles on pre-2.2 devices */ | 113 | |
113 | NewApi(Context c) throws SecurityException, NoSuchMethodException | 114 | NewApi(Context c) |
114 | { | 115 | { |
115 | register_method = AudioManager.class.getMethod( | ||
116 | "registerMediaButtonEventReceiver", | ||
117 | new Class[] { ComponentName.class } ); | ||
118 | unregister_method = AudioManager.class.getMethod( | ||
119 | "unregisterMediaButtonEventReceiver", | ||
120 | new Class[] { ComponentName.class } ); | ||
121 | |||
122 | audio_manager = (AudioManager)c.getSystemService(Context.AUDIO_SERVICE); | 116 | audio_manager = (AudioManager)c.getSystemService(Context.AUDIO_SERVICE); |
123 | receiver_name = new ComponentName(c, MediaReceiver.class); | 117 | receiver_name = new ComponentName(c, MediaReceiver.class); |
124 | } | 118 | } |
119 | |||
125 | public void register() | 120 | public void register() |
126 | { | 121 | { |
127 | try { | 122 | try { |
128 | register_method.invoke(audio_manager, receiver_name); | 123 | audio_manager.registerMediaButtonEventReceiver(receiver_name); |
124 | audio_manager.requestAudioFocus(this, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN); | ||
125 | running = true; | ||
129 | } catch (Exception e) { | 126 | } catch (Exception e) { |
130 | // Nothing | 127 | // Nothing |
131 | e.printStackTrace(); | 128 | e.printStackTrace(); |
132 | } | 129 | } |
133 | } | 130 | } |
134 | 131 | ||
135 | public void unregister() | 132 | public void unregister() |
136 | { | 133 | { |
137 | try | 134 | try |
138 | { | 135 | { |
139 | unregister_method.invoke(audio_manager, receiver_name); | 136 | audio_manager.unregisterMediaButtonEventReceiver(receiver_name); |
137 | audio_manager.abandonAudioFocus(this); | ||
138 | running = false; | ||
140 | } catch (Exception e) { | 139 | } catch (Exception e) { |
141 | // Nothing | 140 | // Nothing |
142 | e.printStackTrace(); | 141 | e.printStackTrace(); |
143 | } | 142 | } |
144 | } | 143 | } |
144 | |||
145 | public void onAudioFocusChange(int focusChange) | ||
146 | { | ||
147 | Log.d("Rockbox", "Audio focus" + ((focusChange>0)?"gained":"lost")+ | ||
148 | ": "+ focusChange); | ||
149 | if (running) | ||
150 | { /* Play nice and stop for the the other app */ | ||
151 | if (focusChange == AudioManager.AUDIOFOCUS_LOSS) | ||
152 | RockboxFramebuffer.buttonHandler(KeyEvent.KEYCODE_MEDIA_STOP, false); | ||
153 | } | ||
154 | } | ||
145 | 155 | ||
146 | } | 156 | } |
147 | 157 | ||
diff --git a/android/src/org/rockbox/RockboxService.java b/android/src/org/rockbox/RockboxService.java index 3aeffa21ff..346e4a189c 100644 --- a/android/src/org/rockbox/RockboxService.java +++ b/android/src/org/rockbox/RockboxService.java | |||
@@ -353,7 +353,10 @@ public class RockboxService extends Service | |||
353 | public void onDestroy() | 353 | public void onDestroy() |
354 | { | 354 | { |
355 | super.onDestroy(); | 355 | super.onDestroy(); |
356 | mMediaButtonReceiver.unregister(); | 356 | /* Don't unregister so we can receive them (and startup the service) |
357 | * after idle poweroff. Hopefully it's ok if mMediaButtonReceiver is | ||
358 | * garbage collected. | ||
359 | * mMediaButtonReceiver.unregister(); */ | ||
357 | mMediaButtonReceiver = null; | 360 | mMediaButtonReceiver = null; |
358 | /* Make sure our notification is gone. */ | 361 | /* Make sure our notification is gone. */ |
359 | stopForeground(); | 362 | stopForeground(); |