package com.bootstrap.utils; import android.annotation.SuppressLint; import android.content.Context; import android.content.Intent; import android.content.pm.PackageInfo; import android.content.pm.ResolveInfo; import android.content.res.Resources; import android.database.Cursor; import android.graphics.Point; import android.os.Build; import android.provider.Settings; import android.text.TextUtils; import android.util.DisplayMetrics; import android.util.TypedValue; import android.view.Display; import android.view.WindowManager; import java.util.List; @SuppressLint("NewApi") public final class AndroidUtils { private static Boolean hasNavBar; private AndroidUtils() { } public static void safeCloseCursor(final Cursor cursor) { if (cursor != null) { cursor.close(); } } public static boolean gtIceCream() { return Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH; } public static boolean gtJellyBean() { return Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN; } public static boolean gtKitKat() { return Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT; } public static boolean gtLollipop() { return Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP; } public static boolean ltJellyBean() { return Build.VERSION.SDK_INT <= Build.VERSION_CODES.JELLY_BEAN; } private static int statusBarHeight(final Context context) { int result = 0; final Resources resources = context.getResources(); final int resourceId = resources.getIdentifier("status_bar_height", "dimen", "android"); if (resourceId > 0) { result = resources.getDimensionPixelSize(resourceId); } return result; } public static int statusBarCorrection(final Context context) { return (gtKitKat()) ? statusBarHeight(context) : 0; } public static int navBarCorrection(final Context context) { return AndroidUtils.deviceHasNavBar(context) ? AndroidUtils.navigationBarHeight(context) : 0; } public static boolean deviceHasNavBar(final Context context) { if (hasNavBar == null) { if (AndroidUtils.gtKitKat()) { final DisplayMetrics metrics = context.getResources().getDisplayMetrics(); final Display display = ((WindowManager) context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay(); final Point point = new Point(); display.getRealSize(point); hasNavBar = metrics.heightPixels != point.y; } else { hasNavBar = false; } } return hasNavBar; } public static int actionBarHeight(final Context context) { final TypedValue tv = new TypedValue(); if (context.getTheme().resolveAttribute(android.R.attr.actionBarSize, tv, true)) { return TypedValue.complexToDimensionPixelSize(tv.data, context.getResources().getDisplayMetrics()); } return 0; } public static boolean isNotificationAccessGranted(final Context context) { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR2) { return false; } else { final String enabledNotificationListeners = Settings.Secure.getString(context.getContentResolver(), "enabled_notification_listeners"); return (!TextUtils.isEmpty(enabledNotificationListeners) && enabledNotificationListeners.contains(context.getPackageName())); } } public static int getVersionCode(final Context context) { try { final PackageInfo packageInfo = context.getPackageManager().getPackageInfo(context.getPackageName(), 0); return packageInfo.versionCode; } catch (final Exception e) { // ignore } return 0; } public static String getVersionName(final Context context) { try { final PackageInfo packageInfo = context.getPackageManager().getPackageInfo(context.getPackageName(), 0); return packageInfo.versionName; } catch (final Exception e) { // ignore } return ""; } public static String getEnvironmentInfo(final Context context) { String info = Build.MANUFACTURER + " " + Build.MODEL + ", API level " + Build.VERSION.SDK_INT; try { final PackageInfo packageInfo = context.getPackageManager().getPackageInfo(context.getPackageName(), 0); info += ", version " + packageInfo.versionName + "(" + packageInfo.versionCode + ")"; } catch (final Exception e) { // ignore } return info; } public static boolean canResolveIntent(final Context context, final Intent intent) { final List<ResolveInfo> info = context.getPackageManager().queryIntentActivities(intent, 0); return info.size() > 0; } public static int dpToPx(final int dp, final DisplayMetrics displayMetrics) { return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, displayMetrics); } private static int navigationBarHeight(final Context context) { int resourceId = context.getResources().getIdentifier("navigation_bar_height", "dimen", "android"); if (resourceId > 0) { return context.getResources().getDimensionPixelSize(resourceId); } return 0; } }