OSDN Git Service

overhaul
[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.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
19 \r
20 /**\r
21  * Simple widget to show currently playing album art along with play/pause and\r
22  * next track buttons.\r
23  */\r
24 public class AppWidget11 extends AppWidgetProvider implements Constants {\r
25     static final String TAG = "MusicAppWidgetProvider1x1";\r
26 \r
27     public static final String CMDAPPWIDGETUPDATE = "appwidgetupdate1x1";\r
28 \r
29     private static AppWidget11 sInstance;\r
30 \r
31     public static synchronized AppWidget11 getInstance() {\r
32         if (sInstance == null) {\r
33             sInstance = new AppWidget11();\r
34         }\r
35         return sInstance;\r
36     }\r
37 \r
38     @Override\r
39     public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {\r
40         defaultAppWidget(context, appWidgetIds);\r
41 \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
49     }\r
50 \r
51     /**\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
54      */\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
58 \r
59         views.setImageViewResource(R.id.one_by_one_albumart, View.GONE);\r
60 \r
61         linkButtons(context, views, false /* not playing */);\r
62         pushUpdate(context, appWidgetIds, views);\r
63     }\r
64 \r
65     private void pushUpdate(Context context, int[] appWidgetIds, RemoteViews views) {\r
66         // Update specific list of appWidgetIds if given, otherwise default to\r
67         // all\r
68         final AppWidgetManager gm = AppWidgetManager.getInstance(context);\r
69         if (appWidgetIds != null) {\r
70             gm.updateAppWidget(appWidgetIds, views);\r
71         } else {\r
72             gm.updateAppWidget(new ComponentName(context, this.getClass()), views);\r
73         }\r
74     }\r
75 \r
76     /**\r
77      * Check against {@link AppWidgetManager} if there are any instances of this\r
78      * widget.\r
79      */\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
83                 .getClass()));\r
84         return (appWidgetIds.length > 0);\r
85     }\r
86 \r
87     /**\r
88      * Handle a change notification coming over from {@link ApolloService}\r
89      */\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
95             }\r
96         }\r
97     }\r
98 \r
99     /**\r
100      * Update all active widget instances by pushing changes\r
101      */\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
105 \r
106         // Set album art\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
113         } else {\r
114             views.setViewVisibility(R.id.one_by_one_albumart, View.INVISIBLE);\r
115         }\r
116         // Set correct drawable for pause state\r
117         final boolean playing = service.isPlaying();\r
118 \r
119         // Link actions buttons to intents\r
120         linkButtons(service, views, playing);\r
121 \r
122         pushUpdate(service, appWidgetIds, views);\r
123     }\r
124 \r
125     /**\r
126      * Link up various button actions using {@link PendingIntents}.\r
127      * \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
131      */\r
132     private void linkButtons(Context context, RemoteViews views, boolean playerActive) {\r
133         // Connect up various buttons and touch events\r
134         Intent intent;\r
135         PendingIntent pendingIntent;\r
136 \r
137         final ComponentName serviceName = new ComponentName(context, ApolloService.class);\r
138 \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
143 \r
144     }\r
145 }\r