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); + } +}