diff --git a/res/layout/layout_tests.xml b/res/layout/layout_tests.xml
index 891afa2..455bb2d 100644
--- a/res/layout/layout_tests.xml
+++ b/res/layout/layout_tests.xml
@@ -26,11 +26,6 @@
         android:layout_width="match_parent"
         android:orientation="vertical">
         <Button
-            android:text="@string/test_actionbar"
-            android:layout_height="wrap_content"
-            android:layout_width="wrap_content"
-            android:onClick="actionbarTest"/>
-        <Button
             android:text="@string/test_application"
             android:layout_height="wrap_content"
             android:layout_width="wrap_content"
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 739ae57..1a33a03 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -18,12 +18,10 @@
 <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
 
     <!-- Layout tests strings -->
-    <string name="test_labelspinner" translate="false">Test Label Spinner Layout</string>
     <string name="mock_content_provider">Mock Content Provider</string>
     <string name="conversation_content_provider">Conversation Content Provider</string>
     <string name="account_cache_provider">Account Cache Provider</string>
     <string name="dummy_gmail_provider">Dummy Gmail Provider</string>
-    <string name="test_actionbar" translate="false">Test Actionbar Layout</string>
     <string name="test_application" translate="false">Test Application</string>
 
     <string name="app_name">Unified Email</string>
diff --git a/src/com/android/mail/UnifiedEmail.java b/src/com/android/mail/UnifiedEmail.java
index e7cbd86..821eb18 100644
--- a/src/com/android/mail/UnifiedEmail.java
+++ b/src/com/android/mail/UnifiedEmail.java
@@ -17,8 +17,6 @@
 
 package com.android.mail;
 
-import com.android.mail.compose.ComposeActivity;
-import com.android.mail.ui.ActionbarActivity;
 import com.android.mail.ui.MailActivity;
 
 import android.app.Activity;
@@ -40,10 +38,6 @@
         setContentView(R.layout.layout_tests);
     }
 
