Merge "Group detail page and list of members"
diff --git a/res/layout/dialtacts_activity.xml b/res/layout/dialtacts_activity.xml
index 14a6b39..63ca3bd 100644
--- a/res/layout/dialtacts_activity.xml
+++ b/res/layout/dialtacts_activity.xml
@@ -14,26 +14,35 @@
      limitations under the License.
 -->
 
-<TabHost xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@android:id/tabhost"
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
     android:layout_height="match_parent">
 
-    <LinearLayout
-        android:orientation="vertical"
+    <!-- Dialer --> -->
+    <fragment
+        class="com.android.contacts.dialpad.DialpadFragment"
+        android:id="@+id/dialpad_fragment"
         android:layout_width="match_parent"
-        android:layout_height="match_parent">
+        android:layout_height="match_parent" />
 
-        <TabWidget android:id="@android:id/tabs"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-        />
+    <!-- Call Log -->
+    <fragment
+        class="com.android.contacts.calllog.CallLogFragment"
+        android:id="@+id/call_log_fragment"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent" />
 
-        <FrameLayout android:id="@android:id/tabcontent"
-            android:layout_width="match_parent"
-            android:layout_height="0dip"
-            android:layout_weight="1"
-        />
-    </LinearLayout>
-</TabHost>
+    <!-- Contacts -->
+    <fragment
+        android:id="@+id/contacts_fragment"
+        class="com.android.contacts.list.DefaultContactBrowseListFragment"
+        android:layout_height="match_parent"
+        android:layout_width="match_parent" />
 
+    <!-- Favorites -->
+    <fragment
+        android:id="@+id/favorites_fragment"
+        class="com.android.contacts.list.DefaultContactBrowseListFragment"
+        android:layout_height="match_parent"
+        android:layout_width="match_parent" />
+</FrameLayout>
\ No newline at end of file
diff --git a/res/values/styles.xml b/res/values/styles.xml
index 2c2f791..0582fd4 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -15,8 +15,27 @@
 -->
 <resources>
     <style name="DialtactsTheme" parent="android:Theme.Holo.Light">
-        <item name="android:windowNoTitle">true</item>
         <item name="android:windowContentOverlay">@null</item>
+        <item name="list_item_height">?android:attr/listPreferredItemHeight</item>
+        <item name="activated_background">@drawable/list_item_activated_background</item>
+        <item name="section_header_background">@drawable/list_title_holo</item>
+        <item name="list_section_header_height">32dip</item>
+        <item name="list_item_divider">@drawable/list_item_divider</item>
+        <item name="list_item_padding_top">4dip</item>
+        <item name="list_item_padding_right">11dip</item>
+        <item name="list_item_padding_bottom">4dip</item>
+        <item name="list_item_padding_left">4dip</item>
+        <item name="list_item_gap_between_image_and_text">8dip</item>
+        <item name="list_item_gap_between_label_and_data">5dip</item>
+        <item name="list_item_call_button_padding">14dip</item>
+        <item name="list_item_vertical_divider_margin">5dip</item>
+        <item name="list_item_presence_icon_margin">5dip</item>
+        <item name="list_item_photo_size">56dip</item>
+        <item name="list_item_prefix_highlight_color">#729a27</item>
+        <item name="list_item_header_text_indent">56dip</item>
+        <item name="list_item_header_text_color">?color/section_header_text_color</item>
+        <item name="list_item_header_text_size">14sp</item>
+        <item name="contact_filter_popup_width">320dip</item>
     </style>
 
     <style name="CallDetailActivityTheme" parent="android:Theme.Holo.Light">
diff --git a/src/com/android/contacts/activities/ContactBrowserActivity.java b/src/com/android/contacts/activities/ContactBrowserActivity.java
index 52d7b36..0672481 100644
--- a/src/com/android/contacts/activities/ContactBrowserActivity.java
+++ b/src/com/android/contacts/activities/ContactBrowserActivity.java
@@ -42,7 +42,6 @@
 import com.android.contacts.model.AccountTypeManager;
 import com.android.contacts.preference.ContactsPreferenceActivity;
 import com.android.contacts.util.AccountSelectionUtil;
