RoboSwag-components/src/main/java/org/roboswag/components/utils/UiUtils.java

117 lines
4.6 KiB
Java

package org.roboswag.components.utils;
import android.app.Activity;
import android.content.Context;
import android.os.Build;
import android.support.annotation.LayoutRes;
import android.support.annotation.NonNull;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.util.DisplayMetrics;
import android.util.TypedValue;
import android.view.Display;
import android.view.KeyCharacterMap;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewConfiguration;
import android.view.ViewGroup;
import org.roboswag.components.navigation.AbstractBaseFragment;
import rx.functions.Func1;
/**
* Created by Gavriil Sitnikov on 13/11/2015.
* TODO: fill description
*/
public final class UiUtils {
// to enable ripple effect on tap
public static final long RIPPLE_EFFECT_DELAY = 250;
private static final int MAX_METRICS_TRIES_COUNT = 5;
@NonNull
public static DisplayMetrics getDisplayMetrics(@NonNull final Context context) {
DisplayMetrics result = context.getResources().getDisplayMetrics();
// it is needed to avoid bug with invalid metrics when user restore application from other application
int metricsTryNumber = 0;
while (metricsTryNumber < MAX_METRICS_TRIES_COUNT && (result.heightPixels <= 0 || result.widthPixels <= 0)) {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
return result;
}
result = context.getResources().getDisplayMetrics();
metricsTryNumber++;
}
return result;
}
public static int getActionBarHeight(@NonNull final Context context) {
return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 56, getDisplayMetrics(context));
}
public static int getStatusBarHeight(@NonNull final Context context) {
final int resourceId = context.getResources().getIdentifier("status_bar_height", "dimen", "android");
return resourceId > 0 ? context.getResources().getDimensionPixelSize(resourceId) : 0;
}
public static int getNavigationBarHeight(@NonNull final Context context) {
final int resourceId = context.getResources().getIdentifier("navigation_bar_height", "dimen", "android");
return resourceId > 0 ? context.getResources().getDimensionPixelSize(resourceId) : 0;
}
@NonNull
public static View inflate(@LayoutRes final int layoutId, @NonNull final ViewGroup parent) {
return LayoutInflater.from(parent.getContext()).inflate(layoutId, parent, false);
}
@NonNull
public static View inflateAndAdd(@LayoutRes final int layoutId, @NonNull final ViewGroup parent) {
return LayoutInflater.from(parent.getContext()).inflate(layoutId, parent, true);
}
public static boolean tryForeachFragment(@NonNull final FragmentManager fragmentManager,
@NonNull final Func1<AbstractBaseFragment, Boolean> actionOnChild) {
if (fragmentManager.getFragments() == null) {
return false;
}
boolean result = false;
for (final Fragment fragment : fragmentManager.getFragments()) {
if (fragment != null
&& fragment.isResumed()
&& fragment instanceof AbstractBaseFragment) {
result = result || actionOnChild.call((AbstractBaseFragment) fragment);
}
}
return result;
}
//http://stackoverflow.com/questions/14853039/how-to-tell-whether-an-android-device-has-hard-keys/14871974#14871974
public static boolean hasSoftKeys(@NonNull final Activity activity) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
final Display display = activity.getWindowManager().getDefaultDisplay();
final DisplayMetrics realDisplayMetrics = new DisplayMetrics();
display.getRealMetrics(realDisplayMetrics);
final DisplayMetrics displayMetrics = new DisplayMetrics();
display.getMetrics(displayMetrics);
return (realDisplayMetrics.widthPixels - displayMetrics.widthPixels) > 0
|| (realDisplayMetrics.heightPixels - displayMetrics.heightPixels) > 0;
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
final boolean hasMenuKey = ViewConfiguration.get(activity).hasPermanentMenuKey();
final boolean hasBackKey = KeyCharacterMap.deviceHasKey(KeyEvent.KEYCODE_BACK);
return !hasMenuKey && !hasBackKey;
}
return false;
}
private UiUtils() {
}
}