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.R;
\r
15 import com.andrew.apollo.service.ApolloService;
\r
16 import com.andrew.apollo.utils.ApolloUtils;
\r
17 import com.androidquery.AQuery;
\r
19 import static com.andrew.apollo.Constants.ALBUM_IMAGE;
\r
22 * Simple widget to show currently playing album art along with play/pause and
\r
23 * next track buttons.
\r
25 public class AppWidget11 extends AppWidgetProvider {
\r
26 static final String TAG = "MusicAppWidgetProvider1x1";
\r
28 public static final String CMDAPPWIDGETUPDATE = "appwidgetupdate1x1";
\r
30 private static AppWidget11 sInstance;
\r
32 public static synchronized AppWidget11 getInstance() {
\r
33 if (sInstance == null) {
\r
34 sInstance = new AppWidget11();
\r
40 public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
\r
41 defaultAppWidget(context, appWidgetIds);
\r
43 // Send broadcast intent to any running ApolloService so it can
\r
44 // wrap around with an immediate update.
\r
45 Intent updateIntent = new Intent(ApolloService.SERVICECMD);
\r
46 updateIntent.putExtra(ApolloService.CMDNAME, AppWidget11.CMDAPPWIDGETUPDATE);
\r
47 updateIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, appWidgetIds);
\r
48 updateIntent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY);
\r
49 context.sendBroadcast(updateIntent);
\r
53 * Initialize given widgets to default state, where we launch Music on
\r
54 * default click and hide actions if service not running.
\r
56 private void defaultAppWidget(Context context, int[] appWidgetIds) {
\r
57 final RemoteViews views = new RemoteViews(context.getPackageName(),
\r
58 R.layout.onebyone_app_widget);
\r
60 views.setImageViewResource(R.id.one_by_one_albumart, View.GONE);
\r
62 linkButtons(context, views, false /* not playing */);
\r
63 pushUpdate(context, appWidgetIds, views);
\r
66 private void pushUpdate(Context context, int[] appWidgetIds, RemoteViews views) {
\r
67 // Update specific list of appWidgetIds if given, otherwise default to
\r
69 final AppWidgetManager gm = AppWidgetManager.getInstance(context);
\r
70 if (appWidgetIds != null) {
\r
71 gm.updateAppWidget(appWidgetIds, views);
\r
73 gm.updateAppWidget(new ComponentName(context, this.getClass()), views);
\r
78 * Check against {@link AppWidgetManager} if there are any instances of this
\r
81 private boolean hasInstances(Context context) {
\r
82 AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
\r
83 int[] appWidgetIds = appWidgetManager.getAppWidgetIds(new ComponentName(context, this
\r
85 return (appWidgetIds.length > 0);
\r
89 * Handle a change notification coming over from {@link ApolloService}
\r
91 public void notifyChange(ApolloService service, String what) {
\r
92 if (hasInstances(service)) {
\r
93 if (ApolloService.META_CHANGED.equals(what)
\r
94 || ApolloService.PLAYSTATE_CHANGED.equals(what)) {
\r
95 performUpdate(service, null);
\r
101 * Update all active widget instances by pushing changes
\r
103 public void performUpdate(ApolloService service, int[] appWidgetIds) {
\r
104 final RemoteViews views = new RemoteViews(service.getPackageName(),
\r
105 R.layout.onebyone_app_widget);
\r
108 AQuery aq = new AQuery(service);
\r
109 Bitmap bitmap = aq.getCachedImage(ApolloUtils.getImageURL(service.getAlbumName(),
\r
110 ALBUM_IMAGE, service));
\r
111 if (bitmap != null) {
\r
112 views.setViewVisibility(R.id.one_by_one_albumart, View.VISIBLE);
\r
113 views.setImageViewBitmap(R.id.one_by_one_albumart, bitmap);
\r
115 views.setViewVisibility(R.id.one_by_one_albumart, View.INVISIBLE);
\r
117 // Set correct contentDescription
\r
118 final boolean playing = service.isPlaying();
\r
120 views.setContentDescription(R.id.one_by_one_albumart,
\r
121 service.getResources().getString(R.string.nowplaying));
\r
123 views.setContentDescription(R.id.one_by_one_albumart,
\r
124 service.getResources().getString(R.string.app_name));
\r
127 // Link actions buttons to intents
\r
128 linkButtons(service, views, playing);
\r
130 pushUpdate(service, appWidgetIds, views);
\r
134 * Link up various button actions using {@link PendingIntents}.
\r
136 * @param playerActive True if player is active in background, which means
\r
137 * widget click will launch {@link MediaPlaybackActivity},
\r
138 * otherwise we launch {@link MusicBrowserActivity}.
\r
140 private void linkButtons(Context context, RemoteViews views, boolean playerActive) {
\r
141 // Connect up various buttons and touch events
\r
143 PendingIntent pendingIntent;
\r
145 final ComponentName serviceName = new ComponentName(context, ApolloService.class);
\r
147 intent = new Intent(ApolloService.TOGGLEPAUSE_ACTION);
\r
148 intent.setComponent(serviceName);
\r
149 pendingIntent = PendingIntent.getService(context, 0, intent, 0);
\r
150 views.setOnClickPendingIntent(R.id.one_by_one_albumart, pendingIntent);
\r