diff options
author | Thomas Martitz <kugel@rockbox.org> | 2011-02-26 19:54:03 +0000 |
---|---|---|
committer | Thomas Martitz <kugel@rockbox.org> | 2011-02-26 19:54:03 +0000 |
commit | eb016648045abdb80ee4e98cde405eb0c62b724c (patch) | |
tree | 3b14be88d4201b1de382e5cb481745429b95455e | |
parent | 75aa83526f4410eaddafc0c9188b9d885d05302f (diff) | |
download | rockbox-eb016648045abdb80ee4e98cde405eb0c62b724c.tar.gz rockbox-eb016648045abdb80ee4e98cde405eb0c62b724c.zip |
Android: Simplify media button intent generation in the widget and cleanup RockboxService accordingly.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@29404 a1c6a512-1295-4272-9138-f99709370657
4 files changed, 69 insertions, 52 deletions
diff --git a/android/src/org/rockbox/RockboxActivity.java b/android/src/org/rockbox/RockboxActivity.java index 65c7f92bbe..2e601cf041 100644 --- a/android/src/org/rockbox/RockboxActivity.java +++ b/android/src/org/rockbox/RockboxActivity.java | |||
@@ -45,6 +45,7 @@ public class RockboxActivity extends Activity | |||
45 | WindowManager.LayoutParams.FLAG_FULLSCREEN); | 45 | WindowManager.LayoutParams.FLAG_FULLSCREEN); |
46 | 46 | ||
47 | Intent intent = new Intent(this, RockboxService.class); | 47 | Intent intent = new Intent(this, RockboxService.class); |
48 | intent.setAction(Intent.ACTION_MAIN); | ||
48 | intent.putExtra("callback", new ResultReceiver(new Handler(getMainLooper())) { | 49 | intent.putExtra("callback", new ResultReceiver(new Handler(getMainLooper())) { |
49 | private ProgressDialog loadingdialog; | 50 | private ProgressDialog loadingdialog; |
50 | 51 | ||
diff --git a/android/src/org/rockbox/RockboxService.java b/android/src/org/rockbox/RockboxService.java index 4f0caa7704..5465152aa8 100644 --- a/android/src/org/rockbox/RockboxService.java +++ b/android/src/org/rockbox/RockboxService.java | |||
@@ -105,8 +105,8 @@ public class RockboxService extends Service | |||
105 | 105 | ||
106 | private void do_start(Intent intent) | 106 | private void do_start(Intent intent) |
107 | { | 107 | { |
108 | LOG("Start Service"); | 108 | LOG("Start RockboxService (Intent: " + intent.getAction() + ")"); |
109 | if (intent != null && intent.hasExtra("callback")) | 109 | if (intent.hasExtra("callback")) |
110 | resultReceiver = (ResultReceiver) intent.getParcelableExtra("callback"); | 110 | resultReceiver = (ResultReceiver) intent.getParcelableExtra("callback"); |
111 | 111 | ||
112 | if (!rockbox_running) | 112 | if (!rockbox_running) |
@@ -114,32 +114,18 @@ public class RockboxService extends Service | |||
114 | if (resultReceiver != null) | 114 | if (resultReceiver != null) |
115 | resultReceiver.send(RESULT_LIB_LOADED, null); | 115 | resultReceiver.send(RESULT_LIB_LOADED, null); |
116 | 116 | ||
117 | 117 | if (intent.getAction().equals(Intent.ACTION_MEDIA_BUTTON)) | |
118 | if (intent != null && intent.getAction() != null) | 118 | { |
119 | { | 119 | /* give it a bit of time so we can register button presses |
120 | if (!rockbox_running) | 120 | * sleeping longer doesn't work here, apparently Android |
121 | { /* give it a bit of time so we can register button presses | 121 | * surpresses long sleeps during intent handling */ |
122 | * sleeping longer doesn't work here, apparently Android | 122 | try { |
123 | * surpresses long sleeps during intent handling */ | 123 | Thread.sleep(50); |
124 | try { | 124 | } catch (InterruptedException e) { } |
125 | Thread.sleep(50); | ||
126 | } | ||
127 | catch (InterruptedException e) { } | ||
128 | } | ||
129 | 125 | ||
130 | if (intent.getAction().equals(Intent.ACTION_MEDIA_BUTTON)) | 126 | KeyEvent kev = intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT); |
131 | { | 127 | RockboxFramebuffer.buttonHandler(kev.getKeyCode(), |
132 | KeyEvent kev = (KeyEvent)intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT); | 128 | kev.getAction() == KeyEvent.ACTION_DOWN); |
133 | RockboxFramebuffer.buttonHandler(kev.getKeyCode(), kev.getAction() == KeyEvent.ACTION_DOWN); | ||
134 | } | ||
135 | else if (intent.getAction().equals("org.rockbox.PlayPause")) | ||
136 | RockboxFramebuffer.buttonHandler(KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE, false); | ||
137 | else if (intent.getAction().equals("org.rockbox.Prev")) | ||
138 | RockboxFramebuffer.buttonHandler(KeyEvent.KEYCODE_MEDIA_PREVIOUS, false); | ||
139 | else if (intent.getAction().equals("org.rockbox.Next")) | ||
140 | RockboxFramebuffer.buttonHandler(KeyEvent.KEYCODE_MEDIA_NEXT, false); | ||
141 | else if (intent.getAction().equals("org.rockbox.Stop")) | ||
142 | RockboxFramebuffer.buttonHandler(KeyEvent.KEYCODE_MEDIA_STOP, false); | ||
143 | } | 129 | } |
144 | 130 | ||
145 | /* (Re-)attach the media button receiver, in case it has been lost */ | 131 | /* (Re-)attach the media button receiver, in case it has been lost */ |
diff --git a/android/src/org/rockbox/widgets/RockboxWidgetConfigure.java b/android/src/org/rockbox/widgets/RockboxWidgetConfigure.java index 82adb97126..6ce2050780 100644 --- a/android/src/org/rockbox/widgets/RockboxWidgetConfigure.java +++ b/android/src/org/rockbox/widgets/RockboxWidgetConfigure.java | |||
@@ -29,7 +29,6 @@ import android.content.Context; | |||
29 | import android.content.Intent; | 29 | import android.content.Intent; |
30 | import android.content.SharedPreferences; | 30 | import android.content.SharedPreferences; |
31 | import android.os.Bundle; | 31 | import android.os.Bundle; |
32 | import android.util.Log; | ||
33 | import android.view.View; | 32 | import android.view.View; |
34 | import android.widget.CheckBox; | 33 | import android.widget.CheckBox; |
35 | 34 | ||
@@ -81,7 +80,7 @@ public class RockboxWidgetConfigure extends Activity | |||
81 | saveWidgetPref(context, mAppWidgetId, state); | 80 | saveWidgetPref(context, mAppWidgetId, state); |
82 | 81 | ||
83 | AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context); | 82 | AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context); |
84 | RockboxWidgetProvider.updateAppWidget(context, appWidgetManager, mAppWidgetId, null); | 83 | RockboxWidgetProvider.getInstance().updateAppWidget(context, appWidgetManager, mAppWidgetId, null); |
85 | 84 | ||
86 | Intent result = new Intent(); | 85 | Intent result = new Intent(); |
87 | result.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, mAppWidgetId); | 86 | result.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, mAppWidgetId); |
diff --git a/android/src/org/rockbox/widgets/RockboxWidgetProvider.java b/android/src/org/rockbox/widgets/RockboxWidgetProvider.java index 756d9f9a13..867088f601 100644 --- a/android/src/org/rockbox/widgets/RockboxWidgetProvider.java +++ b/android/src/org/rockbox/widgets/RockboxWidgetProvider.java | |||
@@ -24,7 +24,6 @@ package org.rockbox.widgets; | |||
24 | import org.rockbox.R; | 24 | import org.rockbox.R; |
25 | import org.rockbox.RockboxActivity; | 25 | import org.rockbox.RockboxActivity; |
26 | import org.rockbox.RockboxService; | 26 | import org.rockbox.RockboxService; |
27 | |||
28 | import android.app.PendingIntent; | 27 | import android.app.PendingIntent; |
29 | import android.appwidget.AppWidgetManager; | 28 | import android.appwidget.AppWidgetManager; |
30 | import android.appwidget.AppWidgetProvider; | 29 | import android.appwidget.AppWidgetProvider; |
@@ -32,17 +31,19 @@ import android.appwidget.AppWidgetProviderInfo; | |||
32 | import android.content.ComponentName; | 31 | import android.content.ComponentName; |
33 | import android.content.Context; | 32 | import android.content.Context; |
34 | import android.content.Intent; | 33 | import android.content.Intent; |
35 | import android.content.pm.PackageManager; | ||
36 | import android.net.Uri; | 34 | import android.net.Uri; |
37 | import android.util.Log; | ||
38 | import android.view.View; | ||
39 | import android.view.KeyEvent; | 35 | import android.view.KeyEvent; |
36 | import android.view.View; | ||
40 | import android.widget.RemoteViews; | 37 | import android.widget.RemoteViews; |
41 | 38 | ||
42 | import java.util.ArrayList; | ||
43 | |||
44 | public class RockboxWidgetProvider extends AppWidgetProvider | 39 | public class RockboxWidgetProvider extends AppWidgetProvider |
45 | { | 40 | { |
41 | static RockboxWidgetProvider mInstance; | ||
42 | public RockboxWidgetProvider() | ||
43 | { | ||
44 | super(); | ||
45 | mInstance = this; | ||
46 | } | ||
46 | @Override | 47 | @Override |
47 | public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) | 48 | public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) |
48 | { | 49 | { |
@@ -54,6 +55,12 @@ public class RockboxWidgetProvider extends AppWidgetProvider | |||
54 | 55 | ||
55 | } | 56 | } |
56 | } | 57 | } |
58 | |||
59 | public static RockboxWidgetProvider getInstance() | ||
60 | { | ||
61 | /* no new instance here, instanced by android */ | ||
62 | return mInstance; | ||
63 | } | ||
57 | 64 | ||
58 | @Override | 65 | @Override |
59 | public void onDeleted(Context context, int[] appWidgetIds) | 66 | public void onDeleted(Context context, int[] appWidgetIds) |
@@ -74,9 +81,9 @@ public class RockboxWidgetProvider extends AppWidgetProvider | |||
74 | public void onReceive(Context context, Intent intent) | 81 | public void onReceive(Context context, Intent intent) |
75 | { | 82 | { |
76 | String action = intent.getAction(); | 83 | String action = intent.getAction(); |
77 | if (intent.getAction().equals("org.rockbox.TrackUpdateInfo") || | 84 | if (action.equals("org.rockbox.TrackUpdateInfo") || |
78 | intent.getAction().equals("org.rockbox.TrackFinish") || | 85 | action.equals("org.rockbox.TrackFinish") || |
79 | intent.getAction().equals("org.rockbox.UpdateState")) | 86 | action.equals("org.rockbox.UpdateState")) |
80 | { | 87 | { |
81 | AppWidgetManager gm = AppWidgetManager.getInstance(context); | 88 | AppWidgetManager gm = AppWidgetManager.getInstance(context); |
82 | int[] appWidgetIds = gm.getAppWidgetIds(new ComponentName(context, this.getClass())); | 89 | int[] appWidgetIds = gm.getAppWidgetIds(new ComponentName(context, this.getClass())); |
@@ -92,7 +99,7 @@ public class RockboxWidgetProvider extends AppWidgetProvider | |||
92 | } | 99 | } |
93 | } | 100 | } |
94 | 101 | ||
95 | public static void updateAppWidget(Context context, AppWidgetManager appWidgetManager, int appWidgetId, Intent args) | 102 | public void updateAppWidget(Context context, AppWidgetManager appWidgetManager, int appWidgetId, Intent args) |
96 | { | 103 | { |
97 | AppWidgetProviderInfo provider = appWidgetManager.getAppWidgetInfo(appWidgetId); | 104 | AppWidgetProviderInfo provider = appWidgetManager.getAppWidgetInfo(appWidgetId); |
98 | RemoteViews views = null; | 105 | RemoteViews views = null; |
@@ -104,38 +111,42 @@ public class RockboxWidgetProvider extends AppWidgetProvider | |||
104 | 111 | ||
105 | RockboxWidgetConfigure.WidgetPref state = RockboxWidgetConfigure.loadWidgetPref(context, appWidgetId); | 112 | RockboxWidgetConfigure.WidgetPref state = RockboxWidgetConfigure.loadWidgetPref(context, appWidgetId); |
106 | 113 | ||
114 | /* enable/disable PREV */ | ||
107 | if (state.enablePrev) | 115 | if (state.enablePrev) |
108 | { | 116 | { |
109 | intent = new Intent("org.rockbox.Prev", Uri.EMPTY, context, RockboxService.class); | 117 | views.setOnClickPendingIntent(R.id.prev, |
110 | pendingIntent = PendingIntent.getService(context, 0, intent, 0); | 118 | RockboxMediaIntent.newPendingIntent(context, |
111 | views.setOnClickPendingIntent(R.id.prev, pendingIntent); | 119 | KeyEvent.KEYCODE_MEDIA_PREVIOUS)); |
112 | } | 120 | } |
113 | else | 121 | else |
114 | views.setViewVisibility(R.id.prev, View.GONE); | 122 | views.setViewVisibility(R.id.prev, View.GONE); |
115 | 123 | ||
124 | /* enable/disable PLAY/PAUSE */ | ||
116 | if (state.enablePlayPause) | 125 | if (state.enablePlayPause) |
117 | { | 126 | { |
118 | intent = new Intent("org.rockbox.PlayPause", Uri.EMPTY, context, RockboxService.class); | 127 | views.setOnClickPendingIntent(R.id.playPause, |
119 | pendingIntent = PendingIntent.getService(context, 0, intent, 0); | 128 | RockboxMediaIntent.newPendingIntent(context, |
120 | views.setOnClickPendingIntent(R.id.playPause, pendingIntent); | 129 | KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE)); |
121 | } | 130 | } |
122 | else | 131 | else |
123 | views.setViewVisibility(R.id.playPause, View.GONE); | 132 | views.setViewVisibility(R.id.playPause, View.GONE); |
124 | 133 | ||
134 | /* enable/disable NEXT */ | ||
125 | if (state.enableNext) | 135 | if (state.enableNext) |
126 | { | 136 | { |
127 | intent = new Intent("org.rockbox.Next", Uri.EMPTY, context, RockboxService.class); | 137 | views.setOnClickPendingIntent(R.id.next, |
128 | pendingIntent = PendingIntent.getService(context, 0, intent, 0); | 138 | RockboxMediaIntent.newPendingIntent(context, |
129 | views.setOnClickPendingIntent(R.id.next, pendingIntent); | 139 | KeyEvent.KEYCODE_MEDIA_NEXT)); |
130 | } | 140 | } |
131 | else | 141 | else |
132 | views.setViewVisibility(R.id.next, View.GONE); | 142 | views.setViewVisibility(R.id.next, View.GONE); |
133 | 143 | ||
144 | /* enable/disable STOP */ | ||
134 | if (state.enableStop) | 145 | if (state.enableStop) |
135 | { | 146 | { |
136 | intent = new Intent("org.rockbox.Stop", Uri.EMPTY, context, RockboxService.class); | 147 | views.setOnClickPendingIntent(R.id.stop, |
137 | pendingIntent = PendingIntent.getService(context, 0, intent, 0); | 148 | RockboxMediaIntent.newPendingIntent(context, |
138 | views.setOnClickPendingIntent(R.id.stop, pendingIntent); | 149 | KeyEvent.KEYCODE_MEDIA_STOP)); |
139 | } | 150 | } |
140 | else | 151 | else |
141 | views.setViewVisibility(R.id.stop, View.GONE); | 152 | views.setViewVisibility(R.id.stop, View.GONE); |
@@ -166,6 +177,26 @@ public class RockboxWidgetProvider extends AppWidgetProvider | |||
166 | } | 177 | } |
167 | 178 | ||
168 | appWidgetManager.updateAppWidget(appWidgetId, views); | 179 | appWidgetManager.updateAppWidget(appWidgetId, views); |
169 | } | 180 | } |
181 | |||
182 | private static class RockboxMediaIntent extends Intent | ||
183 | { | ||
184 | private RockboxMediaIntent(Context c, int keycode) | ||
185 | { | ||
186 | super(ACTION_MEDIA_BUTTON, Uri.EMPTY, c, RockboxService.class); | ||
187 | putExtra(EXTRA_KEY_EVENT, new KeyEvent(KeyEvent.ACTION_UP, | ||
188 | keycode)); | ||
189 | } | ||
190 | |||
191 | public static PendingIntent newPendingIntent(Context c, int keycode) | ||
192 | { | ||
193 | /* Use keycode as request to code to prevent successive | ||
194 | * PendingIntents from overwritting one another. | ||
195 | * This seems hackish but at least it works. | ||
196 | * see: http://code.google.com/p/android/issues/detail?id=863 | ||
197 | */ | ||
198 | return PendingIntent.getService(c, keycode, new RockboxMediaIntent(c, keycode), 0); | ||
199 | } | ||
200 | } | ||
170 | } | 201 | } |
171 | 202 | ||