private static List<ContactListFilter> loadAccountFilters(Context context) {
    final ArrayList<ContactListFilter> result = Lists.newArrayList();
    final ArrayList<ContactListFilter> accountFilters = Lists.newArrayList();
    final AccountTypeManager accountTypes = AccountTypeManager.getInstance(context);
    List<AccountWithDataSet> accounts = accountTypes.getAccounts(false);
    for (AccountWithDataSet account : accounts) {
      AccountType accountType = accountTypes.getAccountType(account.type, account.dataSet);
      if (accountType.isExtension() && !account.hasData(context)) {
        // Hide extensions with no raw_contacts.
        continue;
      }
      Drawable icon = accountType != null ? accountType.getDisplayIcon(context) : null;
      accountFilters.add(
          ContactListFilter.createAccountFilter(account.type, account.name, account.dataSet, icon));
    }

    // Always show "All", even when there's no accounts.  (We may have local contacts)
    result.add(ContactListFilter.createFilterWithType(ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS));

    final int count = accountFilters.size();
    if (count >= 1) {
      // If we only have one account, don't show it as "account", instead show it as "all"
      if (count > 1) {
        result.addAll(accountFilters);
      }
      result.add(ContactListFilter.createFilterWithType(ContactListFilter.FILTER_TYPE_CUSTOM));
    }
    return result;
  }
  /** Sets up the editor based on the group's account name and type. */
  private void setupEditorForAccount() {
    final AccountType accountType = getAccountType();
    final boolean editable = isGroupMembershipEditable();
    boolean isNewEditor = false;
    mMemberListAdapter.setIsGroupMembershipEditable(editable);

    // Since this method can be called multiple time, remove old editor if the editor type
    // is different from the new one and mark the editor with a tag so it can be found for
    // removal if needed
    View editorView;
    int newGroupEditorId =
        editable ? R.layout.group_editor_view : R.layout.external_group_editor_view;
    if (newGroupEditorId != mLastGroupEditorId) {
      View oldEditorView = mRootView.findViewWithTag(CURRENT_EDITOR_TAG);
      if (oldEditorView != null) {
        mRootView.removeView(oldEditorView);
      }
      editorView = mLayoutInflater.inflate(newGroupEditorId, mRootView, false);
      editorView.setTag(CURRENT_EDITOR_TAG);
      mAutoCompleteAdapter = null;
      mLastGroupEditorId = newGroupEditorId;
      isNewEditor = true;
    } else {
      editorView = mRootView.findViewWithTag(CURRENT_EDITOR_TAG);
      if (editorView == null) {
        throw new IllegalStateException("Group editor view not found");
      }
    }

    mGroupNameView = (TextView) editorView.findViewById(R.id.group_name);
    mAutoCompleteTextView = (AutoCompleteTextView) editorView.findViewById(R.id.add_member_field);

    mListView = (ListView) editorView.findViewById(android.R.id.list);
    mListView.setAdapter(mMemberListAdapter);

    // Setup the account header, only when exists.
    if (editorView.findViewById(R.id.account_header) != null) {
      CharSequence accountTypeDisplayLabel = accountType.getDisplayLabel(mContext);
      ImageView accountIcon = (ImageView) editorView.findViewById(R.id.account_icon);
      TextView accountTypeTextView = (TextView) editorView.findViewById(R.id.account_type);
      TextView accountNameTextView = (TextView) editorView.findViewById(R.id.account_name);
      if (!TextUtils.isEmpty(mAccountName)) {
        accountNameTextView.setText(mContext.getString(R.string.from_account_format, mAccountName));
      }
      accountTypeTextView.setText(accountTypeDisplayLabel);
      accountIcon.setImageDrawable(accountType.getDisplayIcon(mContext));
    }

    // Setup the autocomplete adapter (for contacts to suggest to add to the group) based on the
    // account name and type. For groups that cannot have membership edited, there will be no
    // autocomplete text view.
    if (mAutoCompleteTextView != null) {
      mAutoCompleteAdapter =
          new SuggestedMemberListAdapter(mContext, android.R.layout.simple_dropdown_item_1line);
      mAutoCompleteAdapter.setContentResolver(mContentResolver);
      mAutoCompleteAdapter.setAccountType(mAccountType);
      mAutoCompleteAdapter.setAccountName(mAccountName);
      mAutoCompleteAdapter.setDataSet(mDataSet);
      mAutoCompleteTextView.setAdapter(mAutoCompleteAdapter);
      mAutoCompleteTextView.setOnItemClickListener(
          new OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
              SuggestedMember member = (SuggestedMember) view.getTag();
              if (member == null) {
                return; // just in case
              }
              loadMemberToAddToGroup(
                  member.getRawContactId(), String.valueOf(member.getContactId()));

              // Update the autocomplete adapter so the contact doesn't get suggested again
              mAutoCompleteAdapter.addNewMember(member.getContactId());

              // Clear out the text field
              mAutoCompleteTextView.setText("");
            }
          });
      // Update the exempt list.  (mListToDisplay might have been restored from the saved
      // state.)
      mAutoCompleteAdapter.updateExistingMembersList(mListToDisplay);
    }

    // If the group name is ready only, don't let the user focus on the field.
    mGroupNameView.setFocusable(!mGroupNameIsReadOnly);
    if (isNewEditor) {
      mRootView.addView(editorView);
    }
    mStatus = Status.EDITING;
  }