diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 4365c271..de936232 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -70,7 +70,7 @@ THE SOFTWARE.
+ android:label="Vanilla Music 4x1 A">
@@ -78,6 +78,16 @@ THE SOFTWARE.
android:name="android.appwidget.provider"
android:resource="@xml/four_long_widget" />
+
+
+
+
+
+
diff --git a/res/layout/widget_d.xml b/res/layout/widget_d.xml
index 4980b77f..576b1763 100644
--- a/res/layout/widget_d.xml
+++ b/res/layout/widget_d.xml
@@ -30,86 +30,5 @@ THE SOFTWARE.
android:layout_height="fill_parent"
android:adjustViewBounds="true"
android:scaleType="fitCenter" />
-
-
-
-
-
-
-
-
-
-
-
+
diff --git a/res/layout/widget_e.xml b/res/layout/widget_e.xml
new file mode 100644
index 00000000..ed1a9322
--- /dev/null
+++ b/res/layout/widget_e.xml
@@ -0,0 +1,107 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/res/xml/widget_e.xml b/res/xml/widget_e.xml
new file mode 100644
index 00000000..2cc0e323
--- /dev/null
+++ b/res/xml/widget_e.xml
@@ -0,0 +1,7 @@
+
+
diff --git a/src/org/kreed/vanilla/PlaybackService.java b/src/org/kreed/vanilla/PlaybackService.java
index 367fd53c..90c04cd9 100644
--- a/src/org/kreed/vanilla/PlaybackService.java
+++ b/src/org/kreed/vanilla/PlaybackService.java
@@ -800,6 +800,7 @@ public final class PlaybackService extends Service
FourSquareWidget.checkEnabled(this, manager);
FourLongWidget.checkEnabled(this, manager);
WidgetD.checkEnabled(this, manager);
+ WidgetE.checkEnabled(this, manager);
}
/**
@@ -814,6 +815,7 @@ public final class PlaybackService extends Service
FourLongWidget.updateWidget(this, manager, song, state);
FourSquareWidget.updateWidget(this, manager, song, state);
WidgetD.updateWidget(this, manager, song, state);
+ WidgetE.updateWidget(this, manager, song, state);
}
/**
diff --git a/src/org/kreed/vanilla/WidgetE.java b/src/org/kreed/vanilla/WidgetE.java
new file mode 100644
index 00000000..159049d4
--- /dev/null
+++ b/src/org/kreed/vanilla/WidgetE.java
@@ -0,0 +1,145 @@
+/*
+ * Copyright (C) 2012 Christopher Eby
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+package org.kreed.vanilla;
+
+import android.app.PendingIntent;
+import android.appwidget.AppWidgetManager;
+import android.appwidget.AppWidgetProvider;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.view.View;
+import android.widget.RemoteViews;
+
+/**
+ * 4x1 widget with many playback controls
+ */
+public class WidgetE extends AppWidgetProvider {
+ private static boolean sEnabled;
+
+ @Override
+ public void onEnabled(Context context)
+ {
+ sEnabled = true;
+ }
+
+ @Override
+ public void onDisabled(Context context)
+ {
+ sEnabled = false;
+ }
+
+ @Override
+ public void onUpdate(Context context, AppWidgetManager manager, int[] ids)
+ {
+ Song song = null;
+ int state = 0;
+
+ if (PlaybackService.hasInstance()) {
+ PlaybackService service = PlaybackService.get(context);
+ song = service.getSong(0);
+ state = service.getState();
+ }
+
+ sEnabled = true;
+ updateWidget(context, manager, song, state);
+ }
+
+ /**
+ * Check if there are any instances of this widget placed.
+ */
+ public static void checkEnabled(Context context, AppWidgetManager manager)
+ {
+ sEnabled = manager.getAppWidgetIds(new ComponentName(context, WidgetE.class)).length != 0;
+ }
+
+ /**
+ * Populate the widgets with the given ids with the given info.
+ *
+ * @param context A Context to use.
+ * @param manager The AppWidgetManager that will be used to update the
+ * widget.
+ * @param song The current Song in PlaybackService.
+ * @param state The current PlaybackService state.
+ */
+ public static void updateWidget(Context context, AppWidgetManager manager, Song song, int state)
+ {
+ if (!sEnabled)
+ return;
+
+ RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget_e);
+
+ if ((state & PlaybackService.FLAG_NO_MEDIA) != 0) {
+ views.setViewVisibility(R.id.buttons, View.GONE);
+ views.setViewVisibility(R.id.title, View.GONE);
+ views.setInt(R.id.artist, "setText", R.string.no_songs);
+ } else if (song == null) {
+ views.setViewVisibility(R.id.buttons, View.VISIBLE);
+ views.setViewVisibility(R.id.title, View.GONE);
+ views.setInt(R.id.artist, "setText", R.string.app_name);
+ } else {
+ views.setViewVisibility(R.id.title, View.VISIBLE);
+ views.setViewVisibility(R.id.buttons, View.VISIBLE);
+ views.setTextViewText(R.id.title, song.title);
+ views.setTextViewText(R.id.artist, song.artist);
+ }
+
+ boolean playing = (state & PlaybackService.FLAG_PLAYING) != 0;
+ views.setImageViewResource(R.id.play_pause, playing ? R.drawable.pause : R.drawable.play);
+ views.setImageViewResource(R.id.end_action, SongTimeline.FINISH_ICONS[PlaybackService.finishAction(state)]);
+ views.setImageViewResource(R.id.shuffle, SongTimeline.SHUFFLE_ICONS[PlaybackService.shuffleMode(state)]);
+
+ Intent intent;
+ PendingIntent pendingIntent;
+
+ ComponentName service = new ComponentName(context, PlaybackService.class);
+
+ intent = new Intent(context, LibraryActivity.class);
+ intent.setAction(Intent.ACTION_MAIN);
+ pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);
+ views.setOnClickPendingIntent(R.id.title, pendingIntent);
+ views.setOnClickPendingIntent(R.id.artist, pendingIntent);
+
+ intent = new Intent(PlaybackService.ACTION_TOGGLE_PLAYBACK).setComponent(service);
+ pendingIntent = PendingIntent.getService(context, 0, intent, 0);
+ views.setOnClickPendingIntent(R.id.play_pause, pendingIntent);
+
+ intent = new Intent(PlaybackService.ACTION_NEXT_SONG).setComponent(service);
+ pendingIntent = PendingIntent.getService(context, 0, intent, 0);
+ views.setOnClickPendingIntent(R.id.next, pendingIntent);
+
+ intent = new Intent(PlaybackService.ACTION_PREVIOUS_SONG).setComponent(service);
+ pendingIntent = PendingIntent.getService(context, 0, intent, 0);
+ views.setOnClickPendingIntent(R.id.previous, pendingIntent);
+
+ intent = new Intent(PlaybackService.ACTION_CYCLE_SHUFFLE).setComponent(service);
+ pendingIntent = PendingIntent.getService(context, 0, intent, 0);
+ views.setOnClickPendingIntent(R.id.shuffle, pendingIntent);
+
+ intent = new Intent(PlaybackService.ACTION_CYCLE_REPEAT).setComponent(service);
+ pendingIntent = PendingIntent.getService(context, 0, intent, 0);
+ views.setOnClickPendingIntent(R.id.end_action, pendingIntent);
+
+ manager.updateAppWidget(new ComponentName(context, WidgetE.class), views);
+ }
+}