Moving depedencies of DialtactsActivity into ContactsCommon.

This completes the clean-up of class depedencies for DialtactsActivity in
the Dialer.

Bug: 6993891
Change-Id: Ie159868ab327ee773334fec4312804288f002597
diff --git a/res/layout/contact_detail_list_padding.xml b/res/layout/contact_detail_list_padding.xml
deleted file mode 100644
index c5dbd06..0000000
--- a/res/layout/contact_detail_list_padding.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2011 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-
-<!-- The actual padding is embedded in a FrameLayout since we cannot change the
-     visibility of a header view in a ListView without having a parent view. -->
-<FrameLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="match_parent"
-    android:layout_height="wrap_content">
-    <View
-        android:id="@+id/contact_detail_list_padding"
-        android:layout_width="match_parent"
-        android:layout_height="@dimen/list_header_extra_top_padding" />
-</FrameLayout>
diff --git a/src/com/android/contacts/activities/ContactSelectionActivity.java b/src/com/android/contacts/activities/ContactSelectionActivity.java
index 078bed7..915c6e1 100644
--- a/src/com/android/contacts/activities/ContactSelectionActivity.java
+++ b/src/com/android/contacts/activities/ContactSelectionActivity.java
@@ -42,7 +42,7 @@
 
 import com.android.contacts.ContactsActivity;
 import com.android.contacts.R;
-import com.android.contacts.list.ContactEntryListFragment;
+import com.android.contacts.common.list.ContactEntryListFragment;
 import com.android.contacts.list.ContactPickerFragment;
 import com.android.contacts.list.ContactsIntentResolver;
 import com.android.contacts.list.ContactsRequest;
@@ -51,9 +51,9 @@
 import com.android.contacts.list.LegacyPhoneNumberPickerFragment;
 import com.android.contacts.list.OnContactPickerActionListener;
 import com.android.contacts.list.OnEmailAddressPickerActionListener;
-import com.android.contacts.list.OnPhoneNumberPickerActionListener;
+import com.android.contacts.common.list.OnPhoneNumberPickerActionListener;
 import com.android.contacts.list.OnPostalAddressPickerActionListener;
-import com.android.contacts.list.PhoneNumberPickerFragment;
+import com.android.contacts.common.list.PhoneNumberPickerFragment;
 import com.android.contacts.list.PostalAddressPickerFragment;
 import com.google.common.collect.Sets;
 
diff --git a/src/com/android/contacts/activities/JoinContactActivity.java b/src/com/android/contacts/activities/JoinContactActivity.java
index a580165..c345a01 100644
--- a/src/com/android/contacts/activities/JoinContactActivity.java
+++ b/src/com/android/contacts/activities/JoinContactActivity.java
@@ -38,7 +38,7 @@
 
 import com.android.contacts.ContactsActivity;
 import com.android.contacts.R;
-import com.android.contacts.list.ContactEntryListFragment;
+import com.android.contacts.common.list.ContactEntryListFragment;
 import com.android.contacts.list.JoinContactListFragment;
 import com.android.contacts.list.OnContactPickerActionListener;
 
diff --git a/src/com/android/contacts/activities/PeopleActivity.java b/src/com/android/contacts/activities/PeopleActivity.java
index 7e979c0..b8ab085 100644
--- a/src/com/android/contacts/activities/PeopleActivity.java
+++ b/src/com/android/contacts/activities/PeopleActivity.java
@@ -64,7 +64,7 @@
 import com.android.contacts.interactions.ContactDeletionInteraction;
 import com.android.contacts.common.interactions.ImportExportDialogFragment;
 import com.android.contacts.list.ContactBrowseListFragment;
-import com.android.contacts.list.ContactEntryListFragment;
+import com.android.contacts.common.list.ContactEntryListFragment;
 import com.android.contacts.common.list.ContactListFilter;
 import com.android.contacts.common.list.ContactListFilterController;
 import com.android.contacts.common.list.ContactTileAdapter.DisplayType;
diff --git a/src/com/android/contacts/list/ContactBrowseListFragment.java b/src/com/android/contacts/list/ContactBrowseListFragment.java
index 64c4c3d..78bc3eb 100644
--- a/src/com/android/contacts/list/ContactBrowseListFragment.java
+++ b/src/com/android/contacts/list/ContactBrowseListFragment.java
@@ -36,6 +36,7 @@
 
 import com.android.common.widget.CompositeCursorAdapter.Partition;
 import com.android.contacts.common.list.AutoScrollListView;
+import com.android.contacts.common.list.ContactEntryListFragment;
 import com.android.contacts.common.list.ContactListAdapter;
 import com.android.contacts.common.list.ContactListFilter;
 import com.android.contacts.common.list.DirectoryPartition;
diff --git a/src/com/android/contacts/list/ContactEntryListFragment.java b/src/com/android/contacts/list/ContactEntryListFragment.java
deleted file mode 100644
index e867b4d..0000000
--- a/src/com/android/contacts/list/ContactEntryListFragment.java
+++ /dev/null
@@ -1,858 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.contacts.list;
-
-import android.app.Activity;
-import android.app.Fragment;
-import android.app.LoaderManager;
-import android.app.LoaderManager.LoaderCallbacks;
-import android.content.Context;
-import android.content.CursorLoader;
-import android.content.Intent;
-import android.content.Loader;
-import android.database.Cursor;
-import android.os.Bundle;
-import android.os.Handler;
-import android.os.Message;
-import android.os.Parcelable;
-import android.provider.ContactsContract.Directory;
-import android.text.TextUtils;
-import android.view.LayoutInflater;
-import android.view.MotionEvent;
-import android.view.View;
-import android.view.View.OnFocusChangeListener;
-import android.view.View.OnTouchListener;
-import android.view.ViewGroup;
-import android.view.inputmethod.InputMethodManager;
-import android.widget.AbsListView;
-import android.widget.AbsListView.OnScrollListener;
-import android.widget.AdapterView;
-import android.widget.AdapterView.OnItemClickListener;
-import android.widget.ListView;
-
-import com.android.common.widget.CompositeCursorAdapter.Partition;
-import com.android.contacts.R;
-import com.android.contacts.common.ContactPhotoManager;
-import com.android.contacts.common.list.ContactEntryListAdapter;
-import com.android.contacts.common.list.DirectoryListLoader;
-import com.android.contacts.common.list.DirectoryPartition;
-import com.android.contacts.common.preference.ContactsPreferences;
-
-/**
- * Common base class for various contact-related list fragments.
- */
-public abstract class ContactEntryListFragment<T extends ContactEntryListAdapter>
-        extends Fragment
-        implements OnItemClickListener, OnScrollListener, OnFocusChangeListener, OnTouchListener,
-                LoaderCallbacks<Cursor> {
-    private static final String TAG = "ContactEntryListFragment";
-
-    // TODO: Make this protected. This should not be used from the PeopleActivity but
-    // instead use the new startActivityWithResultFromFragment API
-    public static final int ACTIVITY_REQUEST_CODE_PICKER = 1;
-
-    private static final String KEY_LIST_STATE = "liststate";
-    private static final String KEY_SECTION_HEADER_DISPLAY_ENABLED = "sectionHeaderDisplayEnabled";
-    private static final String KEY_PHOTO_LOADER_ENABLED = "photoLoaderEnabled";
-    private static final String KEY_QUICK_CONTACT_ENABLED = "quickContactEnabled";
-    private static final String KEY_INCLUDE_PROFILE = "includeProfile";
-    private static final String KEY_SEARCH_MODE = "searchMode";
-    private static final String KEY_VISIBLE_SCROLLBAR_ENABLED = "visibleScrollbarEnabled";
-    private static final String KEY_SCROLLBAR_POSITION = "scrollbarPosition";
-    private static final String KEY_QUERY_STRING = "queryString";
-    private static final String KEY_DIRECTORY_SEARCH_MODE = "directorySearchMode";
-    private static final String KEY_SELECTION_VISIBLE = "selectionVisible";
-    private static final String KEY_REQUEST = "request";
-    private static final String KEY_DARK_THEME = "darkTheme";
-    private static final String KEY_LEGACY_COMPATIBILITY = "legacyCompatibility";
-    private static final String KEY_DIRECTORY_RESULT_LIMIT = "directoryResultLimit";
-
-    private static final String DIRECTORY_ID_ARG_KEY = "directoryId";
-
-    private static final int DIRECTORY_LOADER_ID = -1;
-
-    private static final int DIRECTORY_SEARCH_DELAY_MILLIS = 300;
-    private static final int DIRECTORY_SEARCH_MESSAGE = 1;
-
-    private static final int DEFAULT_DIRECTORY_RESULT_LIMIT = 20;
-
-    private boolean mSectionHeaderDisplayEnabled;
-    private boolean mPhotoLoaderEnabled;
-    private boolean mQuickContactEnabled = true;
-    private boolean mIncludeProfile;
-    private boolean mSearchMode;
-    private boolean mVisibleScrollbarEnabled;
-    private int mVerticalScrollbarPosition = View.SCROLLBAR_POSITION_RIGHT;
-    private String mQueryString;
-    private int mDirectorySearchMode = DirectoryListLoader.SEARCH_MODE_NONE;
-    private boolean mSelectionVisible;
-    private boolean mLegacyCompatibility;
-
-    private boolean mEnabled = true;
-
-    private T mAdapter;
-    private View mView;
-    private ListView mListView;
-
-    /**
-     * Used for keeping track of the scroll state of the list.
-     */
-    private Parcelable mListState;
-
-    private int mDisplayOrder;
-    private int mSortOrder;
-    private int mDirectoryResultLimit = DEFAULT_DIRECTORY_RESULT_LIMIT;
-
-    private ContactPhotoManager mPhotoManager;
-    private ContactsPreferences mContactsPrefs;
-
-    private boolean mForceLoad;
-
-    private boolean mDarkTheme;
-
-    protected boolean mUserProfileExists;
-
-    private static final int STATUS_NOT_LOADED = 0;
-    private static final int STATUS_LOADING = 1;
-    private static final int STATUS_LOADED = 2;
-
-    private int mDirectoryListStatus = STATUS_NOT_LOADED;
-
-    /**
-     * Indicates whether we are doing the initial complete load of data (false) or
-     * a refresh caused by a change notification (true)
-     */
-    private boolean mLoadPriorityDirectoriesOnly;
-
-    private Context mContext;
-
-    private LoaderManager mLoaderManager;
-
-    private Handler mDelayedDirectorySearchHandler = new Handler() {
-        @Override
-        public void handleMessage(Message msg) {
-            if (msg.what == DIRECTORY_SEARCH_MESSAGE) {
-                loadDirectoryPartition(msg.arg1, (DirectoryPartition) msg.obj);
-            }
-        }
-    };
-
-    protected abstract View inflateView(LayoutInflater inflater, ViewGroup container);
-    protected abstract T createListAdapter();
-
-    /**
-     * @param position Please note that the position is already adjusted for
-     *            header views, so "0" means the first list item below header
-     *            views.
-     */
-    protected abstract void onItemClick(int position, long id);
-
-    @Override
-    public void onAttach(Activity activity) {
-        super.onAttach(activity);
-        setContext(activity);
-        setLoaderManager(super.getLoaderManager());
-    }
-
-    /**
-     * Sets a context for the fragment in the unit test environment.
-     */
-    public void setContext(Context context) {
-        mContext = context;
-        configurePhotoLoader();
-    }
-
-    public Context getContext() {
-        return mContext;
-    }
-
-    public void setEnabled(boolean enabled) {
-        if (mEnabled != enabled) {
-            mEnabled = enabled;
-            if (mAdapter != null) {
-                if (mEnabled) {
-                    reloadData();
-                } else {
-                    mAdapter.clearPartitions();
-                }
-            }
-        }
-    }
-
-    /**
-     * Overrides a loader manager for use in unit tests.
-     */
-    public void setLoaderManager(LoaderManager loaderManager) {
-        mLoaderManager = loaderManager;
-    }
-
-    @Override
-    public LoaderManager getLoaderManager() {
-        return mLoaderManager;
-    }
-
-    public T getAdapter() {
-        return mAdapter;
-    }
-
-    @Override
-    public View getView() {
-        return mView;
-    }
-
-    public ListView getListView() {
-        return mListView;
-    }
-
-    @Override
-    public void onSaveInstanceState(Bundle outState) {
-        super.onSaveInstanceState(outState);
-        outState.putBoolean(KEY_SECTION_HEADER_DISPLAY_ENABLED, mSectionHeaderDisplayEnabled);
-        outState.putBoolean(KEY_PHOTO_LOADER_ENABLED, mPhotoLoaderEnabled);
-        outState.putBoolean(KEY_QUICK_CONTACT_ENABLED, mQuickContactEnabled);
-        outState.putBoolean(KEY_INCLUDE_PROFILE, mIncludeProfile);
-        outState.putBoolean(KEY_SEARCH_MODE, mSearchMode);
-        outState.putBoolean(KEY_VISIBLE_SCROLLBAR_ENABLED, mVisibleScrollbarEnabled);
-        outState.putInt(KEY_SCROLLBAR_POSITION, mVerticalScrollbarPosition);
-        outState.putInt(KEY_DIRECTORY_SEARCH_MODE, mDirectorySearchMode);
-        outState.putBoolean(KEY_SELECTION_VISIBLE, mSelectionVisible);
-        outState.putBoolean(KEY_LEGACY_COMPATIBILITY, mLegacyCompatibility);
-        outState.putString(KEY_QUERY_STRING, mQueryString);
-        outState.putInt(KEY_DIRECTORY_RESULT_LIMIT, mDirectoryResultLimit);
-        outState.putBoolean(KEY_DARK_THEME, mDarkTheme);
-
-        if (mListView != null) {
-            outState.putParcelable(KEY_LIST_STATE, mListView.onSaveInstanceState());
-        }
-    }
-
-    @Override
-    public void onCreate(Bundle savedState) {
-        super.onCreate(savedState);
-        mContactsPrefs = new ContactsPreferences(mContext);
-        restoreSavedState(savedState);
-    }
-
-    public void restoreSavedState(Bundle savedState) {
-        if (savedState == null) {
-            return;
-        }
-
-        mSectionHeaderDisplayEnabled = savedState.getBoolean(KEY_SECTION_HEADER_DISPLAY_ENABLED);
-        mPhotoLoaderEnabled = savedState.getBoolean(KEY_PHOTO_LOADER_ENABLED);
-        mQuickContactEnabled = savedState.getBoolean(KEY_QUICK_CONTACT_ENABLED);
-        mIncludeProfile = savedState.getBoolean(KEY_INCLUDE_PROFILE);
-        mSearchMode = savedState.getBoolean(KEY_SEARCH_MODE);
-        mVisibleScrollbarEnabled = savedState.getBoolean(KEY_VISIBLE_SCROLLBAR_ENABLED);
-        mVerticalScrollbarPosition = savedState.getInt(KEY_SCROLLBAR_POSITION);
-        mDirectorySearchMode = savedState.getInt(KEY_DIRECTORY_SEARCH_MODE);
-        mSelectionVisible = savedState.getBoolean(KEY_SELECTION_VISIBLE);
-        mLegacyCompatibility = savedState.getBoolean(KEY_LEGACY_COMPATIBILITY);
-        mQueryString = savedState.getString(KEY_QUERY_STRING);
-        mDirectoryResultLimit = savedState.getInt(KEY_DIRECTORY_RESULT_LIMIT);
-        mDarkTheme = savedState.getBoolean(KEY_DARK_THEME);
-
-        // Retrieve list state. This will be applied in onLoadFinished
-        mListState = savedState.getParcelable(KEY_LIST_STATE);
-    }
-
-    @Override
-    public void onStart() {
-        super.onStart();
-
-        mContactsPrefs.registerChangeListener(mPreferencesChangeListener);
-
-        mForceLoad = loadPreferences();
-
-        mDirectoryListStatus = STATUS_NOT_LOADED;
-        mLoadPriorityDirectoriesOnly = true;
-
-        startLoading();
-    }
-
-    protected void startLoading() {
-        if (mAdapter == null) {
-            // The method was called before the fragment was started
-            return;
-        }
-
-        configureAdapter();
-        int partitionCount = mAdapter.getPartitionCount();
-        for (int i = 0; i < partitionCount; i++) {
-            Partition partition = mAdapter.getPartition(i);
-            if (partition instanceof DirectoryPartition) {
-                DirectoryPartition directoryPartition = (DirectoryPartition)partition;
-                if (directoryPartition.getStatus() == DirectoryPartition.STATUS_NOT_LOADED) {
-                    if (directoryPartition.isPriorityDirectory() || !mLoadPriorityDirectoriesOnly) {
-                        startLoadingDirectoryPartition(i);
-                    }
-                }
-            } else {
-                getLoaderManager().initLoader(i, null, this);
-            }
-        }
-
-        // Next time this method is called, we should start loading non-priority directories
-        mLoadPriorityDirectoriesOnly = false;
-    }
-
-    @Override
-    public Loader<Cursor> onCreateLoader(int id, Bundle args) {
-        if (id == DIRECTORY_LOADER_ID) {
-            DirectoryListLoader loader = new DirectoryListLoader(mContext);
-            loader.setDirectorySearchMode(mAdapter.getDirectorySearchMode());
-            loader.setLocalInvisibleDirectoryEnabled(
-                    ContactEntryListAdapter.LOCAL_INVISIBLE_DIRECTORY_ENABLED);
-            return loader;
-        } else {
-            CursorLoader loader = createCursorLoader();
-            long directoryId = args != null && args.containsKey(DIRECTORY_ID_ARG_KEY)
-                    ? args.getLong(DIRECTORY_ID_ARG_KEY)
-                    : Directory.DEFAULT;
-            mAdapter.configureLoader(loader, directoryId);
-            return loader;
-        }
-    }
-
-    public CursorLoader createCursorLoader() {
-        return new CursorLoader(mContext, null, null, null, null, null);
-    }
-
-    private void startLoadingDirectoryPartition(int partitionIndex) {
-        DirectoryPartition partition = (DirectoryPartition)mAdapter.getPartition(partitionIndex);
-        partition.setStatus(DirectoryPartition.STATUS_LOADING);
-        long directoryId = partition.getDirectoryId();
-        if (mForceLoad) {
-            if (directoryId == Directory.DEFAULT) {
-                loadDirectoryPartition(partitionIndex, partition);
-            } else {
-                loadDirectoryPartitionDelayed(partitionIndex, partition);
-            }
-        } else {
-            Bundle args = new Bundle();
-            args.putLong(DIRECTORY_ID_ARG_KEY, directoryId);
-            getLoaderManager().initLoader(partitionIndex, args, this);
-        }
-    }
-
-    /**
-     * Queues up a delayed request to search the specified directory. Since
-     * directory search will likely introduce a lot of network traffic, we want
-     * to wait for a pause in the user's typing before sending a directory request.
-     */
-    private void loadDirectoryPartitionDelayed(int partitionIndex, DirectoryPartition partition) {
-        mDelayedDirectorySearchHandler.removeMessages(DIRECTORY_SEARCH_MESSAGE, partition);
-        Message msg = mDelayedDirectorySearchHandler.obtainMessage(
-                DIRECTORY_SEARCH_MESSAGE, partitionIndex, 0, partition);
-        mDelayedDirectorySearchHandler.sendMessageDelayed(msg, DIRECTORY_SEARCH_DELAY_MILLIS);
-    }
-
-    /**
-     * Loads the directory partition.
-     */
-    protected void loadDirectoryPartition(int partitionIndex, DirectoryPartition partition) {
-        Bundle args = new Bundle();
-        args.putLong(DIRECTORY_ID_ARG_KEY, partition.getDirectoryId());
-        getLoaderManager().restartLoader(partitionIndex, args, this);
-    }
-
-    /**
-     * Cancels all queued directory loading requests.
-     */
-    private void removePendingDirectorySearchRequests() {
-        mDelayedDirectorySearchHandler.removeMessages(DIRECTORY_SEARCH_MESSAGE);
-    }
-
-    @Override
-    public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
-        if (!mEnabled) {
-            return;
-        }
-
-        int loaderId = loader.getId();
-        if (loaderId == DIRECTORY_LOADER_ID) {
-            mDirectoryListStatus = STATUS_LOADED;
-            mAdapter.changeDirectories(data);
-            startLoading();
-        } else {
-            onPartitionLoaded(loaderId, data);
-            if (isSearchMode()) {
-                int directorySearchMode = getDirectorySearchMode();
-                if (directorySearchMode != DirectoryListLoader.SEARCH_MODE_NONE) {
-                    if (mDirectoryListStatus == STATUS_NOT_LOADED) {
-                        mDirectoryListStatus = STATUS_LOADING;
-                        getLoaderManager().initLoader(DIRECTORY_LOADER_ID, null, this);
-                    } else {
-                        startLoading();
-                    }
-                }
-            } else {
-                mDirectoryListStatus = STATUS_NOT_LOADED;
-                getLoaderManager().destroyLoader(DIRECTORY_LOADER_ID);
-            }
-        }
-    }
-
-    public void onLoaderReset(Loader<Cursor> loader) {
-    }
-
-    protected void onPartitionLoaded(int partitionIndex, Cursor data) {
-        if (partitionIndex >= mAdapter.getPartitionCount()) {
-            // When we get unsolicited data, ignore it.  This could happen
-            // when we are switching from search mode to the default mode.
-            return;
-        }
-
-        mAdapter.changeCursor(partitionIndex, data);
-        setProfileHeader();
-        showCount(partitionIndex, data);
-
-        if (!isLoading()) {
-            completeRestoreInstanceState();
-        }
-    }
-
-    public boolean isLoading() {
-        if (mAdapter != null && mAdapter.isLoading()) {
-            return true;
-        }
-
-        if (isLoadingDirectoryList()) {
-            return true;
-        }
-
-        return false;
-    }
-
-    public boolean isLoadingDirectoryList() {
-        return isSearchMode() && getDirectorySearchMode() != DirectoryListLoader.SEARCH_MODE_NONE
-                && (mDirectoryListStatus == STATUS_NOT_LOADED
-                        || mDirectoryListStatus == STATUS_LOADING);
-    }
-
-    @Override
-    public void onStop() {
-        super.onStop();
-        mContactsPrefs.unregisterChangeListener();
-        mAdapter.clearPartitions();
-    }
-
-    protected void reloadData() {
-        removePendingDirectorySearchRequests();
-        mAdapter.onDataReload();
-        mLoadPriorityDirectoriesOnly = true;
-        mForceLoad = true;
-        startLoading();
-    }
-
-    /**
-     * Shows the count of entries included in the list. The default
-     * implementation does nothing.
-     */
-    protected void showCount(int partitionIndex, Cursor data) {
-    }
-
-    /**
-     * Shows a view at the top of the list with a pseudo local profile prompting the user to add
-     * a local profile. Default implementation does nothing.
-     */
-    protected void setProfileHeader() {
-        mUserProfileExists = false;
-    }
-
-    /**
-     * Provides logic that dismisses this fragment. The default implementation
-     * does nothing.
-     */
-    protected void finish() {
-    }
-
-    public void setSectionHeaderDisplayEnabled(boolean flag) {
-        if (mSectionHeaderDisplayEnabled != flag) {
-            mSectionHeaderDisplayEnabled = flag;
-            if (mAdapter != null) {
-                mAdapter.setSectionHeaderDisplayEnabled(flag);
-            }
-            configureVerticalScrollbar();
-        }
-    }
-
-    public boolean isSectionHeaderDisplayEnabled() {
-        return mSectionHeaderDisplayEnabled;
-    }
-
-    public void setVisibleScrollbarEnabled(boolean flag) {
-        if (mVisibleScrollbarEnabled != flag) {
-            mVisibleScrollbarEnabled = flag;
-            configureVerticalScrollbar();
-        }
-    }
-
-    public boolean isVisibleScrollbarEnabled() {
-        return mVisibleScrollbarEnabled;
-    }
-
-    public void setVerticalScrollbarPosition(int position) {
-        if (mVerticalScrollbarPosition != position) {
-            mVerticalScrollbarPosition = position;
-            configureVerticalScrollbar();
-        }
-    }
-
-    private void configureVerticalScrollbar() {
-        boolean hasScrollbar = isVisibleScrollbarEnabled() && isSectionHeaderDisplayEnabled();
-
-        if (mListView != null) {
-            mListView.setFastScrollEnabled(hasScrollbar);
-            mListView.setFastScrollAlwaysVisible(hasScrollbar);
-            mListView.setVerticalScrollbarPosition(mVerticalScrollbarPosition);
-            mListView.setScrollBarStyle(ListView.SCROLLBARS_OUTSIDE_OVERLAY);
-            int leftPadding = 0;
-            int rightPadding = 0;
-            if (mVerticalScrollbarPosition == View.SCROLLBAR_POSITION_LEFT) {
-                leftPadding = mContext.getResources().getDimensionPixelOffset(
-                        R.dimen.list_visible_scrollbar_padding);
-            } else {
-                rightPadding = mContext.getResources().getDimensionPixelOffset(
-                        R.dimen.list_visible_scrollbar_padding);
-            }
-            mListView.setPadding(leftPadding, mListView.getPaddingTop(),
-                    rightPadding, mListView.getPaddingBottom());
-        }
-    }
-
-    public void setPhotoLoaderEnabled(boolean flag) {
-        mPhotoLoaderEnabled = flag;
-        configurePhotoLoader();
-    }
-
-    public boolean isPhotoLoaderEnabled() {
-        return mPhotoLoaderEnabled;
-    }
-
-    /**
-     * Returns true if the list is supposed to visually highlight the selected item.
-     */
-    public boolean isSelectionVisible() {
-        return mSelectionVisible;
-    }
-
-    public void setSelectionVisible(boolean flag) {
-        this.mSelectionVisible = flag;
-    }
-
-    public void setQuickContactEnabled(boolean flag) {
-        this.mQuickContactEnabled = flag;
-    }
-
-    public void setIncludeProfile(boolean flag) {
-        mIncludeProfile = flag;
-        if(mAdapter != null) {
-            mAdapter.setIncludeProfile(flag);
-        }
-    }
-
-    /**
-     * Enter/exit search mode.  By design, a fragment enters search mode only when it has a
-     * non-empty query text, so the mode must be tightly related to the current query.
-     * For this reason this method must only be called by {@link #setQueryString}.
-     *
-     * Also note this method doesn't call {@link #reloadData()}; {@link #setQueryString} does it.
-     */
-    protected void setSearchMode(boolean flag) {
-        if (mSearchMode != flag) {
-            mSearchMode = flag;
-            setSectionHeaderDisplayEnabled(!mSearchMode);
-
-            if (!flag) {
-                mDirectoryListStatus = STATUS_NOT_LOADED;
-                getLoaderManager().destroyLoader(DIRECTORY_LOADER_ID);
-            }
-
-            if (mAdapter != null) {
-                mAdapter.setPinnedPartitionHeadersEnabled(flag);
-                mAdapter.setSearchMode(flag);
-
-                mAdapter.clearPartitions();
-                if (!flag) {
-                    // If we are switching from search to regular display, remove all directory
-                    // partitions after default one, assuming they are remote directories which
-                    // should be cleaned up on exiting the search mode.
-                    mAdapter.removeDirectoriesAfterDefault();
-                }
-                mAdapter.configureDefaultPartition(false, flag);
-            }
-
-            if (mListView != null) {
-                mListView.setFastScrollEnabled(!flag);
-            }
-        }
-    }
-
-    public final boolean isSearchMode() {
-        return mSearchMode;
-    }
-
-    public final String getQueryString() {
-        return mQueryString;
-    }
-
-    public void setQueryString(String queryString, boolean delaySelection) {
-        // Normalize the empty query.
-        if (TextUtils.isEmpty(queryString)) queryString = null;
-
-        if (!TextUtils.equals(mQueryString, queryString)) {
-            mQueryString = queryString;
-            setSearchMode(!TextUtils.isEmpty(mQueryString));
-
-            if (mAdapter != null) {
-                mAdapter.setQueryString(queryString);
-                reloadData();
-            }
-        }
-    }
-
-    public int getDirectorySearchMode() {
-        return mDirectorySearchMode;
-    }
-
-    public void setDirectorySearchMode(int mode) {
-        mDirectorySearchMode = mode;
-    }
-
-    public boolean isLegacyCompatibilityMode() {
-        return mLegacyCompatibility;
-    }
-
-    public void setLegacyCompatibilityMode(boolean flag) {
-        mLegacyCompatibility = flag;
-    }
-
-    protected int getContactNameDisplayOrder() {
-        return mDisplayOrder;
-    }
-
-    protected void setContactNameDisplayOrder(int displayOrder) {
-        mDisplayOrder = displayOrder;
-        if (mAdapter != null) {
-            mAdapter.setContactNameDisplayOrder(displayOrder);
-        }
-    }
-
-    public int getSortOrder() {
-        return mSortOrder;
-    }
-
-    public void setSortOrder(int sortOrder) {
-        mSortOrder = sortOrder;
-        if (mAdapter != null) {
-            mAdapter.setSortOrder(sortOrder);
-        }
-    }
-
-    public void setDirectoryResultLimit(int limit) {
-        mDirectoryResultLimit = limit;
-    }
-
-    protected boolean loadPreferences() {
-        boolean changed = false;
-        if (getContactNameDisplayOrder() != mContactsPrefs.getDisplayOrder()) {
-            setContactNameDisplayOrder(mContactsPrefs.getDisplayOrder());
-            changed = true;
-        }
-
-        if (getSortOrder() != mContactsPrefs.getSortOrder()) {
-            setSortOrder(mContactsPrefs.getSortOrder());
-            changed = true;
-        }
-
-        return changed;
-    }
-
-    @Override
-    public View onCreateView(LayoutInflater inflater, ViewGroup container,
-            Bundle savedInstanceState) {
-        onCreateView(inflater, container);
-
-        mAdapter = createListAdapter();
-
-        boolean searchMode = isSearchMode();
-        mAdapter.setSearchMode(searchMode);
-        mAdapter.configureDefaultPartition(false, searchMode);
-        mAdapter.setPhotoLoader(mPhotoManager);
-        mListView.setAdapter(mAdapter);
-
-        if (!isSearchMode()) {
-            mListView.setFocusableInTouchMode(true);
-            mListView.requestFocus();
-        }
-
-        return mView;
-    }
-
-    protected void onCreateView(LayoutInflater inflater, ViewGroup container) {
-        mView = inflateView(inflater, container);
-
-        mListView = (ListView)mView.findViewById(android.R.id.list);
-        if (mListView == null) {
-            throw new RuntimeException(
-                    "Your content must have a ListView whose id attribute is " +
-                    "'android.R.id.list'");
-        }
-
-        View emptyView = mView.findViewById(android.R.id.empty);
-        if (emptyView != null) {
-            mListView.setEmptyView(emptyView);
-        }
-
-        mListView.setOnItemClickListener(this);
-        mListView.setOnFocusChangeListener(this);
-        mListView.setOnTouchListener(this);
-        mListView.setFastScrollEnabled(!isSearchMode());
-
-        // Tell list view to not show dividers. We'll do it ourself so that we can *not* show
-        // them when an A-Z headers is visible.
-        mListView.setDividerHeight(0);
-
-        // We manually save/restore the listview state
-        mListView.setSaveEnabled(false);
-
-        configureVerticalScrollbar();
-        configurePhotoLoader();
-    }
-
-    protected void configurePhotoLoader() {
-        if (isPhotoLoaderEnabled() && mContext != null) {
-            if (mPhotoManager == null) {
-                mPhotoManager = ContactPhotoManager.getInstance(mContext);
-            }
-            if (mListView != null) {
-                mListView.setOnScrollListener(this);
-            }
-            if (mAdapter != null) {
-                mAdapter.setPhotoLoader(mPhotoManager);
-            }
-        }
-    }
-
-    protected void configureAdapter() {
-        if (mAdapter == null) {
-            return;
-        }
-
-        mAdapter.setQuickContactEnabled(mQuickContactEnabled);
-        mAdapter.setIncludeProfile(mIncludeProfile);
-        mAdapter.setQueryString(mQueryString);
-        mAdapter.setDirectorySearchMode(mDirectorySearchMode);
-        mAdapter.setPinnedPartitionHeadersEnabled(mSearchMode);
-        mAdapter.setContactNameDisplayOrder(mDisplayOrder);
-        mAdapter.setSortOrder(mSortOrder);
-        mAdapter.setSectionHeaderDisplayEnabled(mSectionHeaderDisplayEnabled);
-        mAdapter.setSelectionVisible(mSelectionVisible);
-        mAdapter.setDirectoryResultLimit(mDirectoryResultLimit);
-        mAdapter.setDarkTheme(mDarkTheme);
-    }
-
-    @Override
-    public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount,
-            int totalItemCount) {
-    }
-
-    @Override
-    public void onScrollStateChanged(AbsListView view, int scrollState) {
-        if (scrollState == OnScrollListener.SCROLL_STATE_FLING) {
-            mPhotoManager.pause();
-        } else if (isPhotoLoaderEnabled()) {
-            mPhotoManager.resume();
-        }
-    }
-
-    @Override
-    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
-        hideSoftKeyboard();
-
-        int adjPosition = position - mListView.getHeaderViewsCount();
-        if (adjPosition >= 0) {
-            onItemClick(adjPosition, id);
-        }
-    }
-
-    private void hideSoftKeyboard() {
-        // Hide soft keyboard, if visible
-        InputMethodManager inputMethodManager = (InputMethodManager)
-                mContext.getSystemService(Context.INPUT_METHOD_SERVICE);
-        inputMethodManager.hideSoftInputFromWindow(mListView.getWindowToken(), 0);
-    }
-
-    /**
-     * Dismisses the soft keyboard when the list takes focus.
-     */
-    @Override
-    public void onFocusChange(View view, boolean hasFocus) {
-        if (view == mListView && hasFocus) {
-            hideSoftKeyboard();
-        }
-    }
-
-    /**
-     * Dismisses the soft keyboard when the list is touched.
-     */
-    @Override
-    public boolean onTouch(View view, MotionEvent event) {
-        if (view == mListView) {
-            hideSoftKeyboard();
-        }
-        return false;
-    }
-
-    @Override
-    public void onPause() {
-        super.onPause();
-        removePendingDirectorySearchRequests();
-    }
-
-    /**
-     * Restore the list state after the adapter is populated.
-     */
-    protected void completeRestoreInstanceState() {
-        if (mListState != null) {
-            mListView.onRestoreInstanceState(mListState);
-            mListState = null;
-        }
-    }
-
-    public void setDarkTheme(boolean value) {
-        mDarkTheme = value;
-        if (mAdapter != null) mAdapter.setDarkTheme(value);
-    }
-
-    /**
-     * Processes a result returned by the contact picker.
-     */
-    public void onPickerResult(Intent data) {
-        throw new UnsupportedOperationException("Picker result handler is not implemented.");
-    }
-
-    private ContactsPreferences.ChangeListener mPreferencesChangeListener =
-            new ContactsPreferences.ChangeListener() {
-        @Override
-        public void onChange() {
-            loadPreferences();
-            reloadData();
-        }
-    };
-}
diff --git a/src/com/android/contacts/list/ContactPickerFragment.java b/src/com/android/contacts/list/ContactPickerFragment.java
index c8ad712..3dc4330 100644
--- a/src/com/android/contacts/list/ContactPickerFragment.java
+++ b/src/com/android/contacts/list/ContactPickerFragment.java
@@ -25,6 +25,7 @@
 
 import com.android.contacts.R;
 import com.android.contacts.common.list.ContactEntryListAdapter;
+import com.android.contacts.common.list.ContactEntryListFragment;
 import com.android.contacts.common.list.ContactListAdapter;
 import com.android.contacts.common.list.ContactListFilter;
 import com.android.contacts.common.list.DefaultContactListAdapter;
diff --git a/src/com/android/contacts/list/EmailAddressPickerFragment.java b/src/com/android/contacts/list/EmailAddressPickerFragment.java
index f4dd108..2146b68 100644
--- a/src/com/android/contacts/list/EmailAddressPickerFragment.java
+++ b/src/com/android/contacts/list/EmailAddressPickerFragment.java
@@ -22,6 +22,7 @@
 
 import com.android.contacts.R;
 import com.android.contacts.common.list.ContactEntryListAdapter;
+import com.android.contacts.common.list.ContactEntryListFragment;
 import com.android.contacts.common.list.DirectoryListLoader;
 
 /**
diff --git a/src/com/android/contacts/list/JoinContactListFragment.java b/src/com/android/contacts/list/JoinContactListFragment.java
index 9cfa4ae..a5c269d 100644
--- a/src/com/android/contacts/list/JoinContactListFragment.java
+++ b/src/com/android/contacts/list/JoinContactListFragment.java
@@ -32,6 +32,7 @@
 import android.widget.TextView;
 
 import com.android.contacts.R;
+import com.android.contacts.common.list.ContactEntryListFragment;
 import com.android.contacts.list.JoinContactLoader.JoinContactLoaderResult;
 
 /**
diff --git a/src/com/android/contacts/list/LegacyPhoneNumberPickerFragment.java b/src/com/android/contacts/list/LegacyPhoneNumberPickerFragment.java
index 08b1477..b88fa71 100644
--- a/src/com/android/contacts/list/LegacyPhoneNumberPickerFragment.java
+++ b/src/com/android/contacts/list/LegacyPhoneNumberPickerFragment.java
@@ -21,6 +21,7 @@
 
 import com.android.contacts.common.list.ContactEntryListAdapter;
 import com.android.contacts.common.list.ContactListItemView;
+import com.android.contacts.common.list.PhoneNumberPickerFragment;
 
 /**
  * Version of PhoneNumberPickerFragment used specifically for legacy support.
diff --git a/src/com/android/contacts/list/OnPhoneNumberPickerActionListener.java b/src/com/android/contacts/list/OnPhoneNumberPickerActionListener.java
deleted file mode 100644
index 0077c78..0000000
--- a/src/com/android/contacts/list/OnPhoneNumberPickerActionListener.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.contacts.list;
-
-import android.app.ActionBar;
-import android.content.Intent;
-import android.net.Uri;
-
-/**
- * Action callbacks that can be sent by a phone number picker.
- */
-public interface OnPhoneNumberPickerActionListener  {
-
-    /**
-     * Returns the selected phone number to the requester.
-     */
-    void onPickPhoneNumberAction(Uri dataUri);
-
-    /**
-     * Returns the selected number as a shortcut intent.
-     */
-    void onShortcutIntentCreated(Intent intent);
-
-    /**
-     * Called when home menu in {@link ActionBar} is clicked by the user.
-     */
-    void onHomeInActionBarSelected();
-}
diff --git a/src/com/android/contacts/list/PhoneNumberPickerFragment.java b/src/com/android/contacts/list/PhoneNumberPickerFragment.java
deleted file mode 100644
index 491aa70..0000000
--- a/src/com/android/contacts/list/PhoneNumberPickerFragment.java
+++ /dev/null
@@ -1,311 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.contacts.list;
-
-import android.content.Intent;
-import android.content.Loader;
-import android.database.Cursor;
-import android.net.Uri;
-import android.os.Bundle;
-import android.util.Log;
-import android.view.LayoutInflater;
-import android.view.MenuItem;
-import android.view.View;
-import android.view.View.OnClickListener;
-import android.view.ViewGroup;
-
-import com.android.contacts.R;
-import com.android.contacts.common.list.ContactEntryListAdapter;
-import com.android.contacts.common.list.ContactListFilter;
-import com.android.contacts.common.list.ContactListFilterController;
-import com.android.contacts.common.list.ContactListItemView;
-import com.android.contacts.common.list.DirectoryListLoader;
-import com.android.contacts.common.list.PhoneNumberListAdapter;
-import com.android.contacts.common.list.ShortcutIntentBuilder;
-import com.android.contacts.common.list.ShortcutIntentBuilder.OnShortcutIntentCreatedListener;
-import com.android.contacts.common.util.AccountFilterUtil;
-
-/**
- * Fragment containing a phone number list for picking.
- */
-public class PhoneNumberPickerFragment extends ContactEntryListFragment<ContactEntryListAdapter>
-        implements OnShortcutIntentCreatedListener {
-    private static final String TAG = PhoneNumberPickerFragment.class.getSimpleName();
-
-    private static final int REQUEST_CODE_ACCOUNT_FILTER = 1;
-
-    private static final String KEY_SHORTCUT_ACTION = "shortcutAction";
-
-    private OnPhoneNumberPickerActionListener mListener;
-    private String mShortcutAction;
-
-    private ContactListFilter mFilter;
-
-    private View mAccountFilterHeader;
-    /**
-     * Lives as ListView's header and is shown when {@link #mAccountFilterHeader} is set
-     * to View.GONE.
-     */
-    private View mPaddingView;
-
-    private static final String KEY_FILTER = "filter";
-
-    /** true if the loader has started at least once. */
-    private boolean mLoaderStarted;
-
-    private boolean mUseCallableUri;
-
-    private ContactListItemView.PhotoPosition mPhotoPosition =
-            ContactListItemView.DEFAULT_PHOTO_POSITION;
-
-    private class FilterHeaderClickListener implements OnClickListener {
-        @Override
-        public void onClick(View view) {
-            AccountFilterUtil.startAccountFilterActivityForResult(
-                    PhoneNumberPickerFragment.this,
-                    REQUEST_CODE_ACCOUNT_FILTER,
-                    mFilter);
-        }
-    }
-    private OnClickListener mFilterHeaderClickListener = new FilterHeaderClickListener();
-
-    public PhoneNumberPickerFragment() {
-        setQuickContactEnabled(false);
-        setPhotoLoaderEnabled(true);
-        setSectionHeaderDisplayEnabled(true);
-        setDirectorySearchMode(DirectoryListLoader.SEARCH_MODE_DATA_SHORTCUT);
-
-        // Show nothing instead of letting caller Activity show something.
-        setHasOptionsMenu(true);
-    }
-
-    public void setOnPhoneNumberPickerActionListener(OnPhoneNumberPickerActionListener listener) {
-        this.mListener = listener;
-    }
-
-    @Override
-    protected void onCreateView(LayoutInflater inflater, ViewGroup container) {
-        super.onCreateView(inflater, container);
-
-        View paddingView = inflater.inflate(R.layout.contact_detail_list_padding, null, false);
-        mPaddingView = paddingView.findViewById(R.id.contact_detail_list_padding);
-        getListView().addHeaderView(paddingView);
-
-        mAccountFilterHeader = getView().findViewById(R.id.account_filter_header_container);
-        mAccountFilterHeader.setOnClickListener(mFilterHeaderClickListener);
-        updateFilterHeaderView();
-
-        setVisibleScrollbarEnabled(getVisibleScrollbarEnabled());
-    }
-
-    protected boolean getVisibleScrollbarEnabled() {
-        return true;
-    }
-
-    @Override
-    protected void setSearchMode(boolean flag) {
-        super.setSearchMode(flag);
-        updateFilterHeaderView();
-    }
-
-    private void updateFilterHeaderView() {
-        final ContactListFilter filter = getFilter();
-        if (mAccountFilterHeader == null || filter == null) {
-            return;
-        }
-        final boolean shouldShowHeader =
-                !isSearchMode() &&
-                AccountFilterUtil.updateAccountFilterTitleForPhone(
-                        mAccountFilterHeader, filter, false);
-        if (shouldShowHeader) {
-            mPaddingView.setVisibility(View.GONE);
-            mAccountFilterHeader.setVisibility(View.VISIBLE);
-        } else {
-            mPaddingView.setVisibility(View.VISIBLE);
-            mAccountFilterHeader.setVisibility(View.GONE);
-        }
-    }
-
-    @Override
-    public void restoreSavedState(Bundle savedState) {
-        super.restoreSavedState(savedState);
-
-        if (savedState == null) {
-            return;
-        }
-
-        mFilter = savedState.getParcelable(KEY_FILTER);
-        mShortcutAction = savedState.getString(KEY_SHORTCUT_ACTION);
-    }
-
-    @Override
-    public void onSaveInstanceState(Bundle outState) {
-        super.onSaveInstanceState(outState);
-        outState.putParcelable(KEY_FILTER, mFilter);
-        outState.putString(KEY_SHORTCUT_ACTION, mShortcutAction);
-    }
-
-    @Override
-    public boolean onOptionsItemSelected(MenuItem item) {
-        final int itemId = item.getItemId();
-        if (itemId == android.R.id.home) {  // See ActionBar#setDisplayHomeAsUpEnabled()
-            if (mListener != null) {
-                mListener.onHomeInActionBarSelected();
-            }
-            return true;
-        }
-        return super.onOptionsItemSelected(item);
-    }
-
-    /**
-     * @param shortcutAction either {@link Intent#ACTION_CALL} or
-     *            {@link Intent#ACTION_SENDTO} or null.
-     */
-    public void setShortcutAction(String shortcutAction) {
-        this.mShortcutAction = shortcutAction;
-    }
-
-    @Override
-    protected void onItemClick(int position, long id) {
-        final Uri phoneUri = getPhoneUri(position);
-
-        if (phoneUri != null) {
-            pickPhoneNumber(phoneUri);
-        } else {
-            Log.w(TAG, "Item at " + position + " was clicked before adapter is ready. Ignoring");
-        }
-    }
-
-    protected Uri getPhoneUri(int position) {
-        final PhoneNumberListAdapter adapter = (PhoneNumberListAdapter) getAdapter();
-        return adapter.getDataUri(position);
-    }
-
-    @Override
-    protected void startLoading() {
-        mLoaderStarted = true;
-        super.startLoading();
-    }
-
-    @Override
-    public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
-        super.onLoadFinished(loader, data);
-
-        // disable scroll bar if there is no data
-        setVisibleScrollbarEnabled(data.getCount() > 0);
-    }
-
-    public void setUseCallableUri(boolean useCallableUri) {
-        mUseCallableUri = useCallableUri;
-    }
-
-    public boolean usesCallableUri() {
-        return mUseCallableUri;
-    }
-
-    @Override
-    protected ContactEntryListAdapter createListAdapter() {
-        PhoneNumberListAdapter adapter = new PhoneNumberListAdapter(getActivity());
-        adapter.setDisplayPhotos(true);
-        adapter.setUseCallableUri(mUseCallableUri);
-        return adapter;
-    }
-
-    @Override
-    protected void configureAdapter() {
-        super.configureAdapter();
-
-        final ContactEntryListAdapter adapter = getAdapter();
-        if (adapter == null) {
-            return;
-        }
-
-        if (!isSearchMode() && mFilter != null) {
-            adapter.setFilter(mFilter);
-        }
-
-        setPhotoPosition(adapter);
-    }
-
-    protected void setPhotoPosition(ContactEntryListAdapter adapter) {
-        ((PhoneNumberListAdapter) adapter).setPhotoPosition(mPhotoPosition);
-    }
-
-    @Override
-    protected View inflateView(LayoutInflater inflater, ViewGroup container) {
-        return inflater.inflate(R.layout.contact_list_content, null);
-    }
-
-    public void pickPhoneNumber(Uri uri) {
-        if (mShortcutAction == null) {
-            mListener.onPickPhoneNumberAction(uri);
-        } else {
-            startPhoneNumberShortcutIntent(uri);
-        }
-    }
-
-    protected void startPhoneNumberShortcutIntent(Uri uri) {
-        ShortcutIntentBuilder builder = new ShortcutIntentBuilder(getActivity(), this);
-        builder.createPhoneNumberShortcutIntent(uri, mShortcutAction);
-    }
-
-    public void onShortcutIntentCreated(Uri uri, Intent shortcutIntent) {
-        mListener.onShortcutIntentCreated(shortcutIntent);
-    }
-
-    @Override
-    public void onPickerResult(Intent data) {
-        mListener.onPickPhoneNumberAction(data.getData());
-    }
-
-    @Override
-    public void onActivityResult(int requestCode, int resultCode, Intent data) {
-        if (requestCode == REQUEST_CODE_ACCOUNT_FILTER) {
-            if (getActivity() != null) {
-                AccountFilterUtil.handleAccountFilterResult(
-                        ContactListFilterController.getInstance(getActivity()), resultCode, data);
-            } else {
-                Log.e(TAG, "getActivity() returns null during Fragment#onActivityResult()");
-            }
-        }
-    }
-
-    public ContactListFilter getFilter() {
-        return mFilter;
-    }
-
-    public void setFilter(ContactListFilter filter) {
-        if ((mFilter == null && filter == null) ||
-                (mFilter != null && mFilter.equals(filter))) {
-            return;
-        }
-
-        mFilter = filter;
-        if (mLoaderStarted) {
-            reloadData();
-        }
-        updateFilterHeaderView();
-    }
-
-    public void setPhotoPosition(ContactListItemView.PhotoPosition photoPosition) {
-        mPhotoPosition = photoPosition;
-
-        final PhoneNumberListAdapter adapter = (PhoneNumberListAdapter) getAdapter();
-        if (adapter != null) {
-            adapter.setPhotoPosition(photoPosition);
-        }
-    }
-}
diff --git a/src/com/android/contacts/list/PostalAddressPickerFragment.java b/src/com/android/contacts/list/PostalAddressPickerFragment.java
index a874708..a23a78b 100644
--- a/src/com/android/contacts/list/PostalAddressPickerFragment.java
+++ b/src/com/android/contacts/list/PostalAddressPickerFragment.java
@@ -22,6 +22,7 @@
 
 import com.android.contacts.R;
 import com.android.contacts.common.list.ContactEntryListAdapter;
+import com.android.contacts.common.list.ContactEntryListFragment;
 import com.android.contacts.common.list.DirectoryListLoader;
 
 /**