package com.luciofm.droidcon.ifican.util;
import android.content.Context;
import android.os.Handler;
import android.os.SystemClock;
import android.util.DisplayMetrics;
import android.view.MotionEvent;
import android.view.View;
import android.view.WindowManager;
import pl.droidsonroids.gif.GifDrawable;
import pl.droidsonroids.gif.GifImageView;
/**
* Created by luciofm on 5/25/14.
*/
public class Utils {
public static final int ANIM_DURATION = 800;
private Utils() {
}
public static float pixelsToSp(Context context, float px) {
float scaledDensity = context.getResources().getDisplayMetrics().scaledDensity;
return px/scaledDensity;
}
public static void startGif(GifImageView view) {
GifDrawable drawable = (GifDrawable) view.getDrawable();
if (!drawable.isPlaying()) {
drawable.reset();
drawable.start();
}
}
public static void startGifDelayed(final GifImageView view) {
startGifDelayed(view, 300);
}
public static void startGifDelayed(final GifImageView view, long delay) {
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
if (view == null)
return;
GifDrawable drawable = (GifDrawable) view.getDrawable();
if (!drawable.isPlaying()) {
drawable.reset();
drawable.start();
}
}
}, delay);
}
public static void stopGif(GifImageView... views) {
for (GifImageView view : views) {
GifDrawable drawable = (GifDrawable) view.getDrawable();
if (drawable.isPlaying())
drawable.stop();
}
}
public static void resetGif(GifImageView... views) {
for (GifImageView view : views) {
GifDrawable drawable = (GifDrawable) view.getDrawable();
drawable.reset();
}
}
public static void dispatchTouch(View view) {
dispatchTouch(view, 200);
}
public static void dispatchTouch(final View view, final long duration) {
final long downTime = SystemClock.uptimeMillis();
final long eventTime = SystemClock.uptimeMillis();
final float x = view.getWidth() / 3;//0.0f;
final float y = view.getHeight() / 3;//0.0f;
// List of meta states found here: developer.android.com/reference/android/view/KeyEvent.html#getMetaState()
final int metaState = 0;
MotionEvent motionEvent = MotionEvent.obtain(downTime,
eventTime,
MotionEvent.ACTION_DOWN,
x,
y,
metaState);
// Dispatch touch event to view
view.dispatchTouchEvent(motionEvent);
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
MotionEvent motionEvent = MotionEvent.obtain(downTime + duration,
eventTime + duration,
MotionEvent.ACTION_UP,
x,
y,
metaState);
view.dispatchTouchEvent(motionEvent);
}
}, duration);
}
public static long calcDuration(int position) {
int pos = position;
if (pos >= 4)
pos -= 4;
switch (pos) {
case 1:
return (long) (ANIM_DURATION + (ANIM_DURATION * 0.2f));
case 2:
return (long) (ANIM_DURATION + (ANIM_DURATION * 0.3f));
case 3:
return (long) (ANIM_DURATION + (ANIM_DURATION * 0.4f));
default:
return ANIM_DURATION;
}
}
/**
* Returns a valid DisplayMetrics object
*
* @param context valid context
* @return DisplayMetrics object
*/
public static DisplayMetrics getDisplayMetrics(final Context context) {
final WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
final DisplayMetrics metrics = new DisplayMetrics();
windowManager.getDefaultDisplay().getMetrics(metrics);
return metrics;
}
/**
* Get the current device physical size in inches.
*
* @param context valid context.
* @return <b>double</b> device inches
*/
public static double getDeviceDiagonalSizeInInches(final Context context) {
final DisplayMetrics metrics = getDisplayMetrics(context);
final double xInches = (double) metrics.widthPixels / metrics.xdpi;
final double yInches = (double) metrics.heightPixels / metrics.ydpi;
return Math.sqrt(Math.pow(xInches, 2) + Math.pow(yInches, 2));
}
/**
* Get the current device physical display density.
*
* @param context valid context.
* @return <b>int</b> with DENSITY_LOW, DENSITY_MEDIUM, DENSITY_TV, DENSITY_HIGH, DENSITY_XHIGH,
* DENSITY_XXHIGH
*/
public static int getDisplayDensity(final Context context) {
// return (double)DisplayMetrics.DENSITY_DEFAULT * getDisplayMetrics(context).density;
return getDisplayMetrics(context).densityDpi;
}
public static int dpToPx(final Context context, final float dp) {
// Took from http://stackoverflow.com/questions/8309354/formula-px-to-dp-dp-to-px-android
final float scale = context.getResources().getDisplayMetrics().density;
return (int) ((dp * scale) + 0.5f);
}
public static int pxToDp(final Context context, final float px) {
final DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics();
return (int) ((px / displayMetrics.density) + 0.5);
}
public static int getScreenWidth(final Context context) {
if (context == null)
return 0;
return getDisplayMetrics(context).widthPixels;
}
public static int getScreenHeight(final Context context) {
if (context == null)
return 0;
return getDisplayMetrics(context).heightPixels;
}
}