OSDN Git Service

c730a2c140253d3679ce5352940670dad183a550
[android-x86/packages-apps-Eleven.git] / src / com / andrew / apollo / app / widgets / AppWidget11.java
1 \r
2 package com.andrew.apollo.app.widgets;\r
3 \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
13 \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
18 \r
19 import static com.andrew.apollo.Constants.ALBUM_IMAGE;\r
20 \r
21 /**\r
22  * Simple widget to show currently playing album art along with play/pause and\r
23  * next track buttons.\r
24  */\r
25 public class AppWidget11 extends AppWidgetProvider {\r
26     static final String TAG = "MusicAppWidgetProvider1x1";\r
27 \r
28     public static final String CMDAPPWIDGETUPDATE = "appwidgetupdate1x1";\r
29 \r
30     private static AppWidget11 sInstance;\r
31 \r
32     public static synchronized AppWidget11 getInstance() {\r
33         if (sInstance == null) {\r
34             sInstance = new AppWidget11();\r
35         }\r
36         return sInstance;\r
37     }\r
38 \r
39     @Override\r
40     public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {\r
41         defaultAppWidget(context, appWidgetIds);\r
42 \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
50     }\r
51 \r
52     /**\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
55      */\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
59 \r
60         views.setImageViewResource(R.id.one_by_one_albumart, View.GONE);\r
61 \r
62         linkButtons(context, views, false /* not playing */);\r
63         pushUpdate(context, appWidgetIds, views);\r
64     }\r
65 \r
66     private void pushUpdate(Context context, int[] appWidgetIds, RemoteViews views) {\r
67         // Update specific list of appWidgetIds if given, otherwise default to\r
68         // all\r
69         final AppWidgetManager gm = AppWidgetManager.getInstance(context);\r
70         if (appWidgetIds != null) {\r
71             gm.updateAppWidget(appWidgetIds, views);\r
72         } else {\r
73             gm.updateAppWidget(new ComponentName(context, this.getClass()), views);\r
74         }\r
75     }\r
76 \r
77     /**\r
78      * Check against {@link AppWidgetManager} if there are any instances of this\r
79      * widget.\r
80      */\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
84                 .getClass()));\r
85         return (appWidgetIds.length > 0);\r
86     }\r
87 \r
88     /**\r
89      * Handle a change notification coming over from {@link ApolloService}\r
90      */\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
96             }\r
97         }\r
98     }\r
99 \r
100     /**\r
101      * Update all active widget instances by pushing changes\r
102      */\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
106 \r
107         // Set album art\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
114         } else {\r
115             views.setViewVisibility(R.id.one_by_one_albumart, View.INVISIBLE);\r
116         }\r
117         // Set correct contentDescription\r
118         final boolean playing = service.isPlaying();\r
119         if (playing) {\r
120             views.setContentDescription(R.id.one_by_one_albumart,\r
121                 service.getResources().getString(R.string.nowplaying));\r
122         } else {\r
123             views.setContentDescription(R.id.one_by_one_albumart,\r
124                 service.getResources().getString(R.string.app_name));\r
125         }\r
126 \r
127         // Link actions buttons to intents\r
128         linkButtons(service, views, playing);\r
129 \r
130         pushUpdate(service, appWidgetIds, views);\r
131     }\r
132 \r
133     /**\r
134      * Link up various button actions using {@link PendingIntents}.\r
135      * \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
139      */\r
140     private void linkButtons(Context context, RemoteViews views, boolean playerActive) {\r
141         // Connect up various buttons and touch events\r
142         Intent intent;\r
143         PendingIntent pendingIntent;\r
144 \r
145         final ComponentName serviceName = new ComponentName(context, ApolloService.class);\r
146 \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
151 \r
152     }\r
153 }\r