diff options
Diffstat (limited to 'android')
-rw-r--r-- | android/AndroidManifest.xml | 11 | ||||
-rw-r--r-- | android/src/org/rockbox/Helper/MediaButtonReceiver.java | 164 | ||||
-rw-r--r-- | android/src/org/rockbox/RockboxFramebuffer.java | 11 | ||||
-rw-r--r-- | android/src/org/rockbox/RockboxService.java | 2 |
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 | |||
22 | package org.rockbox.Helper; | ||
23 | |||
24 | import java.lang.reflect.Method; | ||
25 | |||
26 | import org.rockbox.RockboxService; | ||
27 | |||
28 | import android.content.BroadcastReceiver; | ||
29 | import android.content.ComponentName; | ||
30 | import android.content.Context; | ||
31 | import android.content.Intent; | ||
32 | import android.content.IntentFilter; | ||
33 | import android.media.AudioManager; | ||
34 | import android.view.KeyEvent; | ||
35 | |||
36 | public 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 | ||
24 | import java.nio.ByteBuffer; | 24 | import java.nio.ByteBuffer; |
25 | 25 | ||
26 | import org.rockbox.Helper.MediaButtonReceiver; | ||
27 | |||
26 | import android.content.Context; | 28 | import android.content.Context; |
27 | import android.graphics.Bitmap; | 29 | import android.graphics.Bitmap; |
28 | import android.graphics.Canvas; | 30 | import 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 | } |