summaryrefslogtreecommitdiff
path: root/android
diff options
context:
space:
mode:
Diffstat (limited to 'android')
-rw-r--r--android/AndroidManifest.xml11
-rw-r--r--android/src/org/rockbox/Helper/MediaButtonReceiver.java164
-rw-r--r--android/src/org/rockbox/RockboxFramebuffer.java11
-rw-r--r--android/src/org/rockbox/RockboxService.java2
4 files changed, 188 insertions, 0 deletions
diff --git a/android/AndroidManifest.xml b/android/AndroidManifest.xml
index c52d83fd2c..06a13ddb40 100644
--- a/android/AndroidManifest.xml
+++ b/android/AndroidManifest.xml
@@ -16,10 +16,21 @@
16 </intent-filter> 16 </intent-filter>
17 </activity> 17 </activity>
18 <service android:name=".RockboxService"/> 18 <service android:name=".RockboxService"/>
19 <receiver android:name=".Helper.MediaButtonReceiver$MediaReceiver"
20 android:enabled="true"
21 android:exported="true">
22 <intent-filter>
23 <action android:name="android.intent.action.MEDIA_BUTTON" />
24 </intent-filter>
25 </receiver>
19 26
20 <activity android:name="KeyboardActivity"></activity> 27 <activity android:name="KeyboardActivity"></activity>
21 <activity android:name="YesnoActivity"></activity> 28 <activity android:name="YesnoActivity"></activity>
22</application> 29</application>
23<uses-sdk android:minSdkVersion="4" /> 30<uses-sdk android:minSdkVersion="4" />
24<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission> 31<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
32
33
34
35
25</manifest> 36</manifest>
diff --git a/android/src/org/rockbox/Helper/MediaButtonReceiver.java b/android/src/org/rockbox/Helper/MediaButtonReceiver.java
new file mode 100644
index 0000000000..3749cec32a
--- /dev/null
+++ b/android/src/org/rockbox/Helper/MediaButtonReceiver.java
@@ -0,0 +1,164 @@
1/***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 * $Id$
9 *
10 * Copyright (C) 2010 Thomas Martitz
11 *
12 * This program is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU General Public License
14 * as published by the Free Software Foundation; either version 2
15 * of the License, or (at your option) any later version.
16 *
17 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
18 * KIND, either express or implied.
19 *
20 ****************************************************************************/
21
22package org.rockbox.Helper;
23
24import java.lang.reflect.Method;
25
26import org.rockbox.RockboxService;
27
28import android.content.BroadcastReceiver;
29import android.content.ComponentName;
30import android.content.Context;
31import android.content.Intent;
32import android.content.IntentFilter;
33import android.media.AudioManager;
34import android.view.KeyEvent;
35
36public class MediaButtonReceiver
37{
38 /* A note on the API being used. 2.2 introduces a new and sane API
39 * for handling multimedia button presses
40 * http://android-developers.blogspot.com/2010/06/allowing-applications-to-play-nicer.html
41 *
42 * the old API is flawed. It doesn't have management for
43 * concurrent media apps
44 *
45 * if multiple media apps are running
46 * probably all of them want to respond to media keys
47 *
48 * it's not clear which app wins, it depends on the
49 * priority set for the IntentFilter (see below)
50 *
51 * so this all might or might not work on < 2.2 */
52
53 IMultiMediaReceiver api;
54
55 public MediaButtonReceiver(Context c)
56 {
57 try {
58 api = new NewApi(c);
59 } catch (Exception e) {
60 api = new OldApi(c);
61 }
62 }
63
64 public void register()
65 {
66 api.register();
67 }
68
69 public void unregister()
70 {
71 api.register();
72 }
73
74 /* helper class for the manifest */
75 public static class MediaReceiver extends BroadcastReceiver
76 {
77 @Override
78 public void onReceive(Context context, Intent intent)
79 {
80 if (Intent.ACTION_MEDIA_BUTTON.equals(intent.getAction()))
81 {
82 KeyEvent key = (KeyEvent)intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT);
83 if (key.getAction() == KeyEvent.ACTION_UP)
84 { /* pass the pressed key to Rockbox */
85 if (RockboxService.get_instance().get_fb().dispatchKeyEvent(key))
86 abortBroadcast();
87 }
88 }
89 }
90 }
91
92 private interface IMultiMediaReceiver
93 {
94 void register();
95 void unregister();
96 }
97
98 private static class NewApi implements IMultiMediaReceiver
99 {
100 private Method register_method;
101 private Method unregister_method;
102 private AudioManager audio_manager;
103 private ComponentName receiver_name;
104 /* the constructor gets the methods through reflection so that
105 * this compiles on pre-2.2 devices */
106 NewApi(Context c) throws SecurityException, NoSuchMethodException
107 {
108 register_method = AudioManager.class.getMethod(
109 "registerMediaButtonEventReceiver",
110 new Class[] { ComponentName.class } );
111 unregister_method = AudioManager.class.getMethod(
112 "unregisterMediaButtonEventReceiver",
113 new Class[] { ComponentName.class } );
114
115 audio_manager = (AudioManager)c.getSystemService(Context.AUDIO_SERVICE);
116 receiver_name = new ComponentName(c, MediaReceiver.class);
117 }
118 public void register()
119 {
120 try {
121 register_method.invoke(audio_manager, receiver_name);
122 } catch (Exception e) {
123 // Nothing
124 e.printStackTrace();
125 }
126 }
127
128 public void unregister()
129 {
130 try
131 {
132 unregister_method.invoke(audio_manager, receiver_name);
133 } catch (Exception e) {
134 // Nothing
135 e.printStackTrace();
136 }
137 }
138
139 }
140
141 private static class OldApi implements IMultiMediaReceiver
142 {
143 private static final IntentFilter filter = new IntentFilter(Intent.ACTION_MEDIA_BUTTON);
144 private MediaReceiver receiver;
145 private Context context;
146 OldApi(Context c)
147 {
148 filter.setPriority(1); /* 1 higher than the built-in media player */
149 receiver = new MediaReceiver();
150 context = c;
151 }
152
153 public void register()
154 {
155 context.registerReceiver(receiver, filter);
156 }
157
158 public void unregister()
159 {
160 context.unregisterReceiver(receiver);
161 }
162
163 }
164}
diff --git a/android/src/org/rockbox/RockboxFramebuffer.java b/android/src/org/rockbox/RockboxFramebuffer.java
index 0daeffe265..84974d627a 100644
--- a/android/src/org/rockbox/RockboxFramebuffer.java
+++ b/android/src/org/rockbox/RockboxFramebuffer.java
@@ -23,6 +23,8 @@ package org.rockbox;
23 23
24import java.nio.ByteBuffer; 24import java.nio.ByteBuffer;
25 25
26import org.rockbox.Helper.MediaButtonReceiver;
27
26import android.content.Context; 28import android.content.Context;
27import android.graphics.Bitmap; 29import android.graphics.Bitmap;
28import android.graphics.Canvas; 30import android.graphics.Canvas;
@@ -35,6 +37,7 @@ public class RockboxFramebuffer extends View
35{ 37{
36 private Bitmap btm; 38 private Bitmap btm;
37 private ByteBuffer native_buf; 39 private ByteBuffer native_buf;
40 private MediaButtonReceiver media_monitor;
38 41
39 public RockboxFramebuffer(Context c, int lcd_width, 42 public RockboxFramebuffer(Context c, int lcd_width,
40 int lcd_height, ByteBuffer native_fb) 43 int lcd_height, ByteBuffer native_fb)
@@ -47,6 +50,8 @@ public class RockboxFramebuffer extends View
47 btm = Bitmap.createBitmap(lcd_width, lcd_height, Bitmap.Config.RGB_565); 50 btm = Bitmap.createBitmap(lcd_width, lcd_height, Bitmap.Config.RGB_565);
48 native_buf = native_fb; 51 native_buf = native_fb;
49 requestFocus(); 52 requestFocus();
53 media_monitor = new MediaButtonReceiver(c);
54 media_monitor.register();
50 /* the service needs to know the about us */ 55 /* the service needs to know the about us */
51 ((RockboxService)c).set_fb(this); 56 ((RockboxService)c).set_fb(this);
52 } 57 }
@@ -122,6 +127,12 @@ public class RockboxFramebuffer extends View
122 set_lcd_active(1); 127 set_lcd_active(1);
123 } 128 }
124 129
130 public void destroy()
131 {
132 suspend();
133 media_monitor.unregister();
134 }
135
125 public native void set_lcd_active(int active); 136 public native void set_lcd_active(int active);
126 public native void touchHandler(boolean down, int x, int y); 137 public native void touchHandler(boolean down, int x, int y);
127 public native boolean buttonHandler(int keycode, boolean state); 138 public native boolean buttonHandler(int keycode, boolean state);
diff --git a/android/src/org/rockbox/RockboxService.java b/android/src/org/rockbox/RockboxService.java
index b841bc5d7f..8989271b9f 100644
--- a/android/src/org/rockbox/RockboxService.java
+++ b/android/src/org/rockbox/RockboxService.java
@@ -139,6 +139,7 @@ public class RockboxService extends Service
139 { 139 {
140 public void run() 140 public void run()
141 { 141 {
142 LOG("main");
142 /* the following block unzips libmisc.so, which contains the files 143 /* the following block unzips libmisc.so, which contains the files
143 * we ship, such as themes. It's needed to put it into a .so file 144 * we ship, such as themes. It's needed to put it into a .so file
144 * because there's no other way to ship files and have access 145 * because there's no other way to ship files and have access
@@ -276,6 +277,7 @@ public class RockboxService extends Service
276 public void onDestroy() 277 public void onDestroy()
277 { 278 {
278 super.onDestroy(); 279 super.onDestroy();
280 fb.destroy();
279 /* Make sure our notification is gone. */ 281 /* Make sure our notification is gone. */
280 stopForeground(); 282 stopForeground();
281 } 283 }