Move ComboView to its own activity

 Bugs: 5009130 3368824

Change-Id: I559bb88a1e759172ef9a7d2a8b41ea4c7e523ec6
diff --git a/src/com/android/browser/BaseUi.java b/src/com/android/browser/BaseUi.java
index 858e13e..d1445d8 100644
--- a/src/com/android/browser/BaseUi.java
+++ b/src/com/android/browser/BaseUi.java
@@ -17,6 +17,7 @@
 package com.android.browser;
 
 import android.app.Activity;
+import android.content.Intent;
 import android.content.res.Configuration;
 import android.content.res.Resources;
 import android.graphics.Bitmap;
@@ -93,8 +94,6 @@
     private WebChromeClient.CustomViewCallback mCustomViewCallback;
     private int mOriginalOrientation;
 
-    private CombinedBookmarkHistoryView mComboView;
-
     private LinearLayout mErrorConsoleContainer = null;
 
     private Toast mStopToast;
@@ -183,12 +182,6 @@
 
     @Override
     public boolean onBackKey() {
-        if (mComboView != null) {
-            if (!mComboView.onBackPressed()) {
-                mUiController.removeComboView();
-            }
-            return true;
-        }
         if (mCustomView != null) {
             mUiController.hideCustomView();
             return true;
@@ -497,45 +490,16 @@
 
     @Override
     public void showComboView(ComboViews startingView, Bundle extras) {
-        if (mComboView != null) {
-            return;
+        Intent intent = new Intent(mActivity, ComboViewActivity.class);
+        intent.putExtra(ComboViewActivity.EXTRA_INITIAL_VIEW, startingView.name());
+        intent.putExtra(ComboViewActivity.EXTRA_COMBO_ARGS, extras);
+        Tab t = getActiveTab();
+        if (t != null) {
+            intent.putExtra(ComboViewActivity.EXTRA_CURRENT_URL, t.getUrl());
         }
-        mComboView = new CombinedBookmarkHistoryView(mActivity,
-                mUiController,
-                startingView,
-                extras);
-        FrameLayout wrapper =
-            (FrameLayout) mContentView.findViewById(R.id.webview_wrapper);
-        wrapper.setVisibility(View.GONE);
-        mNavigationBar.stopEditingUrl();
-        dismissIME();
-        hideTitleBar();
-        if (mActiveTab != null) {
-            mActiveTab.putInBackground();
-        }
-        mContentView.addView(mComboView, COVER_SCREEN_PARAMS);
-    }
-
-    public boolean isComboViewShowing() {
-        return (mComboView != null);
-    }
-
-    /**
-     * dismiss the ComboPage
-     */
-    @Override
-    public void hideComboView() {
-        if (mComboView != null) {
-            mContentView.removeView(mComboView);
-            FrameLayout wrapper =
-                (FrameLayout) mContentView.findViewById(R.id.webview_wrapper);
-            wrapper.setVisibility(View.VISIBLE);
-            mComboView = null;
-        }
-        if (mActiveTab != null) {
-            mActiveTab.putInForeground();
-        }
-        mActivity.invalidateOptionsMenu();
+        intent.putExtra(ComboViewActivity.EXTRA_BOOKMARK_PAGE,
+                mUiController.createBookmarkCurrentPageIntent(false));
+        mActivity.startActivityForResult(intent, Controller.COMBO_VIEW);
     }
 
     @Override
@@ -594,8 +558,7 @@
 
     @Override
     public boolean showsWeb() {
-        return mCustomView == null
-            && mComboView == null;
+        return mCustomView == null;
     }
 
     @Override
diff --git a/src/com/android/browser/BookmarkUtils.java b/src/com/android/browser/BookmarkUtils.java
index 23765f4..2e96613 100644
--- a/src/com/android/browser/BookmarkUtils.java
+++ b/src/com/android/browser/BookmarkUtils.java
@@ -22,7 +22,6 @@
 import android.content.Context;
 import android.content.DialogInterface;
 import android.content.Intent;
-import android.content.SharedPreferences;
 import android.content.res.Resources;
 import android.graphics.Bitmap;
 import android.graphics.Canvas;
@@ -38,7 +37,6 @@
 import android.graphics.drawable.PaintDrawable;
 import android.net.Uri;
 import android.os.Message;
-import android.preference.PreferenceManager;
 import android.provider.Browser;
 import android.provider.BrowserContract;
 
diff --git a/src/com/android/browser/BrowserActivity.java b/src/com/android/browser/BrowserActivity.java
index b6d269d..b2a83e1 100644
--- a/src/com/android/browser/BrowserActivity.java
+++ b/src/com/android/browser/BrowserActivity.java
@@ -16,15 +16,10 @@
 
 package com.android.browser;
 
-import com.google.common.annotations.VisibleForTesting;
-
 import android.app.Activity;
 import android.content.Context;
 import android.content.Intent;
 import android.content.res.Configuration;
-import android.graphics.Bitmap;
-import android.graphics.BitmapFactory;
-import android.graphics.PixelFormat;
 import android.os.Bundle;
 import android.util.Log;
 import android.view.ActionMode;
@@ -38,6 +33,8 @@
 import android.view.WindowManager;
 import android.view.accessibility.AccessibilityManager;
 
+import com.google.common.annotations.VisibleForTesting;
+
 public class BrowserActivity extends Activity {
 
     public static final String ACTION_SHOW_BOOKMARKS = "show_bookmarks";
diff --git a/src/com/android/browser/BrowserBookmarksPage.java b/src/com/android/browser/BrowserBookmarksPage.java
index b6a50da..241eb1d 100644
--- a/src/com/android/browser/BrowserBookmarksPage.java
+++ b/src/com/android/browser/BrowserBookmarksPage.java
@@ -26,8 +26,6 @@
 import android.content.CursorLoader;
 import android.content.Intent;
 import android.content.Loader;
-import android.content.SharedPreferences;
-import android.content.SharedPreferences.Editor;
 import android.content.res.Configuration;
 import android.content.res.Resources;
 import android.database.Cursor;
@@ -36,7 +34,6 @@
 import android.net.Uri;
 import android.os.AsyncTask;
 import android.os.Bundle;
-import android.preference.PreferenceManager;
 import android.provider.BrowserContract;
 import android.provider.BrowserContract.Accounts;
 import android.provider.BrowserContract.ChromeSyncColumns;
@@ -53,7 +50,6 @@
 import android.widget.ExpandableListView.OnChildClickListener;
 import android.widget.ImageView;
 import android.widget.LinearLayout;
-import android.widget.PopupMenu.OnMenuItemClickListener;
 import android.widget.Toast;
 
 import com.android.browser.BookmarkDragHandler.BookmarkDragController;
@@ -67,7 +63,7 @@
     // Return true if handled
     boolean onBookmarkSelected(Cursor c, boolean isFolder);
     // Return true if handled
-    boolean onOpenInNewWindow(Cursor c);
+    boolean onOpenInNewWindow(String... urls);
 }
 
 /**
@@ -75,7 +71,7 @@
  */
 public class BrowserBookmarksPage extends Fragment implements View.OnCreateContextMenuListener,
         LoaderManager.LoaderCallbacks<Cursor>, BreadCrumbView.Controller,
-        OnMenuItemClickListener, OnChildClickListener {
+        OnChildClickListener {
 
     public static class ExtraDragState {
         public int childPosition;
@@ -94,7 +90,6 @@
 
     public static final int VIEW_THUMBNAILS = 1;
     public static final int VIEW_LIST = 2;
-    static final String PREF_SELECTED_VIEW = "bookmarks_view";
 
     BookmarksPageCallbacks mCallbacks;
     View mRoot;
@@ -102,7 +97,6 @@
     boolean mDisableNewWindow;
     boolean mEnableContextMenu = true;
     View mEmptyView;
-    int mCurrentView;
     View mHeader;
     HashMap<Integer, BrowserBookmarksAdapter> mBookmarkAdapters = new HashMap<Integer, BrowserBookmarksAdapter>();
     BookmarkDragHandler mDragHandler;
@@ -142,7 +136,7 @@
                 args.putString(ACCOUNT_NAME, accountName);
                 args.putString(ACCOUNT_TYPE, accountType);
                 BrowserBookmarksAdapter adapter = new BrowserBookmarksAdapter(
-                        getActivity(), mCurrentView);
+                        getActivity(), VIEW_THUMBNAILS);
                 mBookmarkAdapters.put(id, adapter);
                 mGrid.addAccount(accountName, adapter);
                 lm.restartLoader(id, args, this);
@@ -252,11 +246,6 @@
     };
 
     @Override
-    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
-        inflater.inflate(R.menu.bookmark, menu);
-    }
-
-    @Override
     public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
         BookmarkContextMenuInfo info = (BookmarkContextMenuInfo) menuInfo;
         BrowserBookmarksAdapter adapter = getChildAdapter(info.groupPosition);
@@ -319,13 +308,8 @@
     @Override
     public void onCreate(Bundle icicle) {
         super.onCreate(icicle);
-        SharedPreferences prefs = PreferenceManager
-            .getDefaultSharedPreferences(getActivity());
-        mCurrentView = prefs.getInt(PREF_SELECTED_VIEW, getDefaultView());
-
         Bundle args = getArguments();
         mDisableNewWindow = args == null ? false : args.getBoolean(EXTRA_DISABLE_WINDOW, false);
-
         setHasOptionsMenu(true);
     }
 
@@ -350,13 +334,6 @@
         return mRoot;
     }
 
-     private int getDefaultView() {
-        if (BrowserActivity.isTablet(getActivity())) {
-            return VIEW_THUMBNAILS;
-        }
-        return VIEW_LIST;
-    }
-
     @Override
     public void onDestroyView() {
         super.onDestroyView();
@@ -425,7 +402,7 @@
                 long id = c.getLong(BookmarksLoader.COLUMN_INDEX_ID);
                 new OpenAllInTabsTask(id).execute();
             } else {
-                mCallbacks.onOpenInNewWindow(c);
+                mCallbacks.onOpenInNewWindow(BrowserBookmarksPage.getUrl(c));
             }
         }
     }
