/** Updates the buttons state. */
  private void updateAppearance() {
    // Expand overflow button.
    if (mAdapter.getCount() > 0) {
      mExpandActivityOverflowButton.setEnabled(true);
    } else {
      mExpandActivityOverflowButton.setEnabled(false);
    }
    // Default activity button.
    final int activityCount = mAdapter.getActivityCount();
    final int historySize = mAdapter.getHistorySize();
    if (activityCount > 0 && historySize > 0) {
      mDefaultActivityButton.setVisibility(VISIBLE);
      ResolveInfo activity = mAdapter.getDefaultActivity();
      PackageManager packageManager = mContext.getPackageManager();
      mDefaultActivityButtonImage.setImageDrawable(activity.loadIcon(packageManager));
      if (mDefaultActionButtonContentDescription != 0) {
        CharSequence label = activity.loadLabel(packageManager);
        String contentDescription =
            mContext.getString(mDefaultActionButtonContentDescription, label);
        mDefaultActivityButton.setContentDescription(contentDescription);
      }

      // Work-around for #415.
      mAdapter.setShowDefaultActivity(false, false);
    } else {
      mDefaultActivityButton.setVisibility(View.GONE);
    }
    // Activity chooser content.
    if (mDefaultActivityButton.getVisibility() == VISIBLE) {
      mActivityChooserContent.setBackgroundDrawable(mActivityChooserContentBackground);
    } else {
      mActivityChooserContent.setBackgroundDrawable(null);
      mActivityChooserContent.setPadding(0, 0, 0, 0);
    }
  }
 // AdapterView#OnItemClickListener
 public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
   ActivityChooserViewAdapter adapter = (ActivityChooserViewAdapter) parent.getAdapter();
   final int itemViewType = adapter.getItemViewType(position);
   switch (itemViewType) {
     case ActivityChooserViewAdapter.ITEM_VIEW_TYPE_FOOTER:
       {
         showPopupUnchecked(ActivityChooserViewAdapter.MAX_ACTIVITY_COUNT_UNLIMITED);
       }
       break;
     case ActivityChooserViewAdapter.ITEM_VIEW_TYPE_ACTIVITY:
       {
         dismissPopup();
         if (mIsSelectingDefaultActivity) {
           // The item at position zero is the default already.
           if (position > 0) {
             mAdapter.getDataModel().setDefaultActivity(position);
           }
         } else {
           // If the default target is not shown in the list, the first
           // item in the model is default action => adjust index
           position = mAdapter.getShowDefaultActivity() ? position : position + 1;
           Intent launchIntent = mAdapter.getDataModel().chooseActivity(position);
           if (launchIntent != null) {
             mContext.startActivity(launchIntent);
           }
         }
       }
       break;
     default:
       throw new IllegalArgumentException();
   }
 }
 /** {@inheritDoc} */
 public void setActivityChooserModel(ActivityChooserModel dataModel) {
   mAdapter.setDataModel(dataModel);
   if (isShowingPopup()) {
     dismissPopup();
     showPopup();
   }
 }
 @Override
 protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
   mActivityChooserContent.layout(0, 0, right - left, bottom - top);
   if (getListPopupWindow().isShowing()) {
     showPopupUnchecked(mAdapter.getMaxActivityCount());
   } else {
     dismissPopup();
   }
 }
  /**
   * Create a new instance.
   *
   * @param context The application environment.
   * @param attrs A collection of attributes.
   * @param defStyle The default style to apply to this view.
   */
  public ActivityChooserView(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    mContext = context;

    TypedArray attributesArray =
        context.obtainStyledAttributes(attrs, R.styleable.SherlockActivityChooserView, defStyle, 0);

    mInitialActivityCount =
        attributesArray.getInt(
            R.styleable.SherlockActivityChooserView_initialActivityCount,
            ActivityChooserViewAdapter.MAX_ACTIVITY_COUNT_DEFAULT);

    Drawable expandActivityOverflowButtonDrawable =
        attributesArray.getDrawable(
            R.styleable.SherlockActivityChooserView_expandActivityOverflowButtonDrawable);

    attributesArray.recycle();

    LayoutInflater inflater = LayoutInflater.from(mContext);
    inflater.inflate(R.layout.abs__activity_chooser_view, this, true);

    mCallbacks = new Callbacks();

    mActivityChooserContent =
        (IcsLinearLayout) findViewById(R.id.abs__activity_chooser_view_content);
    mActivityChooserContentBackground = mActivityChooserContent.getBackground();

    mDefaultActivityButton = (FrameLayout) findViewById(R.id.abs__default_activity_button);
    mDefaultActivityButton.setOnClickListener(mCallbacks);
    mDefaultActivityButton.setOnLongClickListener(mCallbacks);
    mDefaultActivityButtonImage = (ImageView) mDefaultActivityButton.findViewById(R.id.abs__image);

    mExpandActivityOverflowButton = (FrameLayout) findViewById(R.id.abs__expand_activities_button);
    mExpandActivityOverflowButton.setOnClickListener(mCallbacks);
    mExpandActivityOverflowButtonImage =
        (ImageView) mExpandActivityOverflowButton.findViewById(R.id.abs__image);
    mExpandActivityOverflowButtonImage.setImageDrawable(expandActivityOverflowButtonDrawable);

    mAdapter = new ActivityChooserViewAdapter();
    mAdapter.registerDataSetObserver(
        new DataSetObserver() {
          @Override
          public void onChanged() {
            super.onChanged();
            updateAppearance();
          }
        });

    Resources resources = context.getResources();
    mListPopupMaxWidth =
        Math.max(
            resources.getDisplayMetrics().widthPixels / 2,
            resources.getDimensionPixelSize(R.dimen.abs__config_prefDialogWidth));
  }
 @Override
 protected void onAttachedToWindow() {
   super.onAttachedToWindow();
   ActivityChooserModel dataModel = mAdapter.getDataModel();
   if (dataModel != null) {
     try {
       dataModel.registerObserver(mModelDataSetOberver);
     } catch (IllegalStateException e) {
       // Related to #557.
     }
   }
   mIsAttachedToWindow = true;
 }
  /**
   * Shows the popup no matter if it was already showing.
   *
   * @param maxActivityCount The max number of activities to display.
   */
  private void showPopupUnchecked(int maxActivityCount) {
    if (mAdapter.getDataModel() == null) {
      throw new IllegalStateException("No data model. Did you call #setDataModel?");
    }

    getViewTreeObserver().addOnGlobalLayoutListener(mOnGlobalLayoutListener);

    final boolean defaultActivityButtonShown = mDefaultActivityButton.getVisibility() == VISIBLE;

    final int activityCount = mAdapter.getActivityCount();
    final int maxActivityCountOffset = defaultActivityButtonShown ? 1 : 0;
    if (maxActivityCount != ActivityChooserViewAdapter.MAX_ACTIVITY_COUNT_UNLIMITED
        && activityCount > maxActivityCount + maxActivityCountOffset) {
      mAdapter.setShowFooterView(true);
      mAdapter.setMaxActivityCount(maxActivityCount - 1);
    } else {
      mAdapter.setShowFooterView(false);
      mAdapter.setMaxActivityCount(maxActivityCount);
    }

    IcsListPopupWindow popupWindow = getListPopupWindow();
    if (!popupWindow.isShowing()) {
      if (mIsSelectingDefaultActivity || !defaultActivityButtonShown) {
        mAdapter.setShowDefaultActivity(true, defaultActivityButtonShown);
      } else {
        mAdapter.setShowDefaultActivity(false, false);
      }
      final int contentWidth = Math.min(mAdapter.measureContentWidth(), mListPopupMaxWidth);
      popupWindow.setContentWidth(contentWidth);
      popupWindow.show();
      if (mProvider != null) {
        mProvider.subUiVisibilityChanged(true);
      }
      popupWindow
          .getListView()
          .setContentDescription(
              mContext.getString(R.string.abs__activitychooserview_choose_application));
    }
  }
 @Override
 protected void onDetachedFromWindow() {
   super.onDetachedFromWindow();
   ActivityChooserModel dataModel = mAdapter.getDataModel();
   if (dataModel != null) {
     try {
       dataModel.unregisterObserver(mModelDataSetOberver);
     } catch (IllegalStateException e) {
       // Oh, well... fixes issue #557
     }
   }
   ViewTreeObserver viewTreeObserver = getViewTreeObserver();
   if (viewTreeObserver.isAlive()) {
     viewTreeObserver.removeGlobalOnLayoutListener(mOnGlobalLayoutListener);
   }
   mIsAttachedToWindow = false;
 }
 public ActivityChooserModel getDataModel() {
   return mAdapter.getDataModel();
 }
 @Override
 public void onInvalidated() {
   super.onInvalidated();
   mAdapter.notifyDataSetInvalidated();
 }
 @Override
 public void onChanged() {
   super.onChanged();
   mAdapter.notifyDataSetChanged();
 }