5 package com.andrew.apollo.utils;
\r
8 import java.net.HttpURLConnection;
\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
34 import com.andrew.apollo.R;
\r
35 import com.androidquery.util.AQUtility;
\r
37 import static com.andrew.apollo.Constants.MIME_TYPE;
\r
40 * @author Andrew Neal
\r
41 * @Note Various methods used to help with specific Apollo statements
\r
43 public class ApolloUtils {
\r
46 * Used to fit a Bitmap nicely inside a View
\r
51 public static void setBackground(View view, Bitmap bitmap) {
\r
53 if (bitmap == null) {
\r
54 view.setBackgroundResource(0);
\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
63 float scalex = (float)vwidth / bwidth;
\r
64 float scaley = (float)vheight / bheight;
\r
65 float scale = Math.max(scalex, scaley) * 1.0f;
\r
67 Bitmap.Config config = Bitmap.Config.ARGB_8888;
\r
68 Bitmap background = Bitmap.createBitmap(vwidth, vheight, config);
\r
70 Canvas canvas = new Canvas(background);
\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
77 canvas.drawBitmap(bitmap, matrix, null);
\r
79 view.setBackgroundDrawable(new BitmapDrawable(view.getResources(), background));
\r
84 * @param bitmap This is to avoid Bitmap's IllegalArgumentException
\r
86 public static void runnableBackground(final ImageView view, final Bitmap bitmap) {
\r
87 view.post(new Runnable() {
\r
91 ApolloUtils.setBackground(view, bitmap);
\r
98 * @return whether there is an active data connection
\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
105 NetworkInfo wifiNetwork = cm.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
\r
106 if (wifiNetwork != null) {
\r
107 state = wifiNetwork.isConnectedOrConnecting();
\r
110 NetworkInfo mobileNetwork = cm.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
\r
111 if (mobileNetwork != null) {
\r
112 state = mobileNetwork.isConnectedOrConnecting();
\r
115 NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
\r
116 if (activeNetwork != null) {
\r
117 state = activeNetwork.isConnectedOrConnecting();
\r
124 * @return if a Tablet is the device being used
\r
126 public static boolean isTablet(Context context) {
\r
127 return (context.getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) >= Configuration.SCREENLAYOUT_SIZE_LARGE;
\r
131 * UP accordance without the icon
\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
142 * Header used in the track browser
\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
163 * Sets the ListView paddingLeft for the header
\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
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
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
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
198 * @param artistName
\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
211 * @param artistName
\r
214 * @return artist ID
\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
222 * @param artistName
\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
234 * Replace the characters not allowed in file names with underscore
\r
238 public static String escapeForFileSystem(String name) {
\r
239 return name.replaceAll("[\\\\/:*?\"<>|]+", "_");
\r
243 * Static utility function to download the file from the specified URL to the specified file.
\r
246 * @return true if the download succeeded false otherwise
\r
248 public static boolean downloadFile(String urlString, File outFile) {
\r
249 HttpURLConnection urlConnection = null;
\r
250 BufferedOutputStream out = null;
\r
253 File dir = outFile.getParentFile();
\r
254 if (!dir.exists() && !dir.mkdirs())
\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
264 while ((b = in.read()) != -1) {
\r
268 } catch (final IOException e) {
\r
271 if (urlConnection != null) {
\r
272 urlConnection.disconnect();
\r
277 } catch (final IOException e) {
\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
292 mToast.setText(context.getString(message));
\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
304 animation.addFrame(Drawable.createFromStream(
\r
305 context.getAssets().open("Frame" + i + ".png"), null), 75);
\r
306 } catch (IOException e) {
\r
309 animation.setOneShot(false);
\r