-    public void actionbarTest(View v){
-        startActivityWithClass(ActionbarActivity.class);
-    }
-
     /**
      * Try out the real mail activity now.
      * @param v
diff --git a/src/com/android/mail/browse/ConversationListActivity.java b/src/com/android/mail/browse/ConversationListActivity.java
deleted file mode 100644
index 596b853..0000000
--- a/src/com/android/mail/browse/ConversationListActivity.java
+++ /dev/null
@@ -1,312 +0,0 @@
-/*
- * Copyright (C) 2012 Google Inc.
- * Licensed to 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.mail.browse;
-
-import android.app.Activity;
-import android.app.LoaderManager;
-import android.content.ContentResolver;
-import android.content.Context;
-import android.content.CursorLoader;
-import android.content.Loader;
-import android.database.Cursor;
-import android.net.Uri;
-import android.os.Bundle;
-import android.view.LayoutInflater;
-import android.view.Menu;
-import android.view.MenuInflater;
-import android.view.MenuItem;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.AdapterView;
-import android.widget.SimpleCursorAdapter;
-import android.widget.Spinner;
-import android.widget.SpinnerAdapter;
-import android.widget.TextView;
-import android.widget.AdapterView.OnItemClickListener;
-import android.widget.AdapterView.OnItemSelectedListener;
-
-import com.android.mail.R;
-import com.android.mail.browse.ConversationCursor.ConversationListener;
-import com.android.mail.compose.ComposeActivity;
-import com.android.mail.providers.Account;
-import com.android.mail.providers.AccountCacheProvider;
-import com.android.mail.providers.Conversation;
-import com.android.mail.providers.Folder;
-import com.android.mail.providers.UIProvider;
-import com.android.mail.providers.UIProvider.ConversationColumns;
-import com.android.mail.ui.ActionCompleteListener;
-import com.android.mail.ui.AnimatedAdapter;
-import com.android.mail.ui.AnimatedListView;
-import com.android.mail.ui.ConversationSelectionSet;
-import com.android.mail.ui.ConversationSetObserver;
-import com.android.mail.ui.RestrictedActivity;
-import com.android.mail.ui.UndoBarView;
-
-import java.util.ArrayList;
-
-public class ConversationListActivity extends Activity implements OnItemSelectedListener,
-        OnItemClickListener, ConversationSetObserver, ConversationListener, ActionCompleteListener,
-        LoaderManager.LoaderCallbacks<Cursor>, RestrictedActivity {
-
-    private AnimatedListView mListView;
-    private AnimatedAdapter mListAdapter;
-    private ConversationCursor mConversationListCursor;
-    private Spinner mAccountsSpinner;
-    private AccountsSpinnerAdapter mAccountsAdapter;
-    private ContentResolver mResolver;
-    private Account mSelectedAccount;
-    /** The selected conversations. */
-    protected ConversationSelectionSet mBatchConversations = new ConversationSelectionSet();
-    private SelectedConversationsActionMenu mSelectedConversationsActionMenu;
-    private UndoBarView mUndoView;
-    private Folder mSelectedFolder;
-
-    @Override
-    public void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        setContentView(R.layout.conversation_list_activity);
-        mListView = (AnimatedListView) findViewById(R.id.browse_list);
-        mListView.setOnItemClickListener(this);
-        mAccountsSpinner = (Spinner) findViewById(R.id.accounts_spinner);
-        mResolver = getContentResolver();
-        // TODO: determine if we need to create a fake cursor that contains the account list from
-        // last time that the application was run.  If getting the list of accounts take a long
-        // time, this would prevent an empty spinner from being shown.
-        mAccountsAdapter = new AccountsSpinnerAdapter(this, null);
-        mAccountsSpinner.setAdapter(mAccountsAdapter);
-        mAccountsSpinner.setOnItemSelectedListener(this);
-        mBatchConversations.addObserver(this);
-    }
-    
-    @Override
-    public void onResume() {
-        super.onResume();
-        // Prepare the loader.  Either re-connect with an existing one,
-        // or start a new one.
-        getLoaderManager().initLoader(0, null, this);
-    }
-
-    @Override
-    public boolean onCreateOptionsMenu(Menu menu) {
-        super.onCreateOptionsMenu(menu);
-        MenuInflater inflater = getMenuInflater();
-        inflater.inflate(R.menu.conversation_list_menu, menu);
-        return true;
-    }
-
-    @Override
-    public boolean onOptionsItemSelected(MenuItem item) {
-        boolean handled = true;
-        int id = item.getItemId();
-        switch (id) {
-            case R.id.compose:
-                ComposeActivity.compose(this, mSelectedAccount);
-                break;
-            case R.id.show_all_folders:
-                showAllFolders();
-                break;
-            default:
-                handled = false;
-                break;
-        }
-        return handled;
-    }
-
-    private void showAllFolders() {
-        FoldersListActivity.launch(this, mSelectedAccount);
-    }
-
-    @Override
-    public Loader<Cursor> onCreateLoader(int id, Bundle args) {
-        // Currently this activity only creates a single loader (Account List)
-        return new CursorLoader(this, AccountCacheProvider.getAccountsUri(),
-                UIProvider.ACCOUNTS_PROJECTION, null, null, null);
-    }
-
-    @Override
-    public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
-        // Set the new data in the adapter.
-        mAccountsAdapter.changeCursor(data);
-    }
-
-    @Override
-    public void onLoaderReset(Loader<Cursor> loader) {
-        // Clear the data in the adapter.
-        mAccountsAdapter.changeCursor(null);
-    }
-
-    class AccountsSpinnerAdapter extends SimpleCursorAdapter implements SpinnerAdapter {
-
-        private LayoutInflater mLayoutInflater;
-
-        public AccountsSpinnerAdapter(Context context, Cursor cursor) {
-            super(context, android.R.layout.simple_dropdown_item_1line, cursor,
-                    UIProvider.ACCOUNTS_PROJECTION, null, 0);
-            mLayoutInflater = LayoutInflater.from(context);
-        }
-
-        @Override
-        public View getDropDownView(int position, View convertView, ViewGroup parent) {
-            return getView(position, convertView, parent);
-        }
-
-        @Override
-        public View newView(Context context, Cursor cursor, ViewGroup parent) {
-            return mLayoutInflater.inflate(android.R.layout.simple_dropdown_item_1line, null);
-        }
-
-        @Override
-        public void bindView(View view, Context context, Cursor cursor) {
-            int accountNameCol = cursor.getColumnIndex(UIProvider.AccountColumns.NAME);
-            ((TextView) view.findViewById(android.R.id.text1)).setText(cursor
-                    .getString(accountNameCol));
-        }
-    }
-
-    @Override
-    public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
-        // Get an account and a folder list
-        Uri foldersUri = null;
-        Cursor cursor = mAccountsAdapter.getCursor();
-        if (cursor != null && cursor.moveToPosition(position)) {
-            int uriCol = cursor.getColumnIndex(UIProvider.AccountColumns.FOLDER_LIST_URI);
-            foldersUri = Uri.parse(cursor.getString(uriCol));
-            mSelectedAccount =  new Account(cursor);
-            cursor.close();
-        }
-        Uri conversationListUri = null;
-        if (foldersUri != null) {
-            cursor = mResolver.query(foldersUri, UIProvider.FOLDERS_PROJECTION, null, null, null);
-            if (cursor != null) {
-                int uriCol = cursor.getColumnIndex(UIProvider.FolderColumns.CONVERSATION_LIST_URI);
-                cursor.moveToFirst();
-                mSelectedFolder = new Folder(cursor);
-                conversationListUri = Uri.parse(cursor.getString(uriCol));
-                cursor.close();
-            }
-        }
-        // We need to have a conversation list here...
-        if (conversationListUri == null) {
-            throw new IllegalStateException("No conversation list for this account");
-        }
-        // Create the cursor for the list using the update cache
-        // Make this asynchronous
-        if (mConversationListCursor != null) {
-            mConversationListCursor.close();
-        }
-        mConversationListCursor =
-                ConversationCursor.create(this, UIProvider.ConversationColumns.URI,
-                        conversationListUri, UIProvider.CONVERSATION_PROJECTION, null, null, null);
-        mListAdapter = new AnimatedAdapter(this, position, mConversationListCursor,
-                mBatchConversations, mSelectedAccount);
-        mListView.setAdapter(mListAdapter);
-        mConversationListCursor.addListener(this);
-    }
-
-    @Override
-    public void onNothingSelected(AdapterView<?> parent) {
-    }
-
-    @Override
-    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
-        Conversation conv = ((ConversationItemView) view).getConversation();
-        ConversationViewActivity.viewConversation(this, conv, mSelectedAccount);
-        // Quick and dirty flag change
-        if (!conv.read) {
-            conv.read = true;
-            conv.updateBoolean(this, ConversationColumns.READ, true);
-            // For now, update the display
-            mListAdapter.notifyDataSetChanged();
-        }
-    }
-
-    @Override
-    public void onSetEmpty() {
-        mSelectedConversationsActionMenu = null;
-    }
-
-    @Override
-    public void onSetPopulated(ConversationSelectionSet set) {
-        mSelectedConversationsActionMenu = new SelectedConversationsActionMenu(this,
-                mBatchConversations, mListAdapter, this, mSelectedAccount, mSelectedFolder);
-        mSelectedConversationsActionMenu.activate();
-    }
-
-    @Override
-    public void onSetChanged(ConversationSelectionSet set) {
-        // Do nothing, we don't care about changes to the selection set.
-    }
-
-    // ConversationListener implementation
-    // Underlying provider updates, etc.
-
-    /**
-     * Called when there is new data at the underlying provider
-     * refresh() here causes the new data to be retrieved asynchronously
-     * NOTE: The UI needn't take any action immediately (i.e. it might wait until a more
-     * convenient time to get the update from the provider)
-     */
-    @Override
-    public void onRefreshRequired() {
-        // Refresh the query in the background
-        mConversationListCursor.refresh();
-    }
-
-    /**
-     * Complete the cursor refresh process by syncing to the underlying cursor and redrawing
-     */
-    private void finishRefresh() {
-        // Swap cursors
-        mConversationListCursor.sync();
-        // Redraw with new data
-        mListAdapter.notifyDataSetChanged();
-    }
-
-    /**
-     * Called when new data from the underlying provider is ready for use
-     * swapCursors() causes the cursor to reflect the refreshed data
-     * notifyDataSetChanged() causes the list to redraw
-     * NOTE: The UI needn't take any action immediately if it's otherwise engaged (animating, for
-     * example)
-     */
-    @Override
-    public void onRefreshReady() {
-        ArrayList<Integer> deletedRows = mConversationListCursor.getRefreshDeletions();
-        // If we have any deletions from the server, animate them away
-        if (!deletedRows.isEmpty()) {
-            mListAdapter.delete(deletedRows);
-        } else {
-            finishRefresh();
-        }
-    }
-
-    @Override
-    public void onActionComplete() {
-        showUndo();
-    }
-
-    private void showUndo() {
-        mUndoView = (UndoBarView)findViewById(R.id.undo_view);
-        mUndoView.show(true, this, "undo", mSelectedAccount, mListAdapter);
-    }
-
-    @Override
-    public Context getActivityContext() {
-        return this;
-    }
-}
diff --git a/src/com/android/mail/browse/ConversationViewActivity.java b/src/com/android/mail/browse/ConversationViewActivity.java
deleted file mode 100644
index 8458481..0000000
--- a/src/com/android/mail/browse/ConversationViewActivity.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- * Copyright (C) 2012 Google Inc.
- * Licensed to 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.mail.browse;
-
-import android.app.Activity;
-import android.content.ContentResolver;
-import android.content.Context;
-import android.content.Intent;
-import android.database.Cursor;
-import android.net.Uri;
-import android.os.Bundle;
-import android.view.View;
-import android.widget.ListView;
-import android.widget.SimpleCursorAdapter;
-import android.widget.TextView;
-
-import com.android.mail.FormattedDateBuilder;
-import com.android.mail.R;
-import com.android.mail.providers.Account;
-import com.android.mail.providers.Conversation;
-import com.android.mail.providers.UIProvider;
-import com.android.mail.utils.Utils;
-
-public class ConversationViewActivity extends Activity {
-
-    private static final String EXTRA_CONVERSATION = "conversation";
-
-    private Conversation mConversation;
-    private ContentResolver mResolver;
-    private Cursor mMessageCursor;
-    private TextView mSubject;
-    private ListView mMessageList;
-    private FormattedDateBuilder mDateBuilder;
-    private Account mAccount;
-
-    public static void viewConversation(Context context, Conversation conv, Account account) {
-        Intent intent = new Intent(context, ConversationViewActivity.class);
-        intent.putExtra(EXTRA_CONVERSATION, conv);
-        intent.putExtra(Utils.EXTRA_ACCOUNT, account);
-        context.startActivity(intent);
-    }
-
-    @Override
-    public void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        Intent intent = getIntent();
-        mConversation = intent.getParcelableExtra(EXTRA_CONVERSATION);
-        mResolver = getContentResolver();
-        mAccount = (Account)intent.getParcelableExtra(Utils.EXTRA_ACCOUNT);
-        setContentView(R.layout.conversation_view);
-    }
-
-    @Override
-    public void onPostCreate(Bundle savedInstanceState) {
-        super.onPostCreate(savedInstanceState);
-        mSubject = (TextView) findViewById(R.id.subject);
-        mMessageList = (ListView) findViewById(R.id.message_list);
-        mDateBuilder = new FormattedDateBuilder(this);
-        mSubject.setText(mConversation.subject);
-        mMessageCursor = mResolver.query(Uri.parse(mConversation.messageListUri),
-                UIProvider.MESSAGE_PROJECTION, null, null, null);
-        mMessageList.setAdapter(new MessageListAdapter(this, mMessageCursor));
-    }
-
-    class MessageListAdapter extends SimpleCursorAdapter {
-        public MessageListAdapter(Context context, Cursor cursor) {
-            super(context, R.layout.message, cursor,
-                    UIProvider.MESSAGE_PROJECTION, new int[0], 0);
-        }
-
-        @Override
-        public void bindView(View view, Context context, Cursor cursor) {
-            super.bindView(view, context, cursor);
-            MessageHeaderView header = (MessageHeaderView) view.findViewById(R.id.message_header);
-            header.initialize(mDateBuilder, mAccount, true, true, false);
-            header.bind(cursor);
-            MessageWebView webView = (MessageWebView) view.findViewById(R.id.body);
-            webView.loadData(cursor.getString(UIProvider.MESSAGE_BODY_HTML_COLUMN), "text/html",
-                    null);
-        }
-    }
-}
diff --git a/src/com/android/mail/browse/FoldersListActivity.java b/src/com/android/mail/browse/FoldersListActivity.java
deleted file mode 100644
index 33909ff..0000000
--- a/src/com/android/mail/browse/FoldersListActivity.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/**
- * Copyright (c) 2012, Google Inc.
- *
- * 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.mail.browse;
-
-import com.android.mail.R;
-
-import android.app.Activity;
-import android.content.Context;
-import android.content.Intent;
-import android.database.Cursor;
-import android.net.Uri;
-import android.os.Bundle;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.ListView;
-import android.widget.SimpleCursorAdapter;
-
-import com.android.mail.providers.Account;
-import com.android.mail.providers.Folder;
-import com.android.mail.providers.Message;
-import com.android.mail.providers.UIProvider;
-import com.android.mail.ui.FolderItemView;
-import com.android.mail.ui.FolderItemView.DropHandler;
-import com.android.mail.utils.Utils;
-
-public class FoldersListActivity extends Activity {
-    private ListView mListView;
-    private Account mAccount;
-    private Cursor mFoldersCursor;
-
-    public static void launch(Context launcher, Account account) {
-        Intent intent = new Intent(launcher, FoldersListActivity.class);
-        intent.putExtra(Utils.EXTRA_ACCOUNT, account);
-        launcher.startActivity(intent);
-    }
-
-    @Override
-    public void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        setContentView(R.layout.folders_activity);
-        mListView = (ListView) findViewById(R.id.folders_list);
-        mAccount = (Account) getIntent().getParcelableExtra(Utils.EXTRA_ACCOUNT);
-        mFoldersCursor = getContentResolver().query(Uri.parse(mAccount.folderListUri),
-                UIProvider.FOLDERS_PROJECTION, null, null, null);
-        mListView.setAdapter(new FolderListAdapter(this, R.layout.folder_item, mFoldersCursor,
-                null, null));
-    }
-
-    private class FolderListAdapter extends SimpleCursorAdapter {
-
-        public FolderListAdapter(Context context, int layout, Cursor c, String[] from, int[] to) {
-            super(context, layout, c, new String[0], new int[0], 0);
-        }
-
-        @Override
-        public View getView(int position, View convertView, ViewGroup parent) {
-            FolderItemView folderItemView;
-            if (convertView != null) {
-                folderItemView = (FolderItemView) convertView;
-            } else {
-                folderItemView = (FolderItemView) LayoutInflater.from(FoldersListActivity.this)
-                        .inflate(R.layout.folder_item, null);
-            }
-            mFoldersCursor.moveToPosition(position);
-            folderItemView.bind(new Folder(mFoldersCursor), null);
-            return folderItemView;
-        }
-    }
-}
diff --git a/src/com/android/mail/ui/ActionbarActivity.java b/src/com/android/mail/ui/ActionbarActivity.java
deleted file mode 100644
index 5912883..0000000
--- a/src/com/android/mail/ui/ActionbarActivity.java
+++ /dev/null
@@ -1,171 +0,0 @@
-/*******************************************************************************
- *      Copyright (C) 2012 Google Inc.
- *      Licensed to 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.mail.ui;
-
-import com.android.mail.ConversationListContext;
-import com.android.mail.R;
-import com.android.mail.providers.Account;
-import com.android.mail.ui.MailActionBar.Callback;
-
-import android.app.ActionBar;
-import android.app.Activity;
-import android.content.Context;
-import android.os.Bundle;
-import android.view.LayoutInflater;
-import android.view.Menu;
-import android.view.View;
-import android.widget.Toast;
-
-/**
- * A dummy activity to make an actionbar and a few buttons to test some of the interactions.
- * This is pure UI, there is no functionality here.
- */
-public class ActionbarActivity extends Activity
-        implements View.OnCreateContextMenuListener,RestrictedActivity, Callback {
-    private MailActionBar mActionBar;
-    private Context mContext;
-    private int mActionBarMode;
-    private ViewMode mViewMode;
-
-    /**
-     *
-     */
-    public ActionbarActivity() {
-        super();
-        mActionBarMode = ViewMode.UNKNOWN;
-    }
-
-    @Override
-    public boolean onPrepareOptionsMenu(Menu menu){
-        return mActionBar.prepareOptionsMenu(menu) || super.onPrepareOptionsMenu(menu);
-    }
-
-    @Override
-    public boolean onCreateOptionsMenu(Menu menu){
-        return mActionBar.createOptionsMenu(menu) || super.onCreateOptionsMenu(menu);
-    }
-
-    @Override
-    public void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        ActionBar bar = this.getActionBar();
-        mContext = getApplicationContext();
-        mViewMode = new ViewMode(mContext);
-        mViewMode.enterConversationListMode();
-
-        if (mActionBar == null){
-            mActionBar = (MailActionBar) LayoutInflater.from(mContext).inflate(
-                    R.layout.actionbar_view, null);
-        }
-        mActionBar.initialize(this, this, mViewMode, bar);
-        setContentView(R.layout.actionbar_tests);
-    }
-
-    /**
-     * Change the action bar mode, and redraw the actionbar.
-     * @param mode
-     */
-    private void changeMode(int mode){
-        mActionBar.setMode(mode);
-        // Tell the framework to redraw the Action Bar
-        invalidateOptionsMenu();
-    }
-
-    // Methods that will be called through the android:onclick attribute in layout XML.
-    public void testSetBackButton(View v){
-        mActionBar.setBackButton();
-    }
-
-    public void testRemoveBackButton(View v){
-        mActionBar.removeBackButton();
-    }
-
-    public void testSearchConversationMode(View v){
-        changeMode(ViewMode.SEARCH_RESULTS);
-    }
-
-    public void testNormalMode(View v){
-        changeMode(ViewMode.UNKNOWN);
-    }
-
-    public void testSearchResultMode(View v){
-        changeMode(ViewMode.SEARCH_RESULTS);
-    }
-
-    public void testLabelMode(View v){
-        changeMode(ViewMode.FOLDER_LIST);
-    }
-
-    @Override
-    public void enterSearchMode() {
-        Toast.makeText(this, "Entering Search Mode", Toast.LENGTH_SHORT).show();
-    }
-
-    @Override
-    public void exitSearchMode() {
-        // TODO(viki): Auto-generated method stub
-    }
-
-    @Override
-    public void reloadSearch(String string) {
-        // TODO(viki): Auto-generated method stub
-    }
-
-    @Override
-    public boolean navigateToAccount(Account account) {
-        // TODO(viki): Auto-generated method stub
-        return false;
-    }
-
-    @Override
-    public void navigateToFolder(String folderCanonicalName) {
-        // TODO(viki): Auto-generated method stub
-    }
-
-    @Override
-    public void showFolderList() {
-        // TODO(viki): Auto-generated method stub
-    }
-
-    @Override
-    public String getCurrentAccount() {
-        // TODO(viki): Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public ConversationListContext getCurrentListContext() {
-        // TODO(viki): Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public void startActionBarStatusCursorLoader(String account) {
-        // TODO(viki): Auto-generated method stub
-    }
-
-    @Override
-    public void stopActionBarStatusCursorLoader(String account) {
-        // TODO(viki): Auto-generated method stub
-    }
-
-    @Override
-    public Context getActivityContext() {
-        return this;
-    }
-}
