docs: private int buildDropDown() {        
          int otherHeights = 0;
  
          if (mDropDownList == null) {
          	ViewGroup dropDownView;
              Context context = mContext;
  
              /**
               * This Runnable exists for the sole purpose of checking if the view layout has got
               * completed and if so call showDropDown to display the drop down. This is used to show
               * the drop down as soon as possible after user opens up the search dialog, without
               * waiting for the normal UI pipeline to do it's job which is slower than this method.
               */
              mShowDropDownRunnable = new Runnable() {
                  public void run() {
                      // View layout should be all done before displaying the drop down.
                      View view = getAnchorView();
                      if (view != null && view.getWindowToken() != null) {
                          show();
                      }
                  }
              };
  
              mDropDownList = new DropDownListView(context, !mModal);
              if (mDropDownListHighlight != null) {
                  mDropDownList.setSelector(mDropDownListHighlight);
              }
              mDropDownList.setAdapter(mAdapter);
              mDropDownList.setOnItemClickListener(mItemClickListener);
              mDropDownList.setFocusable(true);
              mDropDownList.setFocusableInTouchMode(true);
              mDropDownList.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
                  public void onItemSelected(AdapterView<?> parent, View view,
                          int position, long id) {
  
                      if (position != -1) {
                          DropDownListView dropDownList = mDropDownList;
  
                          if (dropDownList != null) {
                              dropDownList.mListSelectionHidden = false;
                          }
                      }
                  }
  
                  public void onNothingSelected(AdapterView<?> parent) {
                  }
              });
              mDropDownList.setOnScrollListener(mScrollListener);
  
              if (mItemSelectedListener != null) {
                  mDropDownList.setOnItemSelectedListener(mItemSelectedListener);
              }
  
              dropDownView = mDropDownList;
  
              View hintView = mPromptView;
              if (hintView != null) {
                  // if a hint has been specified, we accomodate more space for it and
                  // add a text view in the drop down menu, at the bottom of the list
                  LinearLayout hintContainer = new LinearLayout(context);
                  hintContainer.setOrientation(LinearLayout.VERTICAL);
  
                  LinearLayout.LayoutParams hintParams = new LinearLayout.LayoutParams(
                          ViewGroup.LayoutParams.MATCH_PARENT, 0, 1.0f
                  );
  
                  switch (mPromptPosition) {
                      case POSITION_PROMPT_BELOW:
                          hintContainer.addView(dropDownView, hintParams);
                          hintContainer.addView(hintView);
                          break;
  
                      case POSITION_PROMPT_ABOVE:
                          hintContainer.addView(hintView);
                          hintContainer.addView(dropDownView, hintParams);
                          break;
  
                      default:
                          Log.e(TAG, "Invalid hint position " + mPromptPosition);
                          break;
                  }
  
                  // measure the hint's height to find how much more vertical space
                  // we need to add to the drop down's height
                  int widthSpec = MeasureSpec.makeMeasureSpec(mDropDownWidth, MeasureSpec.AT_MOST);
                  int heightSpec = MeasureSpec.UNSPECIFIED;
                  hintView.measure(widthSpec, heightSpec);
  
                  hintParams = (LinearLayout.LayoutParams) hintView.getLayoutParams();
                  otherHeights = hintView.getMeasuredHeight() + hintParams.topMargin
                          + hintParams.bottomMargin;
  
                  dropDownView = hintContainer;
              }
              
              mPopup.setContentView(dropDownView);            
              
          } else {
              final View view = mPromptView;
              if (view != null) {
                  LinearLayout.LayoutParams hintParams =
                          (LinearLayout.LayoutParams) view.getLayoutParams();
                  otherHeights = view.getMeasuredHeight() + hintParams.topMargin
                          + hintParams.bottomMargin;
              }
          }
  
          // getMaxAvailableHeight() subtracts the padding, so we put it back
          // to get the available height for the whole window
          int padding = 0;
          Drawable background = mPopup.getBackground();
          if (background != null) {
              background.getPadding(mTempRect);
              padding = mTempRect.top + mTempRect.bottom;
  
              // If we don't have an explicit vertical offset, determine one from the window
              // background so that content will line up.
              if (!mDropDownVerticalOffsetSet) {
                  mDropDownVerticalOffset = -mTempRect.top;
              }
          } else {
              mTempRect.setEmpty();
          }
  
          int systemBarsReservedSpace = 0;
          if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
              //  getMaxAvailableHeight() on Lollipop seems to ignore the system bars.
              systemBarsReservedSpace = Math.max(
                      getSystemBarHeight("status_bar_height"),
                      getSystemBarHeight("navigation_bar_height")
              );
          }
  
          // Max height available on the screen for a popup.
          boolean ignoreBottomDecorations =
                  mPopup.getInputMethodMode() == PopupWindow.INPUT_METHOD_NOT_NEEDED;
          final int maxHeight = mPopup.getMaxAvailableHeight(
                  getAnchorView(), mDropDownVerticalOffset /*, ignoreBottomDecorations*/)
                  - systemBarsReservedSpace;
          
          if (mDropDownAlwaysVisible || mDropDownHeight == ViewGroup.LayoutParams.MATCH_PARENT) {
              return maxHeight + padding;
          }
  
          final int childWidthSpec;
          switch (mDropDownWidth) {
              case ViewGroup.LayoutParams.WRAP_CONTENT:
                  childWidthSpec = MeasureSpec.makeMeasureSpec(
                          mContext.getResources().getDisplayMetrics().widthPixels -
                                  (mTempRect.left + mTempRect.right),
                          MeasureSpec.AT_MOST);
                  break;
              case ViewGroup.LayoutParams.MATCH_PARENT:
                  childWidthSpec = MeasureSpec.makeMeasureSpec(
                          mContext.getResources().getDisplayMetrics().widthPixels -
                                  (mTempRect.left + mTempRect.right),
                          MeasureSpec.EXACTLY);
                  break;
              default:
                  childWidthSpec = MeasureSpec.makeMeasureSpec(mDropDownWidth, MeasureSpec.EXACTLY);
                  break;
          }
  
          final int listContent = mDropDownList.measureHeightOfChildrenCompat(childWidthSpec,
                  0, DropDownListView.NO_POSITION, maxHeight - otherHeights, -1);
          // add padding only if the list has items in it, that way we don't show
          // the popup if it is not needed
          if (listContent > 0) otherHeights += padding;
  
          return listContent + otherHeights;
      }