Program: 970
Project: 970
Buggy source:
/** 
 * This method determines which menu items get to be 'action items' that will appear in an action bar and which items should be 'overflow items' in a secondary menu. The rules are as follows: <p>Items are considered for inclusion in the order specified within the menu. There is a limit of mMaxActionItems as a total count, optionally including the overflow menu button itself. This is a soft limit; if an item shares a group ID with an item previously included as an action item, the new item will stay with its group and become an action item itself even if it breaks the max item count limit. This is done to limit the conceptual complexity of the items presented within an action bar. Only a few unrelated concepts should be presented to the user in this space, and groups are treated as a single concept. <p>There is also a hard limit of consumed measurable space: mActionWidthLimit. This limit may be broken by a single item that exceeds the remaining space, but no further items may be added. If an item that is part of a group cannot fit within the remaining measured width, the entire group will be demoted to overflow. This is done to ensure room for navigation and other affordances in the action bar as well as reduce general UI clutter. <p>The space freed by demoting a full group cannot be consumed by future menu items. Once items begin to overflow, all future items become overflow items as well. This is to avoid inadvertent reordering that may break the app's intended design.
 */
public void flagActionItems(){
  if (!mIsActionItemsStale) {
    return;
  }
  boolean flagged=false;
  for (  WeakReference<MenuPresenter> ref : mPresenters) {
    final MenuPresenter presenter=ref.get();
    if (presenter == null) {
      mPresenters.remove(ref);
    }
 else {
      flagged|=presenter.flagActionItems();
    }
  }
  if (flagged) {
    mActionItems.clear();
    mNonActionItems.clear();
    ArrayList<MenuItemImpl> visibleItems=getVisibleItems();
    final int itemsSize=visibleItems.size();
    for (int i=0; i < itemsSize; i++) {
      MenuItemImpl item=visibleItems.get(i);
      if (item.isActionButton()) {
        mActionItems.add(item);
      }
 else {
        mNonActionItems.add(item);
      }
    }
  }
 else {
    mActionItems.clear();
    mNonActionItems.clear();
    mNonActionItems.addAll(getVisibleItems());
  }
  mIsActionItemsStale=false;
}

Fixed version (ground truth):
/** 
 * This method determines which menu items get to be 'action items' that will appear in an action bar and which items should be 'overflow items' in a secondary menu. The rules are as follows: <p>Items are considered for inclusion in the order specified within the menu. There is a limit of mMaxActionItems as a total count, optionally including the overflow menu button itself. This is a soft limit; if an item shares a group ID with an item previously included as an action item, the new item will stay with its group and become an action item itself even if it breaks the max item count limit. This is done to limit the conceptual complexity of the items presented within an action bar. Only a few unrelated concepts should be presented to the user in this space, and groups are treated as a single concept. <p>There is also a hard limit of consumed measurable space: mActionWidthLimit. This limit may be broken by a single item that exceeds the remaining space, but no further items may be added. If an item that is part of a group cannot fit within the remaining measured width, the entire group will be demoted to overflow. This is done to ensure room for navigation and other affordances in the action bar as well as reduce general UI clutter. <p>The space freed by demoting a full group cannot be consumed by future menu items. Once items begin to overflow, all future items become overflow items as well. This is to avoid inadvertent reordering that may break the app's intended design.
 */
public void flagActionItems(){
  final ArrayList<MenuItemImpl> visibleItems=getVisibleItems();
  if (!mIsActionItemsStale) {
    return;
  }
  boolean flagged=false;
  for (  WeakReference<MenuPresenter> ref : mPresenters) {
    final MenuPresenter presenter=ref.get();
    if (presenter == null) {
      mPresenters.remove(ref);
    }
 else {
      flagged|=presenter.flagActionItems();
    }
  }
  if (flagged) {
    mActionItems.clear();
    mNonActionItems.clear();
    final int itemsSize=visibleItems.size();
    for (int i=0; i < itemsSize; i++) {
      MenuItemImpl item=visibleItems.get(i);
      if (item.isActionButton()) {
        mActionItems.add(item);
      }
 else {
        mNonActionItems.add(item);
      }
    }
  }
 else {
    mActionItems.clear();
    mNonActionItems.clear();
    mNonActionItems.addAll(getVisibleItems());
  }
  mIsActionItemsStale=false;
}