@@ -447,10 +424,13 @@
 
         @Override
         protected void onPostExecute(Cursor result) {
-            if (mCallbacks != null) {
+            if (mCallbacks != null && result.getCount() > 0) {
+                String[] urls = new String[result.getCount()];
+                int i = 0;
                 while (result.moveToNext()) {
-                    mCallbacks.onOpenInNewWindow(result);
+                    urls[i++] = BrowserBookmarksPage.getUrl(result);
                 }
+                mCallbacks.onOpenInNewWindow(urls);
             }
         }
 
@@ -505,19 +485,6 @@
     }
 
     @Override
-    public boolean onOptionsItemSelected(MenuItem item) {
-        switch (item.getItemId()) {
-        case R.id.thumbnail_view:
-            selectView(VIEW_THUMBNAILS);
-            return true;
-        case R.id.list_view:
-            selectView(VIEW_LIST);
-            return true;
-        }
-        return super.onOptionsItemSelected(item);
-    }
-
-    @Override
     public void onConfigurationChanged(Configuration newConfig) {
         super.onConfigurationChanged(newConfig);
         Resources res = getActivity().getResources();
@@ -527,28 +494,6 @@
         getActivity().invalidateOptionsMenu();
     }
 
-    @Override
-    public void onPrepareOptionsMenu(Menu menu) {
-        super.onPrepareOptionsMenu(menu);
-        menu.findItem(R.id.list_view).setVisible(mCurrentView != VIEW_LIST);
-        menu.findItem(R.id.thumbnail_view).setVisible(mCurrentView != VIEW_THUMBNAILS);
-    }
-
-    void selectView(int view) {
-        if (view == mCurrentView) {
-            return;
-        }
-        mCurrentView = view;
-        SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getActivity());
-        Editor edit = prefs.edit();
-        edit.putInt(PREF_SELECTED_VIEW, mCurrentView);
-        edit.apply();
-        if (mEmptyView.getVisibility() == View.VISIBLE) {
-            return;
-        }
-        mGrid.selectView(mCurrentView);
-    }
-
     /**
      * BreadCrumb controller callback
      */
