summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--android/src/org/rockbox/Helper/MediaButtonReceiver.java46
-rw-r--r--android/src/org/rockbox/RockboxService.java5
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
22package org.rockbox.Helper; 22package org.rockbox.Helper;
23 23
24import java.lang.reflect.Method;
25import org.rockbox.RockboxFramebuffer; 24import org.rockbox.RockboxFramebuffer;
26import org.rockbox.RockboxService; 25import org.rockbox.RockboxService;
27import android.content.BroadcastReceiver; 26import android.content.BroadcastReceiver;
@@ -30,6 +29,7 @@ import android.content.Context;
30import android.content.Intent; 29import android.content.Intent;
31import android.content.IntentFilter; 30import android.content.IntentFilter;
32import android.media.AudioManager; 31import android.media.AudioManager;
32import android.util.Log;
33import android.view.KeyEvent; 33import android.view.KeyEvent;
34 34
35public class MediaButtonReceiver 35public 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();