@Override
 public void onSubUiVisibilityChanged(boolean isVisible) {
   if (isVisible) {
     // Not a submenu, but treat it like one.
     super.onSubMenuSelected(null);
   } else {
     mMenu.close(false);
   }
 }
  @Override
  public void updateMenuView(boolean cleared) {
    super.updateMenuView(cleared);

    if (mMenu != null) {
      final ArrayList<MenuItemImpl> actionItems = mMenu.getActionItems();
      final int count = actionItems.size();
      for (int i = 0; i < count; i++) {
        final ActionProvider provider = actionItems.get(i).getActionProvider();
        if (provider != null) {
          provider.setSubUiVisibilityListener(this);
        }
      }
    }

    final ArrayList<MenuItemImpl> nonActionItems = mMenu != null ? mMenu.getNonActionItems() : null;

    boolean hasOverflow = false;
    if (mReserveOverflow && nonActionItems != null) {
      final int count = nonActionItems.size();
      if (count == 1) {
        hasOverflow = !nonActionItems.get(0).isActionViewExpanded();
      } else {
        hasOverflow = count > 0;
      }
    }

    if (hasOverflow) {
      if (mOverflowButton == null) {
        mOverflowButton = new OverflowMenuButton(mSystemContext);
      }
      ViewGroup parent = (ViewGroup) mOverflowButton.getParent();
      if (parent != mMenuView) {
        if (parent != null) {
          parent.removeView(mOverflowButton);
        }
        ActionMenuView menuView = (ActionMenuView) mMenuView;
        menuView.addView(mOverflowButton, menuView.generateOverflowButtonLayoutParams());
      }
    } else if (mOverflowButton != null && mOverflowButton.getParent() == mMenuView) {
      ((ViewGroup) mMenuView).removeView(mOverflowButton);
    }

    ((ActionMenuView) mMenuView).setOverflowReserved(mReserveOverflow);
  }
  @Override
  public void initForMenu(Context context, MenuBuilder menu) {
    super.initForMenu(context, menu);

    final Resources res = context.getResources();

    if (!mReserveOverflowSet) {
      mReserveOverflow = reserveOverflow(mContext);
    }

    if (!mWidthLimitSet) {
      mWidthLimit = res.getDisplayMetrics().widthPixels / 2;
    }

    // Measure for initial configuration
    if (!mMaxItemsSet) {
      mMaxItems =
          getResources_getInteger(
              context,
              ResUtil.getInstance(context)
                  .getInteger(
                      "abs__max_action_buttons") /* CT_Traffic_R.integer.abs__max_action_buttons()*/);
    }

    int width = mWidthLimit;
    if (mReserveOverflow) {
      if (mOverflowButton == null) {
        mOverflowButton = new OverflowMenuButton(mSystemContext);
        final int spec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);
        mOverflowButton.measure(spec, spec);
      }
      width -= mOverflowButton.getMeasuredWidth();
    } else {
      mOverflowButton = null;
    }

    mActionItemWidthLimit = width;

    mMinCellSize = (int) (ActionMenuView.MIN_CELL_SIZE * res.getDisplayMetrics().density);

    // Drop a scrap view as it may no longer reflect the proper context/config.
    mScrapActionButtonView = null;
  }
  /**
   * Display the overflow menu if one is present.
   *
   * @return true if the overflow menu was shown, false otherwise.
   */
  public boolean showOverflowMenu() {
    if (mReserveOverflow
        && !isOverflowMenuShowing()
        && mMenu != null
        && mMenuView != null
        && mPostedOpenRunnable == null
        && !mMenu.getNonActionItems().isEmpty()) {
      OverflowPopup popup = new OverflowPopup(mContext, mMenu, mOverflowButton, true);
      mPostedOpenRunnable = new OpenOverflowRunnable(popup);
      // Post this for later; we might still need a layout for the anchor to be right.
      ((View) mMenuView).post(mPostedOpenRunnable);

      // ActionMenuPresenter uses null as a callback argument here
      // to indicate overflow is opening.
      super.onSubMenuSelected(null);

      return true;
    }
    return false;
  }
  public boolean onSubMenuSelected(SubMenuBuilder subMenu) {
    if (!subMenu.hasVisibleItems()) return false;

    SubMenuBuilder topSubMenu = subMenu;
    while (topSubMenu.getParentMenu() != mMenu) {
      topSubMenu = (SubMenuBuilder) topSubMenu.getParentMenu();
    }
    View anchor = findViewForItem(topSubMenu.getItem());
    if (anchor == null) {
      if (mOverflowButton == null) return false;
      anchor = mOverflowButton;
    }

    mOpenSubMenuId = subMenu.getItem().getItemId();
    mActionButtonPopup = new ActionButtonSubmenu(mContext, subMenu);
    mActionButtonPopup.setAnchorView(anchor);
    mActionButtonPopup.show();
    super.onSubMenuSelected(subMenu);
    return true;
  }
 @Override
 public void onCloseMenu(MenuBuilder menu, boolean allMenusAreClosing) {
   dismissPopupMenus();
   super.onCloseMenu(menu, allMenusAreClosing);
 }