@@ -575,19 +520,6 @@
         loader.forceLoad();
     }
 
-    @Override
-    public boolean onMenuItemClick(MenuItem item) {
-        switch (item.getItemId()) {
-        case R.id.list_view:
-            selectView(BrowserBookmarksPage.VIEW_LIST);
-            return true;
-        case R.id.thumbnail_view:
-            selectView(BrowserBookmarksPage.VIEW_THUMBNAILS);
-            return true;
-        }
-        return false;
-    }
-
     public boolean onBackPressed() {
         return false;
     }
diff --git a/src/com/android/browser/BrowserHistoryPage.java b/src/com/android/browser/BrowserHistoryPage.java
index bcc33e2..5d106ce 100644
--- a/src/com/android/browser/BrowserHistoryPage.java
+++ b/src/com/android/browser/BrowserHistoryPage.java
@@ -29,7 +29,6 @@
 import android.content.DialogInterface;
 import android.content.Intent;
 import android.content.Loader;
-import android.content.SharedPreferences;
 import android.content.pm.PackageManager;
 import android.content.pm.ResolveInfo;
 import android.database.Cursor;
@@ -38,9 +37,7 @@
 import android.graphics.BitmapFactory;
 import android.graphics.drawable.Drawable;
 import android.net.Uri;
-import android.os.AsyncTask;
 import android.os.Bundle;
-import android.preference.PreferenceManager;
 import android.provider.Browser;
 import android.provider.BrowserContract;
 import android.provider.BrowserContract.Combined;
@@ -66,6 +63,8 @@
 import android.widget.TextView;
 import android.widget.Toast;
 
