package com.distantfuture.videos.misc;
import android.app.Activity;
import android.app.Fragment;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Point;
import android.graphics.Rect;
import android.graphics.RectF;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.Build;
import android.os.Handler;
import android.os.Looper;
import android.os.Vibrator;
import android.view.View;
import android.view.ViewConfiguration;
import android.view.ViewGroup;
import android.widget.TextView;
import android.widget.Toast;
import com.distantfuture.videos.R;
import org.joda.time.Period;
import org.joda.time.Seconds;
import org.joda.time.format.ISOPeriodFormat;
import org.joda.time.format.PeriodFormatter;
import java.lang.reflect.Field;
import java.text.SimpleDateFormat;
import java.util.Random;
public class Utils {
private static final PeriodFormatter mFormatter = ISOPeriodFormat.standard();
private static float sScreenDensity = 0;
public static void toast(Context context, final String message) {
// Toasts only work on the main thread
if (context != null && message != null) {
final Context appContext = context.getApplicationContext();
Handler handler = new Handler(Looper.getMainLooper());
handler.post(new Runnable() {
@Override
public void run() {
Toast.makeText(appContext, message, Toast.LENGTH_SHORT).show();
}
});
}
}
public static void message(final Activity activity, final String message) {
// Toasts only work on the main thread
if (activity != null && message != null) {
Handler handler = new Handler(Looper.getMainLooper());
handler.post(new Runnable() {
@Override
public void run() {
FlappyMsg.makeText(activity, message);
}
});
}
}
public static String companyURL() {
return "http://distantfutu.re";
}
public static void ignoreObsoleteCapacitiveMenuButton(Context context) {
try {
ViewConfiguration config = ViewConfiguration.get(context);
Field menuKeyField = ViewConfiguration.class.getDeclaredField("sHasPermanentMenuKey");
if (menuKeyField != null) {
menuKeyField.setAccessible(true);
menuKeyField.setBoolean(config, false);
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static void showFragment(Activity activity, Fragment fragment, int resID, int animationType, boolean addToBackStack) {
// check params and bail if necessary
if (fragment == null || activity == null) {
DUtils.log("bad params: " + DUtils.currentMethod());
return;
}
FragmentManager fragmentManager = activity.getFragmentManager();
FragmentTransaction ft = fragmentManager.beginTransaction();
switch (animationType) {
case 0:
break;
// case 1:
// ft.setCustomAnimations(R.animator.slide_in_left, R.animator.slide_out_left, R.animator.slide_in_right, R.animator.slide_out_right);
// break;
// case 2:
// ft.setCustomAnimations(R.animator.slide_in_down, R.animator.slide_out_down, R.animator.slide_in_up, R.animator.slide_out_up);
// break;
// case 3:
// ft.setCustomAnimations(R.animator.fraggy_enter, R.animator.fraggy_exit, R.animator.fraggy_pop_enter, R.animator.fraggy_pop_exit);
// break;
default:
ft.setCustomAnimations(R.animator.fade_enter, R.animator.fade_exit, R.animator.fade_enter, R.animator.fade_exit);
break;
}
ft.replace(resID, fragment);
if (addToBackStack)
ft.addToBackStack(null);
ft.commit();
}
public static float screenDensity(Context context) {
// assuming it's faster to cache this
if (sScreenDensity == 0)
sScreenDensity = context.getResources().getDisplayMetrics().density;
return sScreenDensity;
}
public static Point getDisplaySize(Context context) {
return new Point(context.getResources().getDisplayMetrics().widthPixels, context.getResources()
.getDisplayMetrics().heightPixels);
}
public static float pxToDp(float px, Context context) {
return px / screenDensity(context);
}
public static float dpToPx(float dp, Context context) {
return dp * screenDensity(context);
}
public static int randomColor() {
Random random = new Random();
return Color.rgb(random.nextInt(255), random.nextInt(255), random.nextInt(255));
}
public static void vibrate(Context context) {
Vibrator vibe = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE);
vibe.vibrate(5);
}
public static String millisecondsToDuration(long milliseconds) {
SimpleDateFormat df = new SimpleDateFormat("HH:mm:ss");
df.setTimeZone(java.util.TimeZone.getTimeZone("GMT"));
String result = df.format(milliseconds);
// strip off 00: from begining if present
final String zeros = "00:";
if (result.startsWith(zeros))
result = result.substring(zeros.length());
return result;
}
public static String feedbackEmailAddress() {
return Constants.feedbackEmailAddress;
}
public static boolean onMainThread() {
// can also use this
// Looper.getMainLooper().getThread() == Thread.currentThread();
return Looper.myLooper() == Looper.getMainLooper();
}
public static Bitmap drawableToBitmap(Drawable drawable, int width, int height) {
if (drawable instanceof BitmapDrawable) {
return ((BitmapDrawable) drawable).getBitmap();
}
// original code used this for width and height, but our icons don't have Intrinsic size
// drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight()
Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
drawable.draw(canvas);
return bitmap;
}
public static String durationToDuration(String isoDuration) {
Period p = mFormatter.parsePeriod(isoDuration);
Seconds s = p.toStandardSeconds();
return millisecondsToDuration(s.getSeconds() * 1000);
}
public static Bitmap drawTextToBitmap(Context gContext, int width, int height, String gText, int textColor, int shadowColor, int fontSizeInDP, int fillColor, int fillRadius, int strokeColor, float strokeWidth) {
Resources resources = gContext.getResources();
float scale = resources.getDisplayMetrics().density;
int fontSize = (int) (fontSizeInDP * scale);
Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
// ---------------
// draw fill
if (fillColor != 0) {
paint.setStyle(Paint.Style.FILL);
paint.setColor(fillColor);
canvas.drawRoundRect(new RectF(0, 0, width, height), fillRadius, fillRadius, paint);
}
if (strokeColor != 0) {
paint.setStyle(Paint.Style.STROKE);
paint.setColor(strokeColor);
paint.setStrokeWidth(strokeWidth);
canvas.drawRoundRect(new RectF(0, 0, width, height), fillRadius, fillRadius, paint);
}
// ---------------
// draw text
paint.setStyle(Paint.Style.FILL_AND_STROKE);
paint.setColor(textColor);
paint.setTextSize(fontSize);
paint.setShadowLayer(1f, 0f, 1f, shadowColor);
// draw text to the Canvas center
Rect bounds = new Rect();
paint.setTextAlign(Paint.Align.CENTER);
paint.getTextBounds(gText, 0, gText.length(), bounds);
int x = (bitmap.getWidth()) / 2;
int y = (bitmap.getHeight() + bounds.height()) / 2;
canvas.drawText(gText, x, y, paint);
boolean debugging = false;
if (debugging) {
int xx = (bitmap.getWidth()) / 2;
int yy = (bitmap.getHeight()) / 2;
paint = new Paint(Paint.ANTI_ALIAS_FLAG);
paint.setColor(0xff880099);
canvas.drawRect(new Rect(xx - 4, yy - 4, xx + 8, yy + 8), paint);
}
return bitmap;
}
public static String getApplicationVersion(Context context, boolean includeBuild) {
String result = "";
try {
PackageInfo pInfo = context.getPackageManager().getPackageInfo(context.getPackageName(), 0);
result = "v" + pInfo.versionName;
if (includeBuild)
result += " (" + pInfo.versionCode + ")";
} catch (Throwable t) {
}
return result;
}
public static String getApplicationName(Context context) {
String appName = "Application";
try {
String packageName = context.getPackageName();
PackageManager pm = context.getPackageManager();
ApplicationInfo ai = pm.getApplicationInfo(packageName, 0);
if (ai != null)
appName = (String) pm.getApplicationLabel(ai);
} catch (Exception e) {
}
return appName;
}
public static Uri getCompanyPlayStoreUri() {
return Uri.parse(Constants.otherAppsURL);
}
// using apprater for this, but if we ever get rid of that, this is the code
public static Uri getApplicationPlayStoreUri(Context context) {
return Uri.parse("market://details?id=" + getApplicationPackageName(context));
}
public static String getApplicationPackageName(Context context) {
return context.getApplicationInfo().packageName;
}
public static void sendFeedbackEmail(Activity activity) {
Intent i = new Intent(Intent.ACTION_SEND);
i.setType("message/rfc822");
i.putExtra(Intent.EXTRA_EMAIL, new String[]{feedbackEmailAddress()});
i.putExtra(Intent.EXTRA_SUBJECT, "Feedback for " + getApplicationName(activity));
i.putExtra(Intent.EXTRA_TEXT, "");
try {
activity.startActivity(Intent.createChooser(i, "Send mail..."));
} catch (android.content.ActivityNotFoundException ex) {
Toast.makeText(activity, "There are no email clients installed.", Toast.LENGTH_SHORT).show();
}
}
public static void textViewColorChanger(ViewGroup group, int textColor, int hintColor) {
for (int i = 0; i < group.getChildCount(); i++) {
View child = group.getChildAt(i);
if (child instanceof TextView) {
((TextView) child).setTextColor(textColor);
((TextView) child).setHintTextColor(hintColor);
} else if (child instanceof ViewGroup)
textViewColorChanger((ViewGroup) child, textColor, hintColor);
}
}
public static String condenseWhiteSpace(String inString) {
// trim text and then replace all occurrences of one or more than one whitespace character
// (including tabs, line breaks, etc) by one single whitespace
return inString.trim().replaceAll("\\s+", " ");
}
public static boolean isPortrait(Context context) {
return (context.getResources()
.getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT);
}
public static void openWebPage(Activity activity, Uri webpage) {
Intent intent = new Intent(Intent.ACTION_VIEW, webpage);
if (intent.resolveActivity(activity.getPackageManager()) != null) {
activity.startActivity(intent);
}
}
public static boolean isKitKatOrNewer() {
return (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT);
}
public static boolean isJellyBean() {
return (Build.VERSION.SDK_INT == Build.VERSION_CODES.JELLY_BEAN);
}
// interface for getting results
public interface StringResultListener {
public void onResults(StringResultListener listener, String result);
}
}