OSDN Git Service

Rewrite image fetching and caching
[android-x86/packages-apps-Eleven.git] / src / com / andrew / apollo / utils / ApolloUtils.java
1 /**\r
2  * \r
3  */\r
4 \r
5 package com.andrew.apollo.utils;\r
6 \r
7 import java.io.*;\r
8 import java.net.HttpURLConnection;\r
9 import java.net.URL;\r
10 \r
11 import android.app.ActionBar;\r
12 import android.content.Context;\r
13 import android.content.Intent;\r
14 import android.content.SharedPreferences;\r
15 import android.content.res.Configuration;\r
16 import android.graphics.Bitmap;\r
17 import android.graphics.BitmapFactory;\r
18 import android.graphics.Canvas;\r
19 import android.graphics.Matrix;\r
20 import android.graphics.drawable.AnimationDrawable;\r
21 import android.graphics.drawable.BitmapDrawable;\r
22 import android.graphics.drawable.Drawable;\r
23 import android.net.ConnectivityManager;\r
24 import android.net.NetworkInfo;\r
25 import android.net.Uri;\r
26 import android.provider.MediaStore.Audio;\r
27 import android.support.v4.app.Fragment;\r
28 import android.view.View;\r
29 import android.widget.ImageView;\r
30 import android.widget.ListView;\r
31 import android.widget.TextView;\r
32 import android.widget.Toast;\r
33 \r
34 import com.andrew.apollo.R;\r
35 import com.androidquery.util.AQUtility;\r
36 \r
37 import static com.andrew.apollo.Constants.MIME_TYPE;\r
38 \r
39 /**\r
40  * @author Andrew Neal\r
41  * @Note Various methods used to help with specific Apollo statements\r
42  */\r
43 public class ApolloUtils {\r
44 \r
45     /**\r
46      * Used to fit a Bitmap nicely inside a View\r
47      * \r
48      * @param view\r
49      * @param bitmap\r
50      */\r
51     public static void setBackground(View view, Bitmap bitmap) {\r
52 \r
53         if (bitmap == null) {\r
54             view.setBackgroundResource(0);\r
55             return;\r
56         }\r
57 \r
58         int vwidth = view.getWidth();\r
59         int vheight = view.getHeight();\r
60         int bwidth = bitmap.getWidth();\r
61         int bheight = bitmap.getHeight();\r
62 \r
63         float scalex = (float)vwidth / bwidth;\r
64         float scaley = (float)vheight / bheight;\r
65         float scale = Math.max(scalex, scaley) * 1.0f;\r
66 \r
67         Bitmap.Config config = Bitmap.Config.ARGB_8888;\r
68         Bitmap background = Bitmap.createBitmap(vwidth, vheight, config);\r
69 \r
70         Canvas canvas = new Canvas(background);\r
71 \r
72         Matrix matrix = new Matrix();\r
73         matrix.setTranslate(-bwidth / 2, -bheight / 2);\r
74         matrix.postScale(scale, scale);\r
75         matrix.postTranslate(vwidth / 2, vheight / 2);\r
76 \r
77         canvas.drawBitmap(bitmap, matrix, null);\r
78 \r
79         view.setBackgroundDrawable(new BitmapDrawable(view.getResources(), background));\r
80     }\r
81 \r
82     /**\r
83      * @param view\r
84      * @param bitmap This is to avoid Bitmap's IllegalArgumentException\r
85      */\r
86     public static void runnableBackground(final ImageView view, final Bitmap bitmap) {\r
87         view.post(new Runnable() {\r
88 \r
89             @Override\r
90             public void run() {\r
91                 ApolloUtils.setBackground(view, bitmap);\r
92             }\r
93         });\r
94     }\r
95 \r
96     /**\r
97      * @param context\r
98      * @return whether there is an active data connection\r
99      */\r
100     public static boolean isOnline(Context context) {\r
101         boolean state = false;\r
102         ConnectivityManager cm = (ConnectivityManager)context\r
103                 .getSystemService(Context.CONNECTIVITY_SERVICE);\r
104 \r
105         NetworkInfo wifiNetwork = cm.getNetworkInfo(ConnectivityManager.TYPE_WIFI);\r
106         if (wifiNetwork != null) {\r
107             state = wifiNetwork.isConnectedOrConnecting();\r
108         }\r
109 \r
110         NetworkInfo mobileNetwork = cm.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);\r
111         if (mobileNetwork != null) {\r
112             state = mobileNetwork.isConnectedOrConnecting();\r
113         }\r
114 \r
115         NetworkInfo activeNetwork = cm.getActiveNetworkInfo();\r
116         if (activeNetwork != null) {\r
117             state = activeNetwork.isConnectedOrConnecting();\r
118         }\r
119         return state;\r
120     }\r
121 \r
122     /**\r
123      * @param context\r
124      * @return if a Tablet is the device being used\r
125      */\r
126     public static boolean isTablet(Context context) {\r
127         return (context.getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) >= Configuration.SCREENLAYOUT_SIZE_LARGE;\r
128     }\r
129 \r
130     /**\r
131      * UP accordance without the icon\r
132      * \r
133      * @param actionBar\r
134      */\r
135     public static void showUpTitleOnly(ActionBar actionBar) {\r
136         actionBar.setDisplayOptions(ActionBar.DISPLAY_HOME_AS_UP | ActionBar.DISPLAY_SHOW_TITLE,\r
137                 ActionBar.DISPLAY_HOME_AS_UP | ActionBar.DISPLAY_SHOW_TITLE\r
138                         | ActionBar.DISPLAY_SHOW_HOME);\r
139     }\r
140 \r
141     /**\r
142      * Header used in the track browser\r
143      * \r
144      * @param fragment\r
145      * @param view\r
146      * @param string\r
147      */\r
148     public static void listHeader(Fragment fragment, View view, String string) {\r
149         if (fragment.getArguments() != null) {\r
150             TextView mHeader = (TextView)view.findViewById(R.id.title);\r
151             String mimetype = fragment.getArguments().getString(MIME_TYPE);\r
152             if (Audio.Artists.CONTENT_TYPE.equals(mimetype)) {\r
153                 mHeader.setVisibility(View.VISIBLE);\r
154                 mHeader.setText(string);\r
155             } else if (Audio.Albums.CONTENT_TYPE.equals(mimetype)) {\r
156                 mHeader.setVisibility(View.VISIBLE);\r
157                 mHeader.setText(string);\r
158             }\r
159         }\r
160     }\r
161 \r
162     /**\r
163      * Sets the ListView paddingLeft for the header\r
164      * \r
165      * @param fragment\r
166      * @param mListView\r
167      */\r
168     public static void setListPadding(Fragment fragment, ListView mListView, int left, int top,\r
169             int right, int bottom) {\r
170         if (fragment.getArguments() != null) {\r
171             String mimetype = fragment.getArguments().getString(MIME_TYPE);\r
172             if (Audio.Albums.CONTENT_TYPE.equals(mimetype)) {\r
173                 mListView.setPadding(AQUtility.dip2pixel(fragment.getActivity(), left), top,\r
174                         AQUtility.dip2pixel(fragment.getActivity(), right), bottom);\r
175             } else if (Audio.Artists.CONTENT_TYPE.equals(mimetype)) {\r
176                 mListView.setPadding(AQUtility.dip2pixel(fragment.getActivity(), left), top,\r
177                         AQUtility.dip2pixel(fragment.getActivity(), right), bottom);\r
178             }\r
179         }\r
180     }\r
181 \r
182     // Returns if we're viewing an album\r
183     public static boolean isAlbum(String mimeType) {\r
184         return Audio.Albums.CONTENT_TYPE.equals(mimeType);\r
185     }\r
186 \r
187     // Returns if we're viewing an artists albums\r
188     public static boolean isArtist(String mimeType) {\r
189         return Audio.Artists.CONTENT_TYPE.equals(mimeType);\r
190     }\r
191 \r
192     // Returns if we're viewing a genre\r
193     public static boolean isGenre(String mimeType) {\r
194         return Audio.Genres.CONTENT_TYPE.equals(mimeType);\r
195     }\r
196 \r
197     /**\r
198      * @param artistName\r
199      * @param id\r
200      * @param key\r
201      * @param context\r
202      */\r
203     public static void setArtistId(String artistName, long id, String key, Context context) {\r
204         SharedPreferences settings = context.getSharedPreferences(key, 0);\r
205         SharedPreferences.Editor editor = settings.edit();\r
206         editor.putLong(artistName, id);\r
207         editor.commit();\r
208     }\r
209 \r
210     /**\r
211      * @param artistName\r
212      * @param key\r
213      * @param context\r
214      * @return artist ID\r
215      */\r
216     public static Long getArtistId(String artistName, String key, Context context) {\r
217         SharedPreferences settings = context.getSharedPreferences(key, 0);\r
218         return settings.getLong(artistName, 0);\r
219     }\r
220 \r
221     /**\r
222      * @param artistName\r
223      */\r
224     public static void shopFor(Context mContext, String artistName) {\r
225         String str = "https://market.android.com/search?q=%s&c=music&featured=MUSIC_STORE_SEARCH";\r
226         Intent shopIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(String.format(str,\r
227                 Uri.encode(artistName))));\r
228         shopIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);\r
229         shopIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);\r
230         mContext.startActivity(shopIntent);\r
231     }\r
232 \r
233     /**\r
234      * Replace the characters not allowed in file names with underscore\r
235      * @param name\r
236      * @return\r
237      */\r
238     public static String escapeForFileSystem(String name) {\r
239         return name.replaceAll("[\\\\/:*?\"<>|]+", "_");\r
240     }\r
241 \r
242     /**\r
243      * Static utility function to download the file from the specified URL to the specified file.\r
244      * @param urlString\r
245      * @param outFile\r
246      * @return true if the download succeeded false otherwise\r
247      */\r
248     public static boolean downloadFile(String urlString, File outFile) {\r
249         HttpURLConnection urlConnection = null;\r
250         BufferedOutputStream out = null;\r
251 \r
252         try {\r
253             File dir = outFile.getParentFile();\r
254             if (!dir.exists() && !dir.mkdirs())\r
255                 return false;\r
256 \r
257             final URL url = new URL(urlString);\r
258             urlConnection = (HttpURLConnection) url.openConnection();\r
259             final InputStream in =\r
260                     new BufferedInputStream(urlConnection.getInputStream());\r
261             out = new BufferedOutputStream(new FileOutputStream(outFile));\r
262 \r
263             int b;\r
264             while ((b = in.read()) != -1) {\r
265                 out.write(b);\r
266             }\r
267 \r
268         } catch (final IOException e) {\r
269             return false;\r
270         } finally {\r
271             if (urlConnection != null) {\r
272                 urlConnection.disconnect();\r
273             }\r
274             if (out != null) {\r
275                 try {\r
276                     out.close();\r
277                 } catch (final IOException e) {\r
278                     return false;\r
279                 }\r
280             }\r
281         }\r
282         return true;\r
283     }\r
284 \r
285     /**\r
286      * @param message\r
287      */\r
288     public static void showToast(int message, Toast mToast, Context context) {\r
289         if (mToast == null) {\r
290             mToast = Toast.makeText(context, "", Toast.LENGTH_SHORT);\r
291         }\r
292         mToast.setText(context.getString(message));\r
293         mToast.show();\r
294     }\r
295 \r
296     /**\r
297      * @param context\r
298      * @return meow\r
299      */\r
300     public static AnimationDrawable getNyanCat(Context context) {\r
301         final AnimationDrawable animation = new AnimationDrawable();\r
302         for (int i = 0; i < 12; i++) {\r
303             try {\r
304                 animation.addFrame(Drawable.createFromStream(\r
305                         context.getAssets().open("Frame" + i + ".png"), null), 75);\r
306             } catch (IOException e) {\r
307             }\r
308         }\r
309         animation.setOneShot(false);\r
310         return animation;\r
311     }\r
312 }\r