summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Martitz <kugel@rockbox.org>2011-02-26 19:54:03 +0000
committerThomas Martitz <kugel@rockbox.org>2011-02-26 19:54:03 +0000
commiteb016648045abdb80ee4e98cde405eb0c62b724c (patch)
tree3b14be88d4201b1de382e5cb481745429b95455e
parent75aa83526f4410eaddafc0c9188b9d885d05302f (diff)
downloadrockbox-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
-rw-r--r--android/src/org/rockbox/RockboxActivity.java1
-rw-r--r--android/src/org/rockbox/RockboxService.java40
-rw-r--r--android/src/org/rockbox/widgets/RockboxWidgetConfigure.java3
-rw-r--r--android/src/org/rockbox/widgets/RockboxWidgetProvider.java77
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;
29import android.content.Intent; 29import android.content.Intent;
30import android.content.SharedPreferences; 30import android.content.SharedPreferences;
31import android.os.Bundle; 31import android.os.Bundle;
32import android.util.Log;
33import android.view.View; 32import android.view.View;
34import android.widget.CheckBox; 33import 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;
24import org.rockbox.R; 24import org.rockbox.R;
25import org.rockbox.RockboxActivity; 25import org.rockbox.RockboxActivity;
26import org.rockbox.RockboxService; 26import org.rockbox.RockboxService;
27
28import android.app.PendingIntent; 27import android.app.PendingIntent;
29import android.appwidget.AppWidgetManager; 28import android.appwidget.AppWidgetManager;
30import android.appwidget.AppWidgetProvider; 29import android.appwidget.AppWidgetProvider;
@@ -32,17 +31,19 @@ import android.appwidget.AppWidgetProviderInfo;
32import android.content.ComponentName; 31import android.content.ComponentName;
33import android.content.Context; 32import android.content.Context;
34import android.content.Intent; 33import android.content.Intent;
35import android.content.pm.PackageManager;
36import android.net.Uri; 34import android.net.Uri;
37import android.util.Log;
38import android.view.View;
39import android.view.KeyEvent; 35import android.view.KeyEvent;
36import android.view.View;
40import android.widget.RemoteViews; 37import android.widget.RemoteViews;
41 38
42import java.util.ArrayList;
43
44public class RockboxWidgetProvider extends AppWidgetProvider 39public 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