-import com.android.contacts.util.AccountsListAdapter;
 import com.android.contacts.util.DialogManager;
 import com.android.contacts.widget.ContextMenuAdapter;
 
@@ -69,9 +68,6 @@
 import android.view.View;
 import android.view.View.OnClickListener;
 import android.view.Window;
-import android.widget.AdapterView;
-import android.widget.AdapterView.OnItemClickListener;
-import android.widget.ListPopupWindow;
 import android.widget.Toast;
 
 import java.util.ArrayList;
@@ -88,9 +84,8 @@
     private static final String TAG = "ContactBrowserActivity";
 
     private static final int SUBACTIVITY_NEW_CONTACT = 2;
-    private static final int SUBACTIVITY_SETTINGS = 3;
-    private static final int SUBACTIVITY_EDIT_CONTACT = 4;
-    private static final int SUBACTIVITY_CUSTOMIZE_FILTER = 5;
+    private static final int SUBACTIVITY_EDIT_CONTACT = 3;
+    private static final int SUBACTIVITY_CUSTOMIZE_FILTER = 4;
 
     private static final String KEY_SEARCH_MODE = "searchMode";
 
@@ -725,7 +720,7 @@
         switch (item.getItemId()) {
             case R.id.menu_settings: {
                 final Intent intent = new Intent(this, ContactsPreferenceActivity.class);
-                startActivityForResult(intent, SUBACTIVITY_SETTINGS);
+                startActivity(intent);
                 return true;
             }
             case R.id.menu_search: {
@@ -836,9 +831,6 @@
                 break;
             }
 
-            case SUBACTIVITY_SETTINGS:
-                break;
-
             // TODO: Using the new startActivityWithResultFromFragment API this should not be needed
             // anymore
             case ContactEntryListFragment.ACTIVITY_REQUEST_CODE_PICKER:
diff --git a/src/com/android/contacts/activities/DialpadActivity.java b/src/com/android/contacts/activities/DialpadActivity.java
index a30460a..bb122df 100644
--- a/src/com/android/contacts/activities/DialpadActivity.java
+++ b/src/com/android/contacts/activities/DialpadActivity.java
@@ -108,31 +108,6 @@
     }
 
     @Override