+import com.android.browser.CombinedBookmarkHistoryView.CombinedBookmarksCallbacks;
+
 /**
  * Activity for displaying the browser's history, divided into
  * days of viewing.
@@ -76,7 +75,7 @@
     static final int LOADER_HISTORY = 1;
     static final int LOADER_MOST_VISITED = 2;
 
-    BookmarksHistoryCallbacks mCallbacks;
+    CombinedBookmarksCallbacks mCallback;
     HistoryAdapter mAdapter;
     HistoryChildWrapper mChildWrapper;
     boolean mDisableNewWindow;
@@ -125,17 +124,15 @@
         cm.setText(text);
     }
 
-    static BrowserHistoryPage newInstance(BookmarksHistoryCallbacks cb, Bundle args) {
+    static BrowserHistoryPage newInstance(CombinedBookmarksCallbacks cb, Bundle args) {
         BrowserHistoryPage bhp = new BrowserHistoryPage();
-        bhp.mCallbacks = cb;
+        bhp.mCallback = cb;
         bhp.setArguments(args);
         return bhp;
     }
 
     @Override
     public Loader<Cursor> onCreateLoader(int id, Bundle args) {
-        SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(
-                getActivity());
         Uri.Builder combinedBuilder = Combined.CONTENT_URI.buildUpon();
 
         switch (id) {
@@ -289,14 +286,14 @@
         @Override
         public void onItemClick(
                 AdapterView<?> parent, View view, int position, long id) {
-            mCallbacks.onUrlSelected(((HistoryItem) view).getUrl(), false);
+            mCallback.openUrl(((HistoryItem) view).getUrl());
         }
     };
 
     @Override
     public boolean onChildClick(ExpandableListView parent, View view,
             int groupPosition, int childPosition, long id) {
-        mCallbacks.onUrlSelected(((HistoryItem) view).getUrl(), false);
+        mCallback.openUrl(((HistoryItem) view).getUrl());
         return true;
     }
 
@@ -310,56 +307,49 @@
 
     @Override
     public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
+        super.onCreateOptionsMenu(menu, inflater);
         inflater.inflate(R.menu.history, menu);
     }
 
+    void promptToClearHistory() {
+        final ContentResolver resolver = getActivity().getContentResolver();
+        final ClearHistoryTask clear = new ClearHistoryTask(resolver);
+        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity())
+                .setTitle(R.string.clear)
+                .setMessage(R.string.pref_privacy_clear_history_dlg)
+                .setIcon(android.R.drawable.ic_dialog_alert)
+                .setNegativeButton(R.string.cancel, null)
+                .setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
+                     @Override
+                     public void onClick(DialogInterface dialog, int which) {
+                         if (which == DialogInterface.BUTTON_POSITIVE) {
+                             clear.start();
+                         }
+                     }
+                });
+        final Dialog dialog = builder.create();
+        dialog.show();
+    }
+
     @Override
     public boolean onOptionsItemSelected(MenuItem item) {
-        switch (item.getItemId()) {
-            case R.id.clear_history_menu_id:
-                final ContentResolver resolver = getActivity().getContentResolver();
-                final ClearHistoryTask clear = new ClearHistoryTask(resolver, mCallbacks);
-                AlertDialog.Builder builder = new AlertDialog.Builder(getActivity())
-                        .setTitle(R.string.clear)
-                        .setMessage(R.string.pref_privacy_clear_history_dlg)
-                        .setIcon(android.R.drawable.ic_dialog_alert)
-                        .setNegativeButton(R.string.cancel, null)
-                        .setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
-                             @Override
-                             public void onClick(DialogInterface dialog, int which) {
-                                 if (which == DialogInterface.BUTTON_POSITIVE) {
-                                     clear.execute();
-                                 }
-                             }
-                        });
-                final Dialog dialog = builder.create();
-                dialog.show();
-                return true;
-
-            default:
-                break;
+        if (item.getItemId() == R.id.clear_history_menu_id) {
+            promptToClearHistory();
+            return true;
         }
         return super.onOptionsItemSelected(item);
     }
 
-    static class ClearHistoryTask extends AsyncTask<Void, Void, Void> {
+    static class ClearHistoryTask extends Thread {
         ContentResolver mResolver;
-        BookmarksHistoryCallbacks mCallbacks;
 
-        public ClearHistoryTask(ContentResolver resolver,
-                BookmarksHistoryCallbacks callbacks) {
+        public ClearHistoryTask(ContentResolver resolver) {
             mResolver = resolver;
-            mCallbacks = callbacks;
-        }
-        @Override
-        protected Void doInBackground(Void... params) {
-            Browser.clearHistory(mResolver);
-            return null;
         }
 
         @Override
-        protected void onPostExecute(Void result) {
-            mCallbacks.onRemoveParentChildRelationships();
+        public void run() {
+            Browser.clearHistory(mResolver);
         }
     }
 
@@ -427,10 +417,10 @@
         Activity activity = getActivity();
         switch (item.getItemId()) {
             case R.id.open_context_menu_id:
-                mCallbacks.onUrlSelected(url, false);
+                mCallback.openUrl(url);
                 return true;
             case R.id.new_window_context_menu_id:
-                mCallbacks.onUrlSelected(url, true);
+                mCallback.openInNewTab(url);
                 return true;
             case R.id.save_to_bookmarks_menu_id:
                 if (historyItem.isBookmark()) {
diff --git a/src/com/android/browser/BrowserSnapshotPage.java b/src/com/android/browser/BrowserSnapshotPage.java
index 44c419e..a0ec5e9 100644
--- a/src/com/android/browser/BrowserSnapshotPage.java
+++ b/src/com/android/browser/BrowserSnapshotPage.java
@@ -43,6 +43,7 @@
 import android.widget.ResourceCursorAdapter;
 import android.widget.TextView;
 
+import com.android.browser.CombinedBookmarkHistoryView.CombinedBookmarksCallbacks;
 import com.android.browser.provider.SnapshotProvider.Snapshots;
 
 import java.text.DateFormat;
@@ -73,12 +74,12 @@
     GridView mGrid;
     View mEmpty;
     SnapshotAdapter mAdapter;
-    UiController mUiController;
+    CombinedBookmarksCallbacks mCallback;
 
-    public static BrowserSnapshotPage newInstance(UiController uiController,
+    public static BrowserSnapshotPage newInstance(CombinedBookmarksCallbacks cb,
             Bundle extras) {
         BrowserSnapshotPage instance = new BrowserSnapshotPage();
-        instance.mUiController = uiController;
+        instance.mCallback = cb;
         instance.setArguments(extras);
         return instance;
     }
@@ -194,8 +195,7 @@
     @Override
     public void onItemClick(AdapterView<?> parent, View view, int position,
             long id) {
-        mUiController.removeComboView();
-        mUiController.createNewSnapshotTab(id, true);
+        mCallback.openSnapshot(id);
     }
 
     private static class SnapshotAdapter extends ResourceCursorAdapter {
diff --git a/src/com/android/browser/CombinedBookmarkHistoryView.java b/src/com/android/browser/CombinedBookmarkHistoryView.java
index 4b3e6d8..191368f 100644
--- a/src/com/android/browser/CombinedBookmarkHistoryView.java
+++ b/src/com/android/browser/CombinedBookmarkHistoryView.java
@@ -17,17 +17,13 @@
 package com.android.browser;
 
 
-import android.animation.Animator;
-import android.animation.AnimatorListenerAdapter;
 import android.app.ActionBar;
 import android.app.ActionBar.Tab;
 import android.app.ActionBar.TabListener;
 import android.app.Activity;
 import android.app.FragmentManager;
 import android.app.FragmentTransaction;
-import android.content.Intent;
 import android.content.res.Configuration;
-import android.content.res.Resources;
 import android.database.Cursor;
 import android.graphics.Bitmap;
 import android.os.AsyncTask;
@@ -35,8 +31,6 @@
 import android.provider.Browser;
 import android.view.Gravity;
 import android.view.LayoutInflater;
-import android.view.Menu;
-import android.view.MenuItem;
 import android.view.MotionEvent;
 import android.view.View;
 import android.view.View.OnTouchListener;
@@ -51,13 +45,8 @@
 import java.util.HashMap;
 import java.util.Vector;
 
-interface BookmarksHistoryCallbacks {
-    public void onUrlSelected(String url, boolean newWindow);
-    public void onRemoveParentChildRelationships();
-}
-
 public class CombinedBookmarkHistoryView extends LinearLayout
-        implements OnTouchListener, TabListener, OptionsMenuHandler {
+        implements OnTouchListener, TabListener {
 
     final static String STARTING_FRAGMENT = "fragment";
 
@@ -66,7 +55,6 @@
     final static int FRAGMENT_ID_HISTORY = 2;
     final static int FRAGMENT_ID_SNAPSHOTS = 3;
 
-    private UiController mUiController;
     private Activity mActivity;
     private ActionBar mActionBar;
 
@@ -82,7 +70,14 @@
     BrowserBookmarksPage mBookmarks;
     BrowserHistoryPage mHistory;
     BrowserSnapshotPage mSnapshots;
-    boolean mIsAnimating;
+    CombinedBookmarksCallbacks mCallback;
+
+    public static interface CombinedBookmarksCallbacks {
+        void openUrl(String url);
+        void openInNewTab(String... urls);
+        void openSnapshot(long id);
+        void close();
+    }
 
     static class IconListenerSet implements IconListener {
         // Used to store favicons as we get them from the database
@@ -121,19 +116,18 @@
         return sIconListenerSet;
     }
 
-    public CombinedBookmarkHistoryView(Activity activity, UiController controller,
-            ComboViews startingView, Bundle extras) {
+    public CombinedBookmarkHistoryView(Activity activity,
+            CombinedBookmarksCallbacks cb, ComboViews startingView,
+            Bundle extras) {
         super(activity);
-        mUiController = controller;
         mActivity = activity;
         mExtras = extras;
         mActionBar = mActivity.getActionBar();
+        mCallback = cb;
 
         View v = LayoutInflater.from(activity).inflate(R.layout.bookmarks_history, this);
         v.setOnTouchListener(this);
 
-//        setDefaultKeyMode(DEFAULT_KEYS_SEARCH_LOCAL);
-
         mBookmarksHeader = new FrameLayout(mActivity);
         mBookmarksHeader.setLayoutParams(new FrameLayout.LayoutParams(
                 FrameLayout.LayoutParams.WRAP_CONTENT,
@@ -158,29 +152,7 @@
             }
         }).execute();
 
-        mIsAnimating = true;
-        setAlpha(0f);
-        Resources res = mActivity.getResources();
-        animate().alpha(1f)
-                .setDuration(res.getInteger(R.integer.comboViewFadeInDuration))
-                .setListener(new AnimatorListenerAdapter() {
-            @Override
-            public void onAnimationEnd(Animator animation) {
-                super.onAnimationEnd(animation);
-                mIsAnimating = false;
-                if (mActionBar == null) {
-                    // We were destroyed, return
-                    return;
-                }
-                FragmentManager fm = mActivity.getFragmentManager();
-                FragmentTransaction ft = fm.beginTransaction();
-                onTabSelected(mActionBar.getSelectedTab(), ft);
-                ft.commit();
-            }
-        });
-
         setupActionBar(startingView);
-        mUiController.registerOptionsMenuHandler(this);
     }
 
     void setupActionBar(ComboViews startingView) {
@@ -228,15 +200,15 @@
             // Warning, ugly hack below
             // This is done because history uses orientation-specific padding
             FragmentManager fm = mActivity.getFragmentManager();
-            mHistory = BrowserHistoryPage.newInstance(mUiController, mHistory.getArguments());
+            mHistory = BrowserHistoryPage.newInstance(mCallback, mHistory.getArguments());
             fm.beginTransaction().replace(R.id.fragment, mHistory).commit();
         }
     }
 
     private BookmarksPageCallbacks mBookmarkCallbackWrapper = new BookmarksPageCallbacks() {
         @Override
-        public boolean onOpenInNewWindow(Cursor c) {
-            mUiController.onUrlSelected(BrowserBookmarksPage.getUrl(c), true);
+        public boolean onOpenInNewWindow(String... urls) {
+            mCallback.openInNewTab(urls);
             return true;
         }
 
@@ -245,7 +217,7 @@
             if (isFolder) {
                 return false;
             }
-            mUiController.onUrlSelected(BrowserBookmarksPage.getUrl(c), false);
+            mCallback.openUrl(BrowserBookmarksPage.getUrl(c));
             return true;
         }
     };
@@ -253,8 +225,8 @@
     private void initFragments(Bundle extras) {
         mBookmarks = BrowserBookmarksPage.newInstance(mBookmarkCallbackWrapper,
                 extras, mBookmarksHeader);
-        mHistory = BrowserHistoryPage.newInstance(mUiController, extras);
-        mSnapshots = BrowserSnapshotPage.newInstance(mUiController, extras);
+        mHistory = BrowserHistoryPage.newInstance(mCallback, extras);
+        mSnapshots = BrowserSnapshotPage.newInstance(mCallback, extras);
     }
 
     private void loadFragment(int id, FragmentTransaction ft) {
@@ -300,16 +272,12 @@
             }
             mCurrentFragment = INVALID_ID;
         }
-        mUiController.unregisterOptionsMenuHandler(this);
     }
 
     /**
      * callback for back key presses
      */
     boolean onBackPressed() {
-        if (mIsAnimating) {
-            return true;
-        }
         if (mCurrentFragment == FRAGMENT_ID_BOOKMARKS) {
             return mBookmarks.onBackPressed();
         }
@@ -332,13 +300,6 @@
 
     @Override
     public void onTabSelected(Tab tab, FragmentTransaction ft) {
-        if (mIsAnimating) {
-            // We delay set while animating (smooth animations)
-            // TODO: Signal to the fragment in advance so that it can start
-            // loading its data asynchronously
-            return;
-        }
-
         if (tab == mTabBookmarks) {
             loadFragment(FRAGMENT_ID_BOOKMARKS, ft);
         } else if (tab == mTabHistory) {
@@ -353,44 +314,4 @@
         // Ignore
     }
 
-    @Override
-    public boolean onCreateOptionsMenu(Menu menu) {
-        // Handled by fragment
-        return false;
-    }
-
-    @Override
-    public boolean onPrepareOptionsMenu(Menu menu) {
-        // Handled by fragment
-        return false;
-    }
-
-    public boolean onOptionsItemSelected(MenuItem item) {
-        switch (item.getItemId()) {
-        case android.R.id.home:
-            mUiController.getUi().onBackKey();
-            return true;
-        case R.id.go_home:
-            BrowserSettings settings = BrowserSettings.getInstance();
-            mUiController.onUrlSelected(settings.getHomePage(), false);
-            return true;
-        case R.id.add_bookmark:
-            mUiController.bookmarkCurrentPage(false);
-            return true;
-        case R.id.preferences_menu_id:
-            Intent intent = new Intent(mActivity, BrowserPreferencesPage.class);
-            intent.putExtra(BrowserPreferencesPage.CURRENT_PAGE,
-                    mUiController.getCurrentTopWebView().getUrl());
-            mActivity.startActivityForResult(intent, Controller.PREFERENCES_PAGE);
-            return true;
-        }
-
-        switch (mCurrentFragment) {
-        case FRAGMENT_ID_BOOKMARKS:
-            return mBookmarks.onOptionsItemSelected(item);
-        case FRAGMENT_ID_HISTORY:
-            return mHistory.onOptionsItemSelected(item);
-        }
-        return false;
-    }
 }
diff --git a/src/com/android/browser/ComboViewActivity.java b/src/com/android/browser/ComboViewActivity.java
new file mode 100644
index 0000000..cea1884
--- /dev/null
+++ b/src/com/android/browser/ComboViewActivity.java
@@ -0,0 +1,110 @@
+/*
+ * 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.
+ */
+package com.android.browser;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.net.Uri;
+import android.os.Bundle;
+import android.view.Menu;
+import android.view.MenuItem;
+
+import com.android.browser.CombinedBookmarkHistoryView.CombinedBookmarksCallbacks;
+import com.android.browser.UI.ComboViews;
+
+public class ComboViewActivity extends Activity implements CombinedBookmarksCallbacks {
+
+    public static final String EXTRA_COMBO_ARGS = "combo_args";
+    public static final String EXTRA_INITIAL_VIEW = "initial_view";
+
+    public static final String EXTRA_OPEN_SNAPSHOT = "snapshot_id";
+    public static final String EXTRA_OPEN_ALL = "open_all";
+    public static final String EXTRA_CURRENT_URL = "url";
+    public static final String EXTRA_BOOKMARK_PAGE = "create_bookmark";
+
+    private CombinedBookmarkHistoryView mComboView;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setResult(RESULT_CANCELED);
+        Bundle extras = getIntent().getExtras();
+        Bundle args = extras.getBundle(EXTRA_COMBO_ARGS);
+        String svStr = extras.getString(EXTRA_INITIAL_VIEW, null);
+        ComboViews startingView = svStr != null
+                ? ComboViews.valueOf(svStr)
+                : ComboViews.Bookmarks;
+        mComboView = new CombinedBookmarkHistoryView(this, this,
+                startingView, args);
+        setContentView(mComboView);
+    }
+
+    @Override
+    public void openUrl(String url) {
+        Intent i = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
+        setResult(RESULT_OK, i);
+        finish();
+    }
+
+    @Override
+    public void openInNewTab(String... urls) {
+        Intent i = new Intent();
+        i.putExtra(EXTRA_OPEN_ALL, urls);
+        setResult(RESULT_OK, i);
+        finish();
+    }
+
+    @Override
+    public void close() {
+        finish();
+    }
+
+    @Override
+    public void openSnapshot(long id) {
+        Intent i = new Intent();
+        i.putExtra(EXTRA_OPEN_SNAPSHOT, id);
+        setResult(RESULT_OK, i);
+        finish();
+    }
+
+    @Override
+    public void onBackPressed() {
+        if (!mComboView.onBackPressed()) {
+            super.onBackPressed();
+        }
+    }
+
+    @Override
+    public boolean onCreateOptionsMenu(Menu menu) {
+        getMenuInflater().inflate(R.menu.combined, menu);
+        return super.onCreateOptionsMenu(menu);
+    }
+
+    @Override
+    public boolean onOptionsItemSelected(MenuItem item) {
+        if (item.getItemId() == android.R.id.home) {
+            finish();
+            return true;
+        } else if (item.getItemId() == R.id.preferences_menu_id) {
+            String url = getIntent().getStringExtra(EXTRA_CURRENT_URL);
+            Intent intent = new Intent(this, BrowserPreferencesPage.class);
+            intent.putExtra(BrowserPreferencesPage.CURRENT_PAGE, url);
+            startActivityForResult(intent, Controller.PREFERENCES_PAGE);
+            return true;
+        }
+        return super.onOptionsItemSelected(item);
+    }
+}
diff --git a/src/com/android/browser/Controller.java b/src/com/android/browser/Controller.java
index 9659063..9b81870 100644
--- a/src/com/android/browser/Controller.java
+++ b/src/com/android/browser/Controller.java
@@ -118,6 +118,7 @@
     private static final int EMPTY_MENU = -1;
 
     // activity requestCode
