diff options
-rw-r--r-- | android/src/org/rockbox/monitors/HeadphoneMonitor.java | 7 | ||||
-rw-r--r-- | firmware/target/hosted/android/button-android.c | 32 | ||||
-rw-r--r-- | firmware/target/hosted/android/kernel-android.c | 8 |
3 files changed, 29 insertions, 18 deletions
diff --git a/android/src/org/rockbox/monitors/HeadphoneMonitor.java b/android/src/org/rockbox/monitors/HeadphoneMonitor.java index 99d2f7ab8a..72a2f262f2 100644 --- a/android/src/org/rockbox/monitors/HeadphoneMonitor.java +++ b/android/src/org/rockbox/monitors/HeadphoneMonitor.java | |||
@@ -29,7 +29,6 @@ import android.content.IntentFilter; | |||
29 | public class HeadphoneMonitor extends BroadcastReceiver | 29 | public class HeadphoneMonitor extends BroadcastReceiver |
30 | { | 30 | { |
31 | @SuppressWarnings("unused") | 31 | @SuppressWarnings("unused") |
32 | private int mHpState; /* read by native code */ | ||
33 | 32 | ||
34 | public HeadphoneMonitor(Context c) | 33 | public HeadphoneMonitor(Context c) |
35 | { | 34 | { |
@@ -45,7 +44,7 @@ public class HeadphoneMonitor extends BroadcastReceiver | |||
45 | public void onReceive(Context arg0, Intent intent) | 44 | public void onReceive(Context arg0, Intent intent) |
46 | { | 45 | { |
47 | int state = intent.getIntExtra("state", -1); | 46 | int state = intent.getIntExtra("state", -1); |
48 | mHpState = state; | 47 | postHpStateChanged(state); |
49 | } | 48 | } |
50 | 49 | ||
51 | /* audio becoming noise acts as headphones extracted */ | 50 | /* audio becoming noise acts as headphones extracted */ |
@@ -54,7 +53,9 @@ public class HeadphoneMonitor extends BroadcastReceiver | |||
54 | @Override | 53 | @Override |
55 | public void onReceive(Context arg0, Intent arg1) | 54 | public void onReceive(Context arg0, Intent arg1) |
56 | { | 55 | { |
57 | mHpState = 0; | 56 | postHpStateChanged(0); |
58 | } | 57 | } |
59 | } | 58 | } |
59 | |||
60 | private synchronized native void postHpStateChanged(int state); | ||
60 | } | 61 | } |
diff --git a/firmware/target/hosted/android/button-android.c b/firmware/target/hosted/android/button-android.c index c913a3d7f7..6751effd1b 100644 --- a/firmware/target/hosted/android/button-android.c +++ b/firmware/target/hosted/android/button-android.c | |||
@@ -34,8 +34,6 @@ extern JNIEnv *env_ptr; | |||
34 | extern jclass RockboxService_class; | 34 | extern jclass RockboxService_class; |
35 | extern jobject RockboxService_instance; | 35 | extern jobject RockboxService_instance; |
36 | 36 | ||
37 | static jobject HeadphoneMonitor_instance; | ||
38 | static jfieldID headphone_state; | ||
39 | static int last_y, last_x; | 37 | static int last_y, last_x; |
40 | static int last_btns; | 38 | static int last_btns; |
41 | 39 | ||
@@ -120,13 +118,9 @@ void button_init_device(void) | |||
120 | jmethodID constructor = e->GetMethodID(env_ptr, class, | 118 | jmethodID constructor = e->GetMethodID(env_ptr, class, |
121 | "<init>", | 119 | "<init>", |
122 | "(Landroid/content/Context;)V"); | 120 | "(Landroid/content/Context;)V"); |
123 | HeadphoneMonitor_instance = e->NewObject(env_ptr, class, | 121 | e->NewObject(env_ptr, class, |
124 | constructor, | 122 | constructor, |
125 | RockboxService_instance); | 123 | RockboxService_instance); |
126 | /* cache the battery level field id */ | ||
127 | headphone_state = (*env_ptr)->GetFieldID(env_ptr, | ||
128 | class, | ||
129 | "mHpState", "I"); | ||
130 | } | 124 | } |
131 | 125 | ||
132 | int button_read_device(int *data) | 126 | int button_read_device(int *data) |
@@ -145,13 +139,23 @@ int button_read_device(int *data) | |||
145 | return btn; | 139 | return btn; |
146 | } | 140 | } |
147 | 141 | ||
148 | 142 | static int hp_state; | |
149 | /* Tell if anything is in the jack. */ | 143 | JNIEXPORT void JNICALL |
144 | Java_org_rockbox_monitors_HeadphoneMonitor_postCallHungUp(JNIEnv *env, | ||
145 | jobject this, | ||
146 | jint state) | ||
147 | { | ||
148 | (void)env; (void)this; | ||
149 | hp_state = state; | ||
150 | } | ||
151 | /* Tell if anything is in the jack. | ||
152 | * | ||
153 | * since this is called from the tick task, which isn't attached to | ||
154 | * the dalvik VM, it's not permitted to make JNI calls (therefore | ||
155 | * we need the above callback) */ | ||
150 | bool headphones_inserted(void) | 156 | bool headphones_inserted(void) |
151 | { | 157 | { |
152 | int state = (*env_ptr)->GetIntField(env_ptr, HeadphoneMonitor_instance, | ||
153 | headphone_state); | ||
154 | /* 0 is disconnected, 1 and 2 are connected */ | 158 | /* 0 is disconnected, 1 and 2 are connected */ |
155 | return (state == 0) ? false : true; | 159 | return (hp_state == 0) ? false : true; |
156 | } | 160 | } |
157 | 161 | ||
diff --git a/firmware/target/hosted/android/kernel-android.c b/firmware/target/hosted/android/kernel-android.c index 80ff88fd12..e3522418fe 100644 --- a/firmware/target/hosted/android/kernel-android.c +++ b/firmware/target/hosted/android/kernel-android.c | |||
@@ -60,7 +60,13 @@ void interrupt(void) | |||
60 | } | 60 | } |
61 | 61 | ||
62 | /* | 62 | /* |
63 | * setup a hrtimer to send a signal to our process every tick */ | 63 | * setup a hrtimer to send a signal to our process every tick |
64 | * | ||
65 | * WARNING: JNI calls are not permitted from tick tasks, as the | ||
66 | * underlying thread is not attached to the Java VM | ||
67 | * | ||
68 | * Can be possibly be attached if it really needs to be. but let's | ||
69 | * keep this leightweight */ | ||
64 | void tick_start(unsigned int interval_in_ms) | 70 | void tick_start(unsigned int interval_in_ms) |
65 | { | 71 | { |
66 | int ret = 0; | 72 | int ret = 0; |