content: package com.rsen.util;
  
  import android.annotation.TargetApi;
  import android.content.Context;
  import android.content.res.Configuration;
  import android.content.res.Resources;
  import android.os.Build;
  import android.util.TypedValue;
  import android.view.ViewConfiguration;
  
  import java.lang.reflect.Method;
  
  /**
   * Created by xy on 15/12/23.
   */
  public class SystemBarUtils {
  
      private static final String STATUS_BAR_HEIGHT_RES_NAME = "status_bar_height";
      private static final String NAV_BAR_HEIGHT_RES_NAME = "navigation_bar_height";
      private static final String NAV_BAR_HEIGHT_LANDSCAPE_RES_NAME = "navigation_bar_height_landscape";
      private static final String SHOW_NAV_BAR_RES_NAME = "config_showNavigationBar";
      private static final String NAV_BAR_WIDTH_RES_NAME = "navigation_bar_width";
  
      private static String sNavBarOverride;
  
      static {
          // Android allows a system property to override the presence of the
          // navigation bar.
          // Used by the emulator.
          // See
          // https://github.com/android/platform_frameworks_base/blob/master/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java#L1076
          if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
              try {
                  @SuppressWarnings("rawtypes")
                  Class c = Class.forName("android.os.SystemProperties");
                  @SuppressWarnings("unchecked")
                  Method m = c.getDeclaredMethod("get", String.class);
                  m.setAccessible(true);
                  sNavBarOverride = (String) m.invoke(null, "qemu.hw.mainkeys");
              } catch (Throwable e) {
                  sNavBarOverride = null;
              }
          }
      }
  
      @TargetApi(14)
      public static int getActionBarHeight(Context context) {
          int result = 0;
          if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
              TypedValue tv = new TypedValue();
              context.getTheme().resolveAttribute(android.R.attr.actionBarSize, tv, true);
              result = TypedValue.complexToDimensionPixelSize(tv.data, context.getResources().getDisplayMetrics());
          }
          return result;
      }
  
      public static boolean inPortarit(Resources res) {
          return (res.getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT);
      }
  
      @TargetApi(14)
      public static int getNavigationBarHeight(Context context) {
          Resources res = context.getResources();
          int result = 0;
          if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
              if (hasNavigationBar(context)) {
                  String key;
                  if (inPortarit(res)) {
                      key = NAV_BAR_HEIGHT_RES_NAME;
                  } else {
                      key = NAV_BAR_HEIGHT_LANDSCAPE_RES_NAME;
                  }
                  return getInternalDimensionSize(res, key);
              }
          }
          return result;
      }
  
      @TargetApi(14)
      public static int getNavigationBarWidth(Context context) {
          Resources res = context.getResources();
          int result = 0;
          if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
              if (hasNavigationBar(context)) {
                  return getInternalDimensionSize(res, NAV_BAR_WIDTH_RES_NAME);
              }
          }
          return result;
      }
      @TargetApi(14)
      public static boolean hasNavigationBar(Context context) {
          Resources res = context.getResources();
          int resourceId = res.getIdentifier(SHOW_NAV_BAR_RES_NAME, "bool", "android");
          if (resourceId != 0) {
              boolean hasNav = res.getBoolean(resourceId);
              // check override flag (see static block)
              if ("1".equals(sNavBarOverride)) {
                  hasNav = false;
              } else if ("0".equals(sNavBarOverride)) {
                  hasNav = true;
              }
              return hasNav;
          } else { // fallback
              return !ViewConfiguration.get(context).hasPermanentMenuKey();
          }
      }
  
      public static int getStatusBarHeight(Context context) {
          return getInternalDimensionSize(context.getResources(), STATUS_BAR_HEIGHT_RES_NAME);
      }
  
      private static int getInternalDimensionSize(Resources res, String key) {
          int result = 0;
          int resourceId = res.getIdentifier(key, "dimen", "android");
          if (resourceId > 0) {
              result = res.getDimensionPixelSize(resourceId);
          }
          return result;
      }
  
  }
  