+    final static int COMBO_VIEW = 1;
     final static int PREFERENCES_PAGE = 3;
     final static int FILE_SELECTED = 4;
     final static int AUTOFILL_SETUP = 5;
@@ -145,7 +146,6 @@
     private TabControl mTabControl;
     private BrowserSettings mSettings;
     private WebViewFactory mFactory;
-    private OptionsMenuHandler mOptionsMenuHandler = null;
 
     private WakeLock mWakeLock;
 
@@ -1152,6 +1152,30 @@
                     mAutoFillSetupMessage = null;
                 }
                 break;
+            case COMBO_VIEW:
+                if (intent == null || resultCode != Activity.RESULT_OK) {
+                    break;
+                }
+                if (Intent.ACTION_VIEW.equals(intent.getAction())) {
+                    Tab t = getCurrentTab();
+                    Uri uri = intent.getData();
+                    loadUrl(t, uri.toString());
+                } else if (intent.hasExtra(ComboViewActivity.EXTRA_OPEN_ALL)) {
+                    String[] urls = intent.getStringArrayExtra(
+                            ComboViewActivity.EXTRA_OPEN_ALL);
+                    Tab parent = getCurrentTab();
+                    for (String url : urls) {
+                        parent = openTab(url, parent,
+                                !mSettings.openInBackground(), true);
+                    }
+                } else if (intent.hasExtra(ComboViewActivity.EXTRA_OPEN_SNAPSHOT)) {
+                    long id = intent.getLongExtra(
+                            ComboViewActivity.EXTRA_OPEN_SNAPSHOT, -1);
+                    if (id >= 0) {
+                        createNewSnapshotTab(id, true);
+                    }
+                }
+                break;
             default:
                 break;
         }
