2 package com.andrew.apollo.app.widgets;
\r
4 import android.app.PendingIntent;
\r
5 import android.appwidget.AppWidgetManager;
\r
6 import android.appwidget.AppWidgetProvider;
\r
7 import android.content.ComponentName;
\r
8 import android.content.Context;
\r
9 import android.content.Intent;
\r
10 import android.graphics.Bitmap;
\r
11 import android.view.View;
\r
12 import android.widget.RemoteViews;
\r
14 import com.andrew.apollo.Constants;
\r
15 import com.andrew.apollo.R;
\r
16 import com.andrew.apollo.service.ApolloService;
\r
17 import com.andrew.apollo.utils.ApolloUtils;
\r
18 import com.androidquery.AQuery;
\r
21 * Simple widget to show currently playing album art along with play/pause and
\r
22 * next track buttons.
\r
24 public class AppWidget11 extends AppWidgetProvider implements Constants {
\r
25 static final String TAG = "MusicAppWidgetProvider1x1";
\r
27 public static final String CMDAPPWIDGETUPDATE = "appwidgetupdate1x1";
\r
29 private static AppWidget11 sInstance;
\r
31 public static synchronized AppWidget11 getInstance() {
\r
32 if (sInstance == null) {
\r
33 sInstance = new AppWidget11();
\r
39 public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
\r
40 defaultAppWidget(context, appWidgetIds);
\r
42 // Send broadcast intent to any running ApolloService so it can
\r
43 // wrap around with an immediate update.
\r
44 Intent updateIntent = new Intent(ApolloService.SERVICECMD);
\r
45 updateIntent.putExtra(ApolloService.CMDNAME, AppWidget11.CMDAPPWIDGETUPDATE);
\r
46 updateIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, appWidgetIds);
\r
47 updateIntent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY);
\r
48 context.sendBroadcast(updateIntent);
\r
52 * Initialize given widgets to default state, where we launch Music on
\r
53 * default click and hide actions if service not running.
\r
55 private void defaultAppWidget(Context context, int[] appWidgetIds) {
\r
56 final RemoteViews views = new RemoteViews(context.getPackageName(),
\r
57 R.layout.onebyone_app_widget);
\r
59 views.setImageViewResource(R.id.one_by_one_albumart, View.GONE);
\r
61 linkButtons(context, views, false /* not playing */);
\r
62 pushUpdate(context, appWidgetIds, views);
\r
65 private void pushUpdate(Context context, int[] appWidgetIds, RemoteViews views) {
\r
66 // Update specific list of appWidgetIds if given, otherwise default to
\r
68 final AppWidgetManager gm = AppWidgetManager.getInstance(context);
\r
69 if (appWidgetIds != null) {
\r
70 gm.updateAppWidget(appWidgetIds, views);
\r
72 gm.updateAppWidget(new ComponentName(context, this.getClass()), views);
\r
77 * Check against {@link AppWidgetManager} if there are any instances of this
\r
80 private boolean hasInstances(Context context) {
\r
81 AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
\r
82 int[] appWidgetIds = appWidgetManager.getAppWidgetIds(new ComponentName(context, this
\r
84 return (appWidgetIds.length > 0);
\r
88 * Handle a change notification coming over from {@link ApolloService}
\r
90 public void notifyChange(ApolloService service, String what) {
\r
91 if (hasInstances(service)) {
\r
92 if (ApolloService.META_CHANGED.equals(what)
\r
93 || ApolloService.PLAYSTATE_CHANGED.equals(what)) {
\r
94 performUpdate(service, null);
\r
100 * Update all active widget instances by pushing changes
\r
102 public void performUpdate(ApolloService service, int[] appWidgetIds) {
\r
103 final RemoteViews views = new RemoteViews(service.getPackageName(),
\r
104 R.layout.onebyone_app_widget);
\r
107 AQuery aq = new AQuery(service);
\r
108 Bitmap bitmap = aq.getCachedImage(ApolloUtils.getImageURL(service.getAlbumName(),
\r
109 ALBUM_IMAGE, service));
\r
110 if (bitmap != null) {
\r
111 views.setViewVisibility(R.id.one_by_one_albumart, View.VISIBLE);
\r
112 views.setImageViewBitmap(R.id.one_by_one_albumart, bitmap);
\r
114 views.setViewVisibility(R.id.one_by_one_albumart, View.INVISIBLE);
\r
116 // Set correct drawable for pause state
\r
117 final boolean playing = service.isPlaying();
\r
119 // Link actions buttons to intents
\r
120 linkButtons(service, views, playing);
\r
122 pushUpdate(service, appWidgetIds, views);
\r
126 * Link up various button actions using {@link PendingIntents}.
\r
128 * @param playerActive True if player is active in background, which means
\r
129 * widget click will launch {@link MediaPlaybackActivity},
\r
130 * otherwise we launch {@link MusicBrowserActivity}.
\r
132 private void linkButtons(Context context, RemoteViews views, boolean playerActive) {
\r
133 // Connect up various buttons and touch events
\r
135 PendingIntent pendingIntent;
\r
137 final ComponentName serviceName = new ComponentName(context, ApolloService.class);
\r
139 intent = new Intent(ApolloService.TOGGLEPAUSE_ACTION);
\r
140 intent.setComponent(serviceName);
\r
141 pendingIntent = PendingIntent.getService(context, 0, intent, 0);
\r
142 views.setOnClickPendingIntent(R.id.one_by_one_albumart, pendingIntent);
\r