-    public boolean onCreateOptionsMenu(Menu menu) {
-        super.onCreateOptionsMenu(menu);
-
-        // Nothing to do here; see DialpadFragment.onCreateOptionsMenu().
-        return true;
-    }
-
-    @Override
-    public boolean onPrepareOptionsMenu(Menu menu) {
-        // The DialpadFragment completely owns the options menu,
-        // so we don't add any items here.  We *do* however
-        // have to return false here if the DialpadFragment
-        // says there shouldn't be a menu at all.
-        if (!mFragment.allowOptionsMenu()) {
-            return false;
-        }
-
-        super.onPrepareOptionsMenu(menu);
-
-        // See DialpadFragment.onPrepareOptionsMenu() for the actual menu
-        // contents.
-        return true;
-    }
-
-    @Override
     public boolean onKeyDown(int keyCode, KeyEvent event) {
         switch (keyCode) {
             case KeyEvent.KEYCODE_CALL: {
diff --git a/src/com/android/contacts/activities/DialtactsActivity.java b/src/com/android/contacts/activities/DialtactsActivity.java
index 869ae2a..ae8f479 100644
--- a/src/com/android/contacts/activities/DialtactsActivity.java
+++ b/src/com/android/contacts/activities/DialtactsActivity.java
@@ -17,13 +17,26 @@
 package com.android.contacts.activities;
 
 import com.android.contacts.R;
-import com.android.contacts.activities.ContactsFrontDoor;
-import com.android.contacts.activities.ContactBrowserActivity;
-import com.android.contacts.activities.DialpadActivity;
+import com.android.contacts.calllog.CallLogFragment;
+import com.android.contacts.dialpad.DialpadFragment;
+import com.android.contacts.interactions.ImportExportInteraction;
+import com.android.contacts.list.ContactListFilter;
+import com.android.contacts.list.ContactsIntentResolver;
+import com.android.contacts.list.ContactsRequest;
+import com.android.contacts.list.DefaultContactBrowseListFragment;
+import com.android.contacts.list.DirectoryListLoader;
+import com.android.contacts.list.OnContactBrowserActionListener;
+import com.android.contacts.preference.ContactsPreferenceActivity;
 import com.android.internal.telephony.ITelephony;
 
+import android.app.ActionBar;
+import android.app.ActionBar.Tab;
+import android.app.ActionBar.TabListener;
 import android.app.Activity;
-import android.app.TabActivity;
+import android.app.Dialog;
+import android.app.Fragment;
+import android.app.FragmentManager;
+import android.app.FragmentTransaction;
 import android.content.Intent;
 import android.content.SharedPreferences;
 import android.net.Uri;
@@ -31,10 +44,14 @@
 import android.os.RemoteException;
 import android.os.ServiceManager;
 import android.provider.CallLog.Calls;
+import android.provider.ContactsContract;
+import android.provider.ContactsContract.Contacts;
+import android.provider.Settings;
 import android.provider.ContactsContract.Intents.UI;
 import android.util.Log;
-import android.view.Window;
-import android.widget.TabHost;
+import android.view.Menu;
+import android.view.MenuInflater;
+import android.view.MenuItem;
 
 /**
  * The dialer activity that has one tab with the virtual 12key
@@ -43,7 +60,7 @@
  * embedded using intents.
  * The dialer tab's title is 'phone', a more common name (see strings.xml).
  */
-public class DialtactsActivity extends TabActivity implements TabHost.OnTabChangeListener {
+public class DialtactsActivity extends Activity {
     private static final String TAG = "DialtactsActivity";
 
     private static final int TAB_INDEX_DIALER = 0;
@@ -63,9 +80,13 @@
     private static final String PREF_LAST_MANUALLY_SELECTED_TAB = "last_manually_selected_tab";
     private static final int PREF_LAST_MANUALLY_SELECTED_TAB_DEFAULT = TAB_INDEX_DIALER;
 
-    private TabHost mTabHost;
     private String mFilterText;
     private Uri mDialUri;
+    private DialpadFragment mDialpadFragment;
+    private CallLogFragment mCallLogFragment;
+    private DefaultContactBrowseListFragment mContactsFragment;
+    private DefaultContactBrowseListFragment mFavoritesFragment;
+    private ImportExportInteraction mImportExportInteraction;
 
     /**
      * The index of the tab that has last been manually selected (the user clicked on a tab).
@@ -80,18 +101,34 @@
         final Intent intent = getIntent();
         fixIntent(intent);
 
-        requestWindowFeature(Window.FEATURE_NO_TITLE);
         setContentView(R.layout.dialtacts_activity);
 
-        mTabHost = getTabHost();
-        mTabHost.setOnTabChangedListener(this);
+        final FragmentManager fragmentManager = getFragmentManager();
+        mDialpadFragment = (DialpadFragment) fragmentManager
+                .findFragmentById(R.id.dialpad_fragment);
+        mCallLogFragment = (CallLogFragment) fragmentManager
+                .findFragmentById(R.id.call_log_fragment);
+        mContactsFragment = (DefaultContactBrowseListFragment) fragmentManager
+                .findFragmentById(R.id.contacts_fragment);
+        mFavoritesFragment = (DefaultContactBrowseListFragment) fragmentManager
+                .findFragmentById(R.id.favorites_fragment);
 
-        // Setup the tabs
-        setupDialerTab();
-        setupCallLogTab();
-        setupContactsTab();
-        setupFavoritesTab();
-        setupGroupsTab();
+        // Hide all tabs (the current tab will later be reshown once a tab is selected)
+        final FragmentTransaction transaction = fragmentManager.beginTransaction();
+        transaction.hide(mDialpadFragment);
+        transaction.hide(mCallLogFragment);
+        transaction.hide(mContactsFragment);
+        transaction.hide(mFavoritesFragment);
+        transaction.commit();
+
+        // Setup the ActionBar tabs (the order matches the tab-index contants TAB_INDEX_*)
+        setupDialer();
+        setupCallLog();
+        setupContacts();
+        setupFavorites();
+        getActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
+        getActionBar().setDisplayShowTitleEnabled(false);
+        getActionBar().setDisplayShowHomeEnabled(false);
 
         // Load the last manually loaded tab
         final SharedPreferences prefs = getSharedPreferences(PREFS_DIALTACTS, MODE_PRIVATE);
@@ -110,7 +147,7 @@
     protected void onPause() {
         super.onPause();
 
-        final int currentTabIndex = mTabHost.getCurrentTab();
+        final int currentTabIndex = getActionBar().getSelectedTab().getPosition();
         final SharedPreferences.Editor editor =
                 getSharedPreferences(PREFS_DIALTACTS, MODE_PRIVATE).edit();
         if (currentTabIndex == TAB_INDEX_CONTACTS || currentTabIndex == TAB_INDEX_FAVORITES) {
@@ -132,57 +169,73 @@
         }
     }
 
-    private void setupCallLogTab() {
-        // Force the class since overriding tab entries doesn't work
-        Intent intent = new Intent("com.android.phone.action.RECENT_CALLS");
-        intent.setClass(this, CallLogActivity.class);
-
-        mTabHost.addTab(mTabHost.newTabSpec("call_log")
-                .setIndicator(getString(R.string.recentCallsIconLabel),
-                        getResources().getDrawable(R.drawable.ic_tab_recent))
-                .setContent(intent));
+    private void setupDialer() {
+        final Tab tab = getActionBar().newTab();
+        tab.setText(R.string.dialerIconLabel);
+        tab.setTabListener(new TabChangeListener(mDialpadFragment));
+        tab.setIcon(R.drawable.ic_tab_dialer);
+        getActionBar().addTab(tab);
+        mDialpadFragment.resolveIntent();
     }
 
-    private void setupDialerTab() {
-        Intent intent = new Intent("com.android.phone.action.TOUCH_DIALER");
-        intent.setClass(this, DialpadActivity.class);
-
-        mTabHost.addTab(mTabHost.newTabSpec("dialer")
-                .setIndicator(getString(R.string.dialerIconLabel),
-                        getResources().getDrawable(R.drawable.ic_tab_dialer))
-                .setContent(intent));
+    private void setupCallLog() {
+        final Tab tab = getActionBar().newTab();
+        tab.setText(R.string.recentCallsIconLabel);
+        tab.setIcon(R.drawable.ic_tab_recent);
+        tab.setTabListener(new TabChangeListener(mCallLogFragment));
+        getActionBar().addTab(tab);
     }
 
-    private void setupContactsTab() {
+    private void setupContacts() {
+        final Tab tab = getActionBar().newTab();
+        tab.setText(R.string.contactsIconLabel);
+        tab.setIcon(R.drawable.ic_tab_contacts);
+        tab.setTabListener(new TabChangeListener(mContactsFragment));
+        getActionBar().addTab(tab);
+
+        // TODO: We should not artificially create Intents and put them into the Fragment.
+        // It would be nicer to directly pass in the UI constant
         Intent intent = new Intent(UI.LIST_ALL_CONTACTS_ACTION);
         intent.setClass(this, ContactBrowserActivity.class);
 
-        mTabHost.addTab(mTabHost.newTabSpec("contacts")
-                .setIndicator(getText(R.string.contactsIconLabel),
-                        getResources().getDrawable(R.drawable.ic_tab_contacts))
-                .setContent(intent));
+        ContactsIntentResolver resolver = new ContactsIntentResolver(this);
+        ContactsRequest request = resolver.resolveIntent(intent);
+        final ContactListFilter filter = new ContactListFilter(
+                ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS);
+        mContactsFragment.setFilter(filter, false);
+        mContactsFragment.setSearchMode(request.isSearchMode());
+        mContactsFragment.setQueryString(request.getQueryString(), false);
+        mContactsFragment.setContactsRequest(request);
+        mContactsFragment.setDirectorySearchMode(request.isDirectorySearchEnabled()
+                ? DirectoryListLoader.SEARCH_MODE_DEFAULT
+                : DirectoryListLoader.SEARCH_MODE_NONE);
+        mContactsFragment.setOnContactListActionListener(mListFragmentListener);
     }
 
-    private void setupFavoritesTab() {
+    private void setupFavorites() {
+        final Tab tab = getActionBar().newTab();
+        tab.setText(R.string.contactsFavoritesLabel);
+        tab.setIcon(R.drawable.ic_tab_starred);
+        tab.setTabListener(new TabChangeListener(mFavoritesFragment));
+        getActionBar().addTab(tab);
+
+        // TODO: We should not artificially create Intents and put them into the Fragment.
+        // It would be nicer to directly pass in the UI constant
         Intent intent = new Intent(UI.LIST_STREQUENT_ACTION);
         intent.setClass(this, ContactBrowserActivity.class);
 
-        mTabHost.addTab(mTabHost.newTabSpec("favorites")
-                .setIndicator(getString(R.string.contactsFavoritesLabel),
-                        getResources().getDrawable(R.drawable.ic_tab_starred))
-                .setContent(intent));
-    }
-
-    private void setupGroupsTab() {
-        // This is a temporary intent action until the refactoring for the phone/contacts
-        // split is complete.
-        Intent intent = new Intent("com.android.phone.action.GROUPS_LIST");
-                        intent.setClass(this, GroupBrowserActivity.class);
-
-        mTabHost.addTab(mTabHost.newTabSpec("groups")
-                .setIndicator(getString(R.string.contactsGroupsLabel),
-                        getResources().getDrawable(R.drawable.ic_menu_display_all_holo_light))
-                .setContent(intent));
+        ContactsIntentResolver resolver = new ContactsIntentResolver(this);
+        ContactsRequest request = resolver.resolveIntent(intent);
+        final ContactListFilter filter = new ContactListFilter(
+                ContactListFilter.FILTER_TYPE_STARRED);
+        mFavoritesFragment.setFilter(filter, false);
+        mFavoritesFragment.setSearchMode(request.isSearchMode());
+        mFavoritesFragment.setQueryString(request.getQueryString(), false);
+        mFavoritesFragment.setContactsRequest(request);
+        mFavoritesFragment.setDirectorySearchMode(request.isDirectorySearchEnabled()
+                ? DirectoryListLoader.SEARCH_MODE_DEFAULT
+                : DirectoryListLoader.SEARCH_MODE_NONE);
+        mFavoritesFragment.setOnContactListActionListener(mListFragmentListener);
     }
 
     /**
@@ -223,13 +276,6 @@
             return;
         }
 
-        // Dismiss menu provided by any children activities
-        Activity activity = getLocalActivityManager().
-                getActivity(mTabHost.getCurrentTabTag());
-        if (activity != null) {
-            activity.closeOptionsMenu();
-        }
-
         // Tell the children activities that they should ignore any possible saved
         // state and instead reload their state from the parent's intent
         intent.putExtra(EXTRA_IGNORE_STATE, true);
@@ -246,21 +292,21 @@
             boolean favoritesAsContacts = prefs.getBoolean(PREF_FAVORITES_AS_CONTACTS,
                     PREF_FAVORITES_AS_CONTACTS_DEFAULT);
             if (favoritesAsContacts) {
-                mTabHost.setCurrentTab(TAB_INDEX_FAVORITES);
+                getActionBar().selectTab(getActionBar().getTabAt(TAB_INDEX_FAVORITES));
             } else {
-                mTabHost.setCurrentTab(TAB_INDEX_CONTACTS);
+                getActionBar().selectTab(getActionBar().getTabAt(TAB_INDEX_CONTACTS));
             }
         } else {
             // Not launched through the front door, look at the component to determine the tab
             String componentName = intent.getComponent().getClassName();
             if (getClass().getName().equals(componentName)) {
                 if (recentCallsRequest) {
-                    mTabHost.setCurrentTab(TAB_INDEX_CALL_LOG);
+                    getActionBar().selectTab(getActionBar().getTabAt(TAB_INDEX_CALL_LOG));
                 } else {
-                    mTabHost.setCurrentTab(TAB_INDEX_DIALER);
+                    getActionBar().selectTab(getActionBar().getTabAt(TAB_INDEX_DIALER));
                 }
             } else {
-                mTabHost.setCurrentTab(mLastManuallySelectedTab);
+                getActionBar().selectTab(getActionBar().getTabAt(mLastManuallySelectedTab));
             }
         }
 
@@ -371,19 +417,158 @@
         }
     }
 
-    /** {@inheritDoc} */
-    public void onTabChanged(String tabId) {
-        // Because we're using Activities as our tab children, we trigger
-        // onWindowFocusChanged() to let them know when they're active.  This may
-        // seem to duplicate the purpose of onResume(), but it's needed because
-        // onResume() can't reliably check if a keyguard is active.
-        Activity activity = getLocalActivityManager().getActivity(tabId);
-        if (activity != null) {
-            activity.onWindowFocusChanged(true);
+    @Override
+    protected void onPostCreate(Bundle savedInstanceState) {
+        super.onPostCreate(savedInstanceState);
+
+        // Pass this lifecycle event down to the fragment
+        mDialpadFragment.onPostCreate();
+    }
+
+    /**
+     * Tab change listener that is instantiated once for each tab. Handles showing/hiding tabs
+     * and remembers manual tab selections
+     */
+    private class TabChangeListener implements TabListener {
+        private final Fragment mFragment;
+
+        public TabChangeListener(Fragment fragment) {
+            mFragment = fragment;
         }
 
-        // Remember this tab index. This function is also called, if the tab is set automatically
-        // in which case the setter (setCurrentTab) has to set this to its old value afterwards
-        mLastManuallySelectedTab = mTabHost.getCurrentTab();
+        @Override
+        public void onTabUnselected(Tab tab, FragmentTransaction ft) {
+            ft.hide(mFragment);
+        }
+
+        @Override
+        public void onTabSelected(Tab tab, FragmentTransaction ft) {
+            ft.show(mFragment);
+
+            // Remember this tab index. This function is also called, if the tab is set
+            // automatically in which case the setter (setCurrentTab) has to set this to its old
+            // value afterwards
+            mLastManuallySelectedTab = tab.getPosition();
+        }
+
+        @Override
+        public void onTabReselected(Tab tab, FragmentTransaction ft) {
+        }
+    }
+
+    private OnContactBrowserActionListener mListFragmentListener =
+            new OnContactBrowserActionListener() {
+        @Override
+        public void onViewContactAction(Uri contactLookupUri) {
+            startActivity(new Intent(Intent.ACTION_VIEW, contactLookupUri));
+        }
+
+        @Override
+        public void onSmsContactAction(Uri contactUri) {
+        }
+
+        @Override
+        public void onSelectionChange() {
+        }
+
+        @Override
+        public void onRemoveFromFavoritesAction(Uri contactUri) {
+        }
+
+        @Override
+        public void onInvalidSelection() {
+        }
+
+        @Override
+        public void onFinishAction() {
+        }
+
+        @Override
+        public void onEditContactAction(Uri contactLookupUri) {
+        }
+
+        @Override
+        public void onDeleteContactAction(Uri contactUri) {
+        }
+
+        @Override
+        public void onCreateNewContactAction() {
+        }
+
+        @Override
+        public void onCallContactAction(Uri contactUri) {
+        }
+
+        @Override
+        public void onAddToFavoritesAction(Uri contactUri) {
+        }
+    };
+
+    @Override
+    public boolean onCreateOptionsMenu(Menu menu) {
+        // For now, create the menu in here. It would be nice to do this in the Fragment,
+        // but that Fragment is re-used in other views.
+        final ActionBar actionBar = getActionBar();
+        if (actionBar == null) return false;
+        final Tab tab = actionBar.getSelectedTab();
+        if (tab == null) return false;
+        final int tabIndex = tab.getPosition();
+        if (tabIndex != TAB_INDEX_CONTACTS && tabIndex != TAB_INDEX_FAVORITES) return false;
+
+        MenuInflater inflater = getMenuInflater();
+        inflater.inflate(R.menu.list, menu);
+        return true;
+    }
+
+    @Override
+    public boolean onOptionsItemSelected(MenuItem item) {
+        // This is currently a copy of the equivalent code of ContactBrowserActivity (with the
+        // exception of menu_add, because we do not select items in the list).
+        // Should be consolidated
+        switch (item.getItemId()) {
+        case R.id.menu_settings: {
+            final Intent intent = new Intent(this, ContactsPreferenceActivity.class);
+            startActivity(intent);
+            return true;
+        }
+        case R.id.menu_search: {
+            onSearchRequested();
+            return true;
+        }
+        case R.id.menu_add: {
+            final Intent intent = new Intent(Intent.ACTION_INSERT, Contacts.CONTENT_URI);
+            startActivity(intent);
+            return true;
+        }
+        case R.id.menu_import_export: {
+            getImportExportInteraction().startInteraction();
+            return true;
+        }
+        case R.id.menu_accounts: {
+            final Intent intent = new Intent(Settings.ACTION_SYNC_SETTINGS);
+            intent.putExtra(Settings.EXTRA_AUTHORITIES, new String[] {
+                ContactsContract.AUTHORITY
+            });
+            intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
+            startActivity(intent);
+            return true;
+        }
+        default:
+            return super.onOptionsItemSelected(item);
+        }
+    }
+
+    @Override
+    protected Dialog onCreateDialog(int id, Bundle bundle) {
+        Dialog dialog = getImportExportInteraction().onCreateDialog(id, bundle);
+        if (dialog != null) return dialog;
+        return super.onCreateDialog(id, bundle);
+    }
+
+    private ImportExportInteraction getImportExportInteraction() {
+        if (mImportExportInteraction == null) {
+            mImportExportInteraction = new ImportExportInteraction(this);
+        }
+        return mImportExportInteraction;
     }
 }
diff --git a/src/com/android/contacts/dialpad/DialpadFragment.java b/src/com/android/contacts/dialpad/DialpadFragment.java
index fc5fcd9..58ffb9e 100644
--- a/src/com/android/contacts/dialpad/DialpadFragment.java
+++ b/src/com/android/contacts/dialpad/DialpadFragment.java
@@ -516,17 +516,14 @@
                 .setIcon(R.drawable.ic_menu_wait);
     }
 
-    /** @return true if an options menu should be shown in our containing activity. */
-    public boolean allowOptionsMenu() {
-        // We never show a menu if the "choose dialpad" UI is up.
-        // Otherwise the menu is allowed (see onPrepareOptionsMenu() below.)
-        return (!dialpadChooserVisible());
-    }
-
     @Override
     public void onPrepareOptionsMenu(Menu menu) {
-        // Note that we won't show a menu at all if the "choose dialpad" UI is up.
-        // (See allowOptionsMenu() above, along with DialogActivity.onPrepareOptionsMenu().)
+        // If we have not been inflated yet, there is no menu
+        if (mDialpadChooser == null) return;
+
+        // We never show a menu if the "choose dialpad" UI is up.
+        // Otherwise the menu is allowed (see onPrepareOptionsMenu() below.)
+        if (!dialpadChooserVisible()) return;
 
         if (isDigitsEmpty()) {
             mAddToContactMenuItem.setVisible(false);