@@ -1189,34 +1213,6 @@
         mTabControl.removeParentChildRelationShips();
     }
 
-    /**
-     * callback from ComboPage when bookmark/history selection
-     */
-    @Override
-    public void onUrlSelected(String url, boolean newTab) {
-        removeComboView();
-        if (!TextUtils.isEmpty(url)) {
-            if (newTab) {
-                final Tab parent = mTabControl.getCurrentTab();
-                openTab(url,
-                        (parent != null) && parent.isPrivateBrowsingEnabled(),
-                        !mSettings.openInBackground(),
-                        true);
-            } else {
-                final Tab currentTab = mTabControl.getCurrentTab();
-                loadUrl(currentTab, url);
-            }
-        }
-    }
-
-    /**
-     * dismiss the ComboPage
-     */
-    @Override
-    public void removeComboView() {
-        mUi.hideComboView();
-    }
-
     // key handling
     protected void onBackKey() {
         if (!mUi.onBackKey()) {
@@ -1241,10 +1237,6 @@
     // TODO: maybe put into separate handler
 
     protected boolean onCreateOptionsMenu(Menu menu) {
-        if (mOptionsMenuHandler != null) {
-            return mOptionsMenuHandler.onCreateOptionsMenu(menu);
-        }
-
         if (mMenuState == EMPTY_MENU) {
             return false;
         }
@@ -1437,9 +1429,6 @@
     }
 
     boolean onPrepareOptionsMenu(Menu menu) {
-        if (mOptionsMenuHandler != null) {
-            return mOptionsMenuHandler.onPrepareOptionsMenu(menu);
-        }
         // Note: setVisible will decide whether an item is visible; while
         // setEnabled() will decide whether an item is enabled, which also means
         // whether the matching shortcut key will function.
@@ -1513,16 +1502,6 @@
     }
 
     public boolean onOptionsItemSelected(MenuItem item) {
-        if (mOptionsMenuHandler != null &&
-                mOptionsMenuHandler.onOptionsItemSelected(item)) {
-            return true;
-        }
-
-        if (item.getGroupId() != R.id.CONTEXT_MENU) {
-            // menu remains active, so ensure comboview is dismissed
-            // if main menu option is selected
-            removeComboView();
-        }
         if (null == getCurrentTopWebView()) {
             return false;
         }
@@ -1552,7 +1531,7 @@
                 break;
 
             case R.id.add_bookmark_menu_id:
-                bookmarkCurrentPage(false);
+                mActivity.startActivity(createBookmarkCurrentPageIntent(false));
                 break;
 
             case R.id.stop_reload_menu_id:
@@ -1853,13 +1832,13 @@
     /**
      * add the current page as a bookmark to the given folder id
      * @param folderId use -1 for the default folder
-     * @param canBeAnEdit If true, check to see whether the site is already
+     * @param editExisting If true, check to see whether the site is already
      *          bookmarked, and if it is, edit that bookmark.  If false, and
      *          the site is already bookmarked, do not attempt to edit the
      *          existing bookmark.
      */
     @Override
-    public void bookmarkCurrentPage(boolean canBeAnEdit) {
+    public Intent createBookmarkCurrentPageIntent(boolean editExisting) {
         Intent i = new Intent(mActivity,
                 AddBookmarkPage.class);
         WebView w = getCurrentTopWebView();
@@ -1878,13 +1857,13 @@
                 createScreenshot(w, getDesiredThumbnailWidth(mActivity),
                 getDesiredThumbnailHeight(mActivity)));
         i.putExtra(BrowserContract.Bookmarks.FAVICON, w.getFavicon());
-        if (canBeAnEdit) {
+        if (editExisting) {
             i.putExtra(AddBookmarkPage.CHECK_FOR_DUPE, true);
         }
         // Put the dialog at the upper right of the screen, covering the
         // star on the title bar.
         i.putExtra("gravity", Gravity.RIGHT | Gravity.TOP);
-        mActivity.startActivity(i);
+        return i;
     }
 
     // file chooser
@@ -2278,8 +2257,6 @@
      */
     @Override
     public boolean switchToTab(Tab tab) {
-        // hide combo view if open
-        removeComboView();
         Tab currentTab = mTabControl.getCurrentTab();
         if (tab == null || tab == currentTab) {
             return false;
@@ -2290,8 +2267,6 @@
 
     @Override
     public void closeCurrentTab() {
-        // hide combo view if open
-        removeComboView();
         if (mTabControl.getTabCount() == 1) {
             CrashRecoveryHandler.clearState(mActivity);
             mActivity.finish();
@@ -2318,8 +2293,6 @@
      */
     @Override
     public void closeTab(Tab tab) {
-        // hide combo view if open
-        removeComboView();
         removeTab(tab);
     }
 
@@ -2490,12 +2463,8 @@
         // Even if MENU is already held down, we need to call to super to open
         // the IME on long press.
         if (KeyEvent.KEYCODE_MENU == keyCode) {
-            if (mOptionsMenuHandler != null) {
-                return false;
-            } else {
-                event.startTracking();
-                return true;
-            }
+            event.startTracking();
+            return true;
         }
         if (!noModifiers
                 && ((KeyEvent.KEYCODE_MENU == keyCode)
@@ -2659,18 +2628,6 @@
     }
 
     @Override
-    public void registerOptionsMenuHandler(OptionsMenuHandler handler) {
-        mOptionsMenuHandler = handler;
-    }
-
-    @Override
-    public void unregisterOptionsMenuHandler(OptionsMenuHandler handler) {
-        if (mOptionsMenuHandler == handler) {
-            mOptionsMenuHandler = null;
-        }
-    }
-
-    @Override
     public void registerDropdownChangeListener(DropdownChangeListener d) {
         mUi.registerDropdownChangeListener(d);
     }
diff --git a/src/com/android/browser/IntentHandler.java b/src/com/android/browser/IntentHandler.java
index 1a72a23..6ed5b72 100644
--- a/src/com/android/browser/IntentHandler.java
+++ b/src/com/android/browser/IntentHandler.java
@@ -88,7 +88,6 @@
             mController.bookmarksOrHistoryPicker(false);
             return;
         }
-        mController.removeComboView();
 
         // In case the SearchDialog is open.
         ((SearchManager) mActivity.getSystemService(Context.SEARCH_SERVICE))
diff --git a/src/com/android/browser/NavigationBarTablet.java b/src/com/android/browser/NavigationBarTablet.java
index 1aeb35b..9cb8ff2 100644
--- a/src/com/android/browser/NavigationBarTablet.java
+++ b/src/com/android/browser/NavigationBarTablet.java
@@ -156,7 +156,7 @@
         } else if (mForwardButton == v) {
             mUiController.getCurrentTab().goForward();
         } else if (mStar == v) {
-            mUiController.bookmarkCurrentPage(true);
+            getContext().startActivity(mUiController.createBookmarkCurrentPageIntent(true));
         } else if (mAllButton == v) {
             mUiController.bookmarksOrHistoryPicker(false);
         } else if (mSearchButton == v) {
diff --git a/src/com/android/browser/PhoneUi.java b/src/com/android/browser/PhoneUi.java
index 7c3641c..6c484db 100644
--- a/src/com/android/browser/PhoneUi.java
+++ b/src/com/android/browser/PhoneUi.java
@@ -56,12 +56,6 @@
     }
 
     @Override
-    public void hideComboView() {
-        super.hideComboView();
-        mActivity.getActionBar().hide();
-    }
-
-    @Override
     public void onDestroy() {
         hideTitleBar();
     }
@@ -85,22 +79,16 @@
 
     @Override
     public boolean onMenuKey() {
-        if (!isComboViewShowing()) {
-            if (mNavScreen == null) {
-                showNavScreen();
-            } else {
-                mNavScreen.close();
-            }
-            return true;
+        if (mNavScreen == null) {
+            showNavScreen();
         } else {
-            return false;
+            mNavScreen.close();
         }
+        return true;
     }
 
     @Override
     public boolean dispatchKey(int code, KeyEvent event) {
-        if (!isComboViewShowing()) {
-        }
         return false;
     }
 
diff --git a/src/com/android/browser/ShortcutActivity.java b/src/com/android/browser/ShortcutActivity.java
index af1788d..134bf23 100644
--- a/src/com/android/browser/ShortcutActivity.java
+++ b/src/com/android/browser/ShortcutActivity.java
@@ -19,7 +19,6 @@
 import android.app.Activity;
 import android.content.Intent;
 import android.database.Cursor;
-import android.net.Uri;
 import android.os.Bundle;
 import android.view.View;
 import android.view.View.OnClickListener;
@@ -59,7 +58,7 @@
     }
 
     @Override
-    public boolean onOpenInNewWindow(Cursor c) {
+    public boolean onOpenInNewWindow(String... urls) {
         return false;
     }
 
diff --git a/src/com/android/browser/UI.java b/src/com/android/browser/UI.java
index fdd2b93..4b58872 100644
--- a/src/com/android/browser/UI.java
+++ b/src/com/android/browser/UI.java
@@ -85,8 +85,6 @@
 
     public void showComboView(ComboViews startingView, Bundle extra);
 
-    public void hideComboView();
-
     public void showCustomView(View view, int requestedOrientation,
             CustomViewCallback callback);
 
diff --git a/src/com/android/browser/UiController.java b/src/com/android/browser/UiController.java
index 10821cd..14d498c 100644
--- a/src/com/android/browser/UiController.java
+++ b/src/com/android/browser/UiController.java
@@ -29,7 +29,7 @@
 /**
  * UI aspect of the controller
  */
-public interface UiController extends BookmarksHistoryCallbacks {
+public interface UiController {
 
     UI getUi();
 
@@ -60,7 +60,7 @@
 
     void stopLoading();
 
-    void bookmarkCurrentPage(boolean canBeAnEdit);
+    Intent createBookmarkCurrentPageIntent(boolean canBeAnEdit);
 
     void bookmarksOrHistoryPicker(boolean openHistory);
 
@@ -76,8 +76,6 @@
 
     boolean shouldShowErrorConsole();
 
-    void removeComboView();
-
     void hideCustomView();
 
     void attachSubWindow(Tab tab);
@@ -90,10 +88,6 @@
 
     void shareCurrentPage();
 
-    void registerOptionsMenuHandler(OptionsMenuHandler handler);
-
-    void unregisterOptionsMenuHandler(OptionsMenuHandler handler);
-
     void updateMenuState(Tab tab, Menu menu);
 
     void registerDropdownChangeListener(DropdownChangeListener d);
diff --git a/src/com/android/browser/XLargeUi.java b/src/com/android/browser/XLargeUi.java
index 73375e0..73821bf 100644
--- a/src/com/android/browser/XLargeUi.java
+++ b/src/com/android/browser/XLargeUi.java
@@ -73,16 +73,6 @@
     }
 
     @Override
-    public void hideComboView() {
-        if (isComboViewShowing()) {
-            super.hideComboView();
-            // ComboView changes the action bar, set it back up to what we want
-            setupActionBar();
-            checkTabCount();
-        }
-    }
-
-    @Override
     public void setUseQuickControls(boolean useQuickControls) {
         mUseQuickControls = useQuickControls;
         mTitleBar.setUseQuickControls(mUseQuickControls);