Controller becomes Fragment and Configuration disappears.

Change-Id: I432b16f8b617765e770a8b2be34632c10d5d913d
diff --git a/src/com/android/contacts/ContactsApplicationController.java b/src/com/android/contacts/ContactsApplicationController.java
index ac7fd3f..41daf26 100644
--- a/src/com/android/contacts/ContactsApplicationController.java
+++ b/src/com/android/contacts/ContactsApplicationController.java
@@ -17,8 +17,10 @@
 
 /**
  * An interface that captures various top-level actions that can be performed in
- * the Contacts app.
+ * the Contacts app.  This is a temporary class to be replaced by individual
+ * listeners for various actions.
  */
+@Deprecated
 public interface ContactsApplicationController {
 
     /**
diff --git a/src/com/android/contacts/ContactsListActivity.java b/src/com/android/contacts/ContactsListActivity.java
index 3187e41..beb693a 100644
--- a/src/com/android/contacts/ContactsListActivity.java
+++ b/src/com/android/contacts/ContactsListActivity.java
@@ -17,9 +17,11 @@
 package com.android.contacts;
 
 import com.android.contacts.list.ContactEntryListAdapter;
-import com.android.contacts.list.ContactEntryListConfiguration;
+import com.android.contacts.list.ContactEntryListFragment;
 import com.android.contacts.list.ContactItemListAdapter;
 import com.android.contacts.list.ContactsIntentResolver;
+import com.android.contacts.list.DefaultContactListFragment;
+import com.android.contacts.list.MultiplePhonePickerFragment;
 import com.android.contacts.model.ContactsSource;
 import com.android.contacts.model.Sources;
 import com.android.contacts.ui.ContactsPreferences;
@@ -33,6 +35,7 @@
 import android.app.Activity;
 import android.app.AlertDialog;
 import android.app.Dialog;
+import android.app.FragmentTransaction;
 import android.app.SearchManager;
 import android.content.AsyncQueryHandler;
 import android.content.ContentResolver;
@@ -454,7 +457,7 @@
     };
 
     private ContactsIntentResolver mIntentResolver;
-    protected ContactEntryListConfiguration mConfig;
+    protected ContactEntryListFragment mListFragment;
 
     private ListView mListView;
 
@@ -484,24 +487,29 @@
         // Resolve the intent
         final Intent intent = getIntent();
 
-        mConfig = resolveIntent(intent);
-        initContentView();
+        if (!resolveIntent(intent)) {
+            return;
+        }
+
+        FragmentTransaction transaction = openFragmentTransaction();
+        transaction.add(mListFragment, android.R.id.content);
+        transaction.commit();
     }
 
-    protected ContactEntryListConfiguration resolveIntent(final Intent intent) {
+    protected boolean resolveIntent(final Intent intent) {
         mIntentResolver.setIntent(intent);
 
         if (!mIntentResolver.isValid()) {           // Invalid intent
             setResult(RESULT_CANCELED);
             finish();
-            return null;
+            return false;
         }
 
         Intent redirect = mIntentResolver.getRedirectIntent();
         if (redirect != null) {             // Need to start a different activity
             startActivity(redirect);
             finish();
-            return null;
+            return false;
         }
 
         setTitle(mIntentResolver.getActivityTitle());
@@ -521,22 +529,46 @@
         mShowNumberOfContacts = mIntentResolver.mShowNumberOfContacts;
         mGroupName = mIntentResolver.mGroupName;
 
-        return mIntentResolver.getConfiguration();
-    }
-
-    public void initContentView() {
-        setContentView(mConfig.createView());
-
-        mListView = (ListView) findViewById(android.R.id.list);
-
-        if (mSearchMode) {
-            setupSearchView();
+        switch (mMode) {
+            case MODE_DEFAULT: {
+                mListFragment = new DefaultContactListFragment();
+                if (!mSearchMode) {
+                    mListFragment.setSectionHeaderDisplayEnabled(true);
+                }
+                break;
+            }
+            case MODE_LEGACY_PICK_POSTAL:
+            case MODE_PICK_POSTAL:
+            case MODE_LEGACY_PICK_PHONE:
+            case MODE_PICK_PHONE:
+            case MODE_STREQUENT:
+            case MODE_FREQUENT: {
+                mListFragment = new DefaultContactListFragment();
+                break;
+            }
+            case MODE_PICK_MULTIPLE_PHONES: {
+                mListFragment = new MultiplePhonePickerFragment();
+                break;
+            }
+            default: {
+                mListFragment = new DefaultContactListFragment();
+                if (!mSearchMode) {
+                    mListFragment.setSectionHeaderDisplayEnabled(true);
+                }
+            }
         }
 
-        View emptyView = mListView.getEmptyView();
-        if (emptyView instanceof ContactListEmptyView) {
-            mEmptyView = (ContactListEmptyView)emptyView;
+        mListFragment.setSearchMode(mSearchMode);
+        mListFragment.setSearchResultsMode(mSearchResultsMode);
+        mListFragment.setQueryString(mInitialFilter);
+
+        if ((mMode & MODE_MASK_SHOW_PHOTOS) == MODE_MASK_SHOW_PHOTOS) {
+            mListFragment.setPhotoLoaderEnabled(true);
         }
+
+        mListFragment.setContactsApplicationController(this);
+
+        return true;
     }
 
     // TODO move this to the configuration object(s)
@@ -583,7 +615,7 @@
     public void onScrollStateChanged(AbsListView view, int scrollState) {
         if (scrollState == OnScrollListener.SCROLL_STATE_FLING) {
             mPhotoLoader.pause();
-        } else if (mConfig.isPhotoLoaderEnabled()) {
+        } else if (mListFragment.isPhotoLoaderEnabled()) {
             mPhotoLoader.resume();
         }
     }
@@ -649,6 +681,18 @@
     protected void onResume() {
         super.onResume();
 
+        // TODO move this to onAttach of the corresponding fragment
+        mListView = (ListView) findViewById(android.R.id.list);
+
+        if (mSearchMode) {
+            setupSearchView();
+        }
+
+        View emptyView = mListView.getEmptyView();
+        if (emptyView instanceof ContactListEmptyView) {
+            mEmptyView = (ContactListEmptyView)emptyView;
+        }
+
         registerProviderStatusObserver();
         mPhotoLoader.resume();
 
@@ -1933,7 +1977,7 @@
             baseUri = Contacts.CONTENT_URI;
         }
 
-        if (mConfig.isSectionHeaderDisplayEnabled()) {
+        if (mListFragment.isSectionHeaderDisplayEnabled()) {
             return buildSectionIndexerUri(baseUri);
         } else {
             return baseUri;
diff --git a/src/com/android/contacts/JoinContactActivity.java b/src/com/android/contacts/JoinContactActivity.java
index e555523..bacd0af 100644
--- a/src/com/android/contacts/JoinContactActivity.java
+++ b/src/com/android/contacts/JoinContactActivity.java
@@ -17,9 +17,8 @@
 package com.android.contacts;
 
 
-import com.android.contacts.list.ContactEntryListConfiguration;
 import com.android.contacts.list.JoinContactListAdapter;
-import com.android.contacts.list.JoinContactListConfiguration;
+import com.android.contacts.list.JoinContactListFragment;
 
 import android.content.ContentUris;
 import android.content.Intent;
@@ -72,7 +71,7 @@
     private JoinContactListAdapter mAdapter;
 
     @Override
-    protected ContactEntryListConfiguration resolveIntent(Intent intent) {
+    protected boolean resolveIntent(Intent intent) {
         mMode = MODE_PICK_CONTACT;
         mTargetContactId = intent.getLongExtra(EXTRA_TARGET_CONTACT_ID, -1);
         if (mTargetContactId == -1) {
@@ -80,15 +79,19 @@
                     + EXTRA_TARGET_CONTACT_ID);
             setResult(RESULT_CANCELED);
             finish();
-            return null;
+            return false;
         }
-        return new JoinContactListConfiguration(this, this);
+
+        mListFragment = new JoinContactListFragment();
+
+        return true;
     }
 
     @Override
-    public void initContentView() {
-        setContentView(mConfig.createView());
+    protected void onResume() {
+        super.onResume();
 
+        // TODO move this to onAttach of the corresponding fragment
         TextView blurbView = (TextView)findViewById(R.id.join_contact_blurb);
 
         String blurb = getString(R.string.blurbJoinContactDataWith,
diff --git a/src/com/android/contacts/MultiplePhonePickerActivity.java b/src/com/android/contacts/MultiplePhonePickerActivity.java
index 3eeb20a..492f419 100644
--- a/src/com/android/contacts/MultiplePhonePickerActivity.java
+++ b/src/com/android/contacts/MultiplePhonePickerActivity.java
@@ -18,7 +18,6 @@
 
 import com.android.contacts.list.MultiplePhoneExtraAdapter;
 import com.android.contacts.list.MultiplePhonePickerAdapter;
-import com.android.contacts.list.MultiplePhonePickerConfiguration;
 import com.android.contacts.list.MultiplePhonePickerItemView;
 import com.android.contacts.list.MultiplePhoneSelection;
 
@@ -129,8 +128,10 @@
     }
 
     @Override
-    public void initContentView() {
-        super.initContentView();
+    protected void onResume() {
+        super.onResume();
+
+        // TODO move this to onAttach of the corresponding fragment
         ListView listView = (ListView)findViewById(android.R.id.list);
         ((MultiplePhonePickerAdapter)listView.getAdapter()).setExtraAdapter(mPhoneNumberAdapter);
         ViewStub stub = (ViewStub)findViewById(R.id.footer_stub);
diff --git a/src/com/android/contacts/list/ContactEntryListController.java b/src/com/android/contacts/list/ContactEntryListController.java
deleted file mode 100644
index a190b4e..0000000
--- a/src/com/android/contacts/list/ContactEntryListController.java
+++ /dev/null
@@ -1,82 +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 com.android.contacts.ContactsApplicationController;
-
-import android.content.Context;
-import android.view.View;
-import android.view.inputmethod.InputMethodManager;
-import android.widget.AdapterView;
-import android.widget.ListAdapter;
-import android.widget.ListView;
-
-/**
- * Common base class for various contact-related list controllers.
- */
-public abstract class ContactEntryListController implements AdapterView.OnItemClickListener {
-
-    private final Context mContext;
-    private final ContactsApplicationController mAppController;
-    private ListAdapter mAdapter;
-    private ListView mListView;
-
-    public ContactEntryListController(Context context,
-            ContactsApplicationController appController) {
-        this.mContext = context;
-        this.mAppController = appController;
-    }
-
-    public Context getContext() {
-        return mContext;
-    }
-
-    public ContactsApplicationController getContactsApplicationController() {
-        return mAppController;
-    }
-
-    public void setAdapter(ListAdapter adapter) {
-        mAdapter = adapter;
-    }
-
-    public ListAdapter getAdapter() {
-        return mAdapter;
-    }
-
-    public void setListView(ListView listView) {
-        mListView = listView;
-    }
-
-    public ListView getListView() {
-        return mListView;
-    }
-
-    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
-        hideSoftKeyboard();
-
-        onItemClick(position, id);
-    }
-
-    protected abstract void onItemClick(int position, long id);
-
-    private void hideSoftKeyboard() {
-        // Hide soft keyboard, if visible
-        InputMethodManager inputMethodManager = (InputMethodManager)
-                mContext.getSystemService(Context.INPUT_METHOD_SERVICE);
-        inputMethodManager.hideSoftInputFromWindow(mListView.getWindowToken(), 0);
-    }
-}
diff --git a/src/com/android/contacts/list/ContactEntryListConfiguration.java b/src/com/android/contacts/list/ContactEntryListFragment.java
similarity index 61%
rename from src/com/android/contacts/list/ContactEntryListConfiguration.java
rename to src/com/android/contacts/list/ContactEntryListFragment.java
index 88cf001..25f5674 100644
--- a/src/com/android/contacts/list/ContactEntryListConfiguration.java
+++ b/src/com/android/contacts/list/ContactEntryListFragment.java
@@ -21,98 +21,37 @@
 import com.android.contacts.R;
 import com.android.contacts.widget.PinnedHeaderListView;
 
+import android.app.Fragment;
 import android.content.Context;
 import android.text.Html;
+import android.view.LayoutInflater;
 import android.view.View;
+import android.view.ViewGroup;
+import android.view.inputmethod.InputMethodManager;
+import android.widget.AdapterView;
 import android.widget.ListAdapter;
 import android.widget.ListView;
 import android.widget.TextView;
 
 /**
- * Common base class for configurations of various contact-related lists, e.g.
- * contact list, phone number list etc.
+ * Common base class for various contact-related list fragments.
  */
-public abstract class ContactEntryListConfiguration {
+public abstract class ContactEntryListFragment extends Fragment
+        implements AdapterView.OnItemClickListener {
 
-    private final Context mContext;
-    private final ContactsApplicationController mApplicationController;
     private boolean mSectionHeaderDisplayEnabled;
     private boolean mPhotoLoaderEnabled;
     private boolean mSearchMode;
     private boolean mSearchResultsMode;
     private String mQueryString;
 
-    public ContactEntryListConfiguration(Context context,
-            ContactsApplicationController applicationController) {
-        this.mContext = context;
-        this.mApplicationController = applicationController;
-    }
+    private ContactsApplicationController mAppController;
+    private ListAdapter mAdapter;
+    private ListView mListView;
 
-    public Context getContext() {
-        return mContext;
-    }
-
-    public ContactsApplicationController getApplicationController() {
-        return mApplicationController;
-    }
-
-    protected abstract View inflateView();
+    protected abstract View inflateView(LayoutInflater inflater, ViewGroup container);
     protected abstract ListAdapter createListAdapter();
-    protected abstract ContactEntryListController createController();
-
-    public View createView() {
-        View view = inflateView();
-        ListAdapter adapter = createListAdapter();
-        ContactEntryListController controller = createController();
-        configureView(view, adapter, controller);
-        return view;
-    }
-
-    protected void configureView(View view, ListAdapter adapter,
-            ContactEntryListController controller) {
-        ListView listView = (ListView)view.findViewById(android.R.id.list);
-        if (listView == null) {
-            throw new RuntimeException(
-                    "Your content must have a ListView whose id attribute is " +
-                    "'android.R.id.list'");
-        }
-
-        View emptyView = view.findViewById(com.android.internal.R.id.empty);
-        if (emptyView != null) {
-            listView.setEmptyView(emptyView);
-        }
-
-        controller.setAdapter(adapter);
-        listView.setAdapter(adapter);
-        listView.setOnItemClickListener(controller);
-        controller.setListView(listView);
-
-        ((ContactsListActivity)mContext).setupListView(adapter, listView);
-
-        configurePinnedHeader(listView, adapter);
-
-        if (isSearchResultsMode()) {
-            TextView titleText = (TextView)view.findViewById(R.id.search_results_for);
-            if (titleText != null) {
-                titleText.setText(Html.fromHtml(getContext().getString(R.string.search_results_for,
-                        "<b>" + getQueryString() + "</b>")));
-            }
-        }
-    }
-
-    private void configurePinnedHeader(ListView listView, ListAdapter adapter) {
-        if (!mSectionHeaderDisplayEnabled) {
-            return;
-        }
-
-        if (listView instanceof PinnedHeaderListView
-                && adapter instanceof PinnedHeaderListAdapter) {
-            PinnedHeaderListView pinnedHeaderList = (PinnedHeaderListView)listView;
-            PinnedHeaderListAdapter pinnedHeaderListAdapter = (PinnedHeaderListAdapter)adapter;
-            View headerView = pinnedHeaderListAdapter.createPinnedHeaderView(pinnedHeaderList);
-            pinnedHeaderList.setPinnedHeaderView(headerView);
-        }
-    }
+    protected abstract void onItemClick(int position, long id);
 
     public void setSectionHeaderDisplayEnabled(boolean flag) {
         mSectionHeaderDisplayEnabled = flag;
@@ -153,4 +92,79 @@
     public void setQueryString(String queryString) {
         mQueryString = queryString;
     }
+
+    @Deprecated
+    public void setContactsApplicationController(ContactsApplicationController controller) {
+        mAppController = controller;
+    }
+
+    @Deprecated
+    public ContactsApplicationController getContactsApplicationController() {
+        return mAppController;
+    }
+
+    @Override
+    public View onCreateView(LayoutInflater inflater, ViewGroup container) {
+        View view = inflateView(inflater, container);
+        mAdapter = createListAdapter();
+        configureView(view, mAdapter);
+        return view;
+    }
+
+    protected void configureView(View view, ListAdapter adapter) {
+        mListView = (ListView)view.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 = view.findViewById(com.android.internal.R.id.empty);
+        if (emptyView != null) {
+            mListView.setEmptyView(emptyView);
+        }
+
+        mListView.setAdapter(adapter);
+        mListView.setOnItemClickListener(this);
+
+        ((ContactsListActivity)getActivity()).setupListView(adapter, mListView);
+
+        configurePinnedHeader(mListView, adapter);
+
+        if (isSearchResultsMode()) {
+            TextView titleText = (TextView)view.findViewById(R.id.search_results_for);
+            if (titleText != null) {
+                titleText.setText(Html.fromHtml(getActivity().getString(R.string.search_results_for,
+                        "<b>" + getQueryString() + "</b>")));
+            }
+        }
+    }
+
+    private void configurePinnedHeader(ListView listView, ListAdapter adapter) {
+        if (!mSectionHeaderDisplayEnabled) {
+            return;
+        }
+
+        if (listView instanceof PinnedHeaderListView
+                && adapter instanceof PinnedHeaderListAdapter) {
+            PinnedHeaderListView pinnedHeaderList = (PinnedHeaderListView)listView;
+            PinnedHeaderListAdapter pinnedHeaderListAdapter = (PinnedHeaderListAdapter)adapter;
+            View headerView = pinnedHeaderListAdapter.createPinnedHeaderView(pinnedHeaderList);
+            pinnedHeaderList.setPinnedHeaderView(headerView);
+        }
+    }
+
+    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
+        hideSoftKeyboard();
+
+        onItemClick(position, id);
+    }
+
+
+    private void hideSoftKeyboard() {
+        // Hide soft keyboard, if visible
+        InputMethodManager inputMethodManager = (InputMethodManager)
+                getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
+        inputMethodManager.hideSoftInputFromWindow(mListView.getWindowToken(), 0);
+    }
 }
diff --git a/src/com/android/contacts/list/ContactsIntentResolver.java b/src/com/android/contacts/list/ContactsIntentResolver.java
index b5f8caf..1aec32d 100644
--- a/src/com/android/contacts/list/ContactsIntentResolver.java
+++ b/src/com/android/contacts/list/ContactsIntentResolver.java
@@ -474,46 +474,4 @@
         }
         return null;
     }
-
-    public ContactEntryListConfiguration getConfiguration() {
-        ContactEntryListConfiguration config;
-        switch (mMode) {
-            case MODE_DEFAULT: {
-                config = new DefaultContactListConfiguration(mContext, mAppController);
-                if (!mSearchMode) {
-                    config.setSectionHeaderDisplayEnabled(true);
-                }
-                break;
-            }
-            case MODE_LEGACY_PICK_POSTAL:
-            case MODE_PICK_POSTAL:
-            case MODE_LEGACY_PICK_PHONE:
-            case MODE_PICK_PHONE:
-            case MODE_STREQUENT:
-            case MODE_FREQUENT: {
-                config = new DefaultContactListConfiguration(mContext, mAppController);
-                break;
-            }
-            case MODE_PICK_MULTIPLE_PHONES: {
-                config = new MultiplePhonePickerConfiguration(mContext, mAppController);
-                break;
-            }
-            default: {
-                config = new DefaultContactListConfiguration(mContext, mAppController);
-                if (!mSearchMode) {
-                    config.setSectionHeaderDisplayEnabled(true);
-                }
-            }
-        }
-
-        config.setSearchMode(mSearchMode);
-        config.setSearchResultsMode(mSearchResultsMode);
-        config.setQueryString(mInitialFilter);
-
-        if ((mMode & MODE_MASK_SHOW_PHOTOS) == MODE_MASK_SHOW_PHOTOS) {
-            config.setPhotoLoaderEnabled(true);
-        }
-
-        return config;
-    }
 }
diff --git a/src/com/android/contacts/list/DefaultContactListController.java b/src/com/android/contacts/list/DefaultContactListController.java
deleted file mode 100644
index 4bb1416..0000000
--- a/src/com/android/contacts/list/DefaultContactListController.java
+++ /dev/null
@@ -1,39 +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 com.android.contacts.ContactsApplicationController;
-
-import android.content.Context;
-
-/**
- * Controller for the default contact list.
- */
-public class DefaultContactListController extends ContactEntryListController {
-
-    public DefaultContactListController(Context context,
-            ContactsApplicationController appController) {
-        super(context, appController);
-    }
-
-    @Override
-    protected void onItemClick(int position, long id) {
-        // TODO instead of delegating the entire procedure to the ContactsListActivity,
-        // figure out what the specific action is and delegate the specific action.
-        getContactsApplicationController().onListItemClick(position, id);
-    }
-}
diff --git a/src/com/android/contacts/list/DefaultContactListConfiguration.java b/src/com/android/contacts/list/DefaultContactListFragment.java
similarity index 67%
rename from src/com/android/contacts/list/DefaultContactListConfiguration.java
rename to src/com/android/contacts/list/DefaultContactListFragment.java
index 52238aa..51ee2cc 100644
--- a/src/com/android/contacts/list/DefaultContactListConfiguration.java
+++ b/src/com/android/contacts/list/DefaultContactListFragment.java
@@ -13,44 +13,40 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
+
 package com.android.contacts.list;
 
-import com.android.contacts.ContactsApplicationController;
 import com.android.contacts.ContactsListActivity;
 import com.android.contacts.R;
 
-import android.content.Context;
 import android.view.LayoutInflater;
 import android.view.View;
+import android.view.ViewGroup;
 import android.widget.ListAdapter;
 
 /**
- * Configuration for the default contact list.
+ * Fragment for the default contact list.
  */
-public class DefaultContactListConfiguration extends ContactEntryListConfiguration {
+public class DefaultContactListFragment extends ContactEntryListFragment {
 
-    public DefaultContactListConfiguration(Context context,
-            ContactsApplicationController applicationController) {
-        super(context, applicationController);
+    @Override
+    protected void onItemClick(int position, long id) {
+        // TODO instead of delegating the entire procedure to the ContactsListActivity,
+        // figure out what the specific action is and delegate the specific action.
+        getContactsApplicationController().onListItemClick(position, id);
     }
 
     @Override
-    public ListAdapter createListAdapter() {
+    protected ListAdapter createListAdapter() {
         ContactItemListAdapter adapter =
-                new ContactItemListAdapter((ContactsListActivity)getContext());
+                new ContactItemListAdapter((ContactsListActivity)getActivity());
         adapter.setSectionHeaderDisplayEnabled(isSectionHeaderDisplayEnabled());
         adapter.setDisplayPhotos(isPhotoLoaderEnabled());
         return adapter;
     }
 
     @Override
-    public ContactEntryListController createController() {
-        return new DefaultContactListController(getContext(), getApplicationController());
-    }
-
-    @Override
-    protected View inflateView() {
-        LayoutInflater inflater = LayoutInflater.from(getContext());
+    protected View inflateView(LayoutInflater inflater, ViewGroup container) {
         if (isSearchMode()) {
             return inflater.inflate(R.layout.contacts_search_content, null);
         } else if (isSearchResultsMode()) {
diff --git a/src/com/android/contacts/list/JoinContactListConfiguration.java b/src/com/android/contacts/list/JoinContactListFragment.java
similarity index 63%
rename from src/com/android/contacts/list/JoinContactListConfiguration.java
rename to src/com/android/contacts/list/JoinContactListFragment.java
index 5839010..52beb4a 100644
--- a/src/com/android/contacts/list/JoinContactListConfiguration.java
+++ b/src/com/android/contacts/list/JoinContactListFragment.java
@@ -15,44 +15,36 @@
  */
 package com.android.contacts.list;
 
-import com.android.contacts.ContactsApplicationController;
 import com.android.contacts.JoinContactActivity;
 import com.android.contacts.R;
 
-import android.content.Context;
 import android.view.LayoutInflater;
 import android.view.View;
+import android.view.ViewGroup;
 import android.widget.ListAdapter;
 
 /**
- * Configuration for the default contact list.
+ * Fragment for the Join Contact list.
  */
-public class JoinContactListConfiguration extends ContactEntryListConfiguration {
-
-    public JoinContactListConfiguration(Context context,
-            ContactsApplicationController applicationController) {
-        super(context, applicationController);
-    }
+public class JoinContactListFragment extends ContactEntryListFragment {
 
     @Override
     public ListAdapter createListAdapter() {
         JoinContactListAdapter adapter =
-                new JoinContactListAdapter((JoinContactActivity)getContext());
+                new JoinContactListAdapter((JoinContactActivity)getActivity());
         adapter.setSectionHeaderDisplayEnabled(true);
         adapter.setDisplayPhotos(true);
         return adapter;
     }
 
     @Override
-    public ContactEntryListController createController() {
-
-        // TODO needs a separate controller
-        return new DefaultContactListController(getContext(), getApplicationController());
+    protected View inflateView(LayoutInflater inflater, ViewGroup container) {
+        return inflater.inflate(R.layout.contacts_list_content_join, null);
     }
 
     @Override
-    protected View inflateView() {
-        LayoutInflater inflater = LayoutInflater.from(getContext());
-        return inflater.inflate(R.layout.contacts_list_content_join, null);
+    protected void onItemClick(int position, long id) {
+        // TODO
+        throw new UnsupportedOperationException();
     }
 }
diff --git a/src/com/android/contacts/list/MultiplePhonePickerConfiguration.java b/src/com/android/contacts/list/MultiplePhonePickerFragment.java
similarity index 61%
rename from src/com/android/contacts/list/MultiplePhonePickerConfiguration.java
rename to src/com/android/contacts/list/MultiplePhonePickerFragment.java
index 66c3d95..fd3b517 100644
--- a/src/com/android/contacts/list/MultiplePhonePickerConfiguration.java
+++ b/src/com/android/contacts/list/MultiplePhonePickerFragment.java
@@ -15,45 +15,36 @@
  */
 package com.android.contacts.list;
 
-import com.android.contacts.ContactsApplicationController;
 import com.android.contacts.MultiplePhonePickerActivity;
 import com.android.contacts.R;
 
-import android.content.Context;
 import android.view.LayoutInflater;
 import android.view.View;
+import android.view.ViewGroup;
 import android.widget.ListAdapter;
 
 /**
- * Configuration for the multiple phone picker.
+ * Fragment for the multiple phone picker.
  */
-public class MultiplePhonePickerConfiguration extends ContactEntryListConfiguration {
-
-    public MultiplePhonePickerConfiguration(Context context,
-            ContactsApplicationController applicationController) {
-        super(context, applicationController);
-    }
+public class MultiplePhonePickerFragment extends ContactEntryListFragment {
 
     @Override
     public ListAdapter createListAdapter() {
         MultiplePhonePickerAdapter adapter =
-                new MultiplePhonePickerAdapter((MultiplePhonePickerActivity)getContext());
+                new MultiplePhonePickerAdapter((MultiplePhonePickerActivity)getActivity());
         adapter.setSectionHeaderDisplayEnabled(true);
         adapter.setDisplayPhotos(true);
         return adapter;
     }
 
     @Override
-    public ContactEntryListController createController() {
-
-        // TODO this needs a separate controller
-        return new DefaultContactListController(getContext(), getApplicationController());
+    protected View inflateView(LayoutInflater inflater, ViewGroup container) {
+        return inflater.inflate(R.layout.contacts_list_content, null);
     }
 
     @Override
-    protected View inflateView() {
-        // TODO implement a proper search mode for MultiPicker
-        LayoutInflater inflater = LayoutInflater.from(getContext());
-        return inflater.inflate(R.layout.contacts_list_content, null);
+    protected void onItemClick(int position, long id) {
+        // TODO
+        throw new UnsupportedOperationException();
     }
 }