protected void paint(AbstractTnGraphics graphics) {
    NavBottomStatusBarHelper.getInstance().drawBackground(graphics, this, false);

    if (isDisabled) {
      return;
    }

    int width = this.getWidth();
    int height = this.getHeight();

    AbstractTnFont fontNumber =
        UiStyleManager.getInstance().getFont(UiStyleManager.FONT_SPEED_LIMIT_NUMBER);
    AbstractTnFont fontUnit = UiStyleManager.getInstance().getFont(UiStyleManager.FONT_SPEED_LIMIT);

    int gap = (height - fontNumber.getHeight() - fontUnit.getHeight()) / 3;
    int xNumber = (width - fontNumber.stringWidth(speedStr)) / 2;
    int yNumber = (height - fontNumber.getHeight() - fontUnit.getHeight() - gap) / 2;

    int xUnit = (width - fontUnit.stringWidth(unitStr)) / 2;
    int yUnit = yNumber + fontNumber.getHeight() + gap;

    graphics.setColor(UiStyleManager.getInstance().getColor(UiStyleManager.TEXT_COLOR_WH));
    graphics.setFont(fontNumber);
    graphics.drawString(
        speedStr, xNumber, yNumber, AbstractTnGraphics.LEFT | AbstractTnGraphics.TOP);
    graphics.setFont(fontUnit);
    graphics.drawString(unitStr, xUnit, yUnit, AbstractTnGraphics.LEFT | AbstractTnGraphics.TOP);
  }
  public void updateSpeedLimit(boolean isSpeedLimitExceeded, int speedLimit) {
    Preference speedLimits =
        ((DaoManager) DaoManager.getInstance())
            .getPreferenceDao()
            .getPreference(Preference.ID_PREFERENCE_SPEED_LIMITS);
    isDisabled = speedLimits != null && speedLimits.getIntValue() == Preference.SPEED_LIMIT_OFF;

    int speedLimitFeature =
        FeaturesManager.getInstance().getStatus(FeaturesManager.FEATURE_CODE_NAV_SPEED_LIMIT);
    boolean isEnabled =
        speedLimitFeature == FeaturesManager.FE_ENABLED
            || speedLimitFeature == FeaturesManager.FE_PURCHASED;
    isDisabled = isDisabled || !isEnabled;
    int routeStyle =
        DaoManager.getInstance().getTripsDao().getIntValue(Preference.ID_PREFERENCE_ROUTETYPE);
    boolean isInPedestrian = routeStyle == Route.ROUTE_PEDESTRIAN ? true : false;
    isDisabled = isDisabled || isInPedestrian;
    if (isDisabled) {
      NavBottomStatusBarHelper.getInstance().setIsOverSpeedLimit(false);
      requestPaint();
      return;
    }

    Preference preference =
        ((DaoManager) DaoManager.getInstance())
            .getPreferenceDao()
            .getPreference(Preference.ID_PREFERENCE_DISTANCEUNIT);

    if (preference != null && preference.getIntValue() == Preference.UNIT_USCUSTOM) {
      // mph
      currentSpeedLimit = DataUtil.kmToMileInHighAccuracy(speedLimit);
      // currentUnit = "MPH";
      currentUnit =
          ResourceManager.getInstance()
              .getCurrentBundle()
              .getString(IStringNav.RES_SPEED_LIMIT, IStringNav.FAMILY_NAV);
    } else {
      // kph
      currentSpeedLimit = speedLimit;
      // currentUnit = "KPH";
      currentUnit =
          ResourceManager.getInstance()
              .getCurrentBundle()
              .getString(IStringNav.RES_SPEED_LIMIT, IStringNav.FAMILY_NAV);
    }

    if (speedLimit <= 0) {
      speedStr = "---";
      unitStr = currentUnit;
      NavBottomStatusBarHelper.getInstance().setIsOverSpeedLimit(false);
      requestPaint();
      return;
    }

    if (isSpeedLimitExceeded) {
      NavBottomStatusBarHelper.getInstance().setIsOverSpeedLimit(true);
    } else {
      NavBottomStatusBarHelper.getInstance().setIsOverSpeedLimit(false);
    }

    speedStr = currentSpeedLimit + "";
    unitStr = currentUnit;

    requestPaint();
  }