Bookmarks page UI updates

 Bug: 3248628
 Updates the bookmark page UI based off of the newest UI design
 document.

Change-Id: I26447b7e1c38798b3c229c9d8c10af2565458a7b
diff --git a/src/com/android/browser/AddBookmarkPage.java b/src/com/android/browser/AddBookmarkPage.java
index de256a8..24a8cd5 100644
--- a/src/com/android/browser/AddBookmarkPage.java
+++ b/src/com/android/browser/AddBookmarkPage.java
@@ -140,44 +140,11 @@
                 LOADER_ID_FOLDER_CONTENTS));
         loader.setUri(uri);
         loader.forceLoad();
-        updateVisible();
         if (mFolderNamer.getVisibility() == View.VISIBLE) {
             completeOrCancelFolderNaming(true);
         }
     }
 
-    /**
-     * Update the views shown to only show the two deepest levels of crumbs.
-     * Note that this method depends on internal knowledge of BreadCrumbView.
-     */
-    private void updateVisible() {
-      if (MAX_CRUMBS_SHOWN > 0) {
-          int invisibleCrumbs = mCrumbs.size() - MAX_CRUMBS_SHOWN;
-          // This class always uses a back button, which is the first child.
-          int childIndex = 1;
-          if (invisibleCrumbs > 0) {
-              int crumbIndex = 0;
-              while (crumbIndex < invisibleCrumbs) {
-                  // Set the crumb to GONE.
-                  mCrumbs.getChildAt(childIndex).setVisibility(View.GONE);
-                  childIndex++;
-                  // Each crumb is followed by a separator (except the last
-                  // one).  Also make it GONE
-                  mCrumbs.getChildAt(childIndex).setVisibility(View.GONE);
-                  childIndex++;
-                  // Move to the next crumb.
-                  crumbIndex++;
-              }
-          }
-          // Make sure the last two are visible.
-          int childCount = mCrumbs.getChildCount();
-          while (childIndex < childCount) {
-              mCrumbs.getChildAt(childIndex).setVisibility(View.VISIBLE);
-              childIndex++;
-          }
-      }
-    }
-
     @Override
     public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
         if (v == mFolderNamer) {
@@ -428,7 +395,6 @@
                     mCrumbs.pushView(thisFolder.Name, thisFolder);
                 }
                 getLoaderManager().stopLoader(LOADER_ID_ALL_FOLDERS);
-                updateVisible();
                 break;
             default:
                 break;
@@ -566,6 +532,7 @@
         mCrumbs.pushView(name, false,
                 new Folder(name, BrowserProvider2.FIXED_ID_ROOT));
         mCrumbHolder = findViewById(R.id.crumb_holder);
+        mCrumbs.setMaxVisible(MAX_CRUMBS_SHOWN);
 
         mAdapter = new FolderAdapter(this);
         mListView = (ListView) findViewById(R.id.list);
diff --git a/src/com/android/browser/BreadCrumbView.java b/src/com/android/browser/BreadCrumbView.java
index d0ba8ad..e4940e9 100644
--- a/src/com/android/browser/BreadCrumbView.java
+++ b/src/com/android/browser/BreadCrumbView.java
@@ -47,6 +47,7 @@
     private List<Crumb> mCrumbs;
     private boolean mUseBackButton;
     private Drawable mSeparatorDrawable;
+    private int mMaxVisible = -1;
 
     /**
      * @param context
@@ -80,22 +81,31 @@
         mCrumbs = new ArrayList<Crumb>();
         mSeparatorDrawable = ctx.getResources().getDrawable(
                 R.drawable.crumb_divider);
+        addBackButton();
     }
 
     public void setUseBackButton(boolean useflag) {
         mUseBackButton = useflag;
-        if (mUseBackButton && (mBackButton == null)) {
-            addBackButton();
-        } else if (!mUseBackButton && (mBackButton != null)) {
-            removeView(mBackButton);
-            mBackButton = null;
-        }
+        updateVisible();
     }
 
     public void setController(Controller ctl) {
         mController = ctl;
     }
 
+    public int getMaxVisible() {
+        return mMaxVisible;
+    }
+
+    public void setMaxVisible(int max) {
+        mMaxVisible = max;
+        updateVisible();
+    }
+
+    public int getTopLevel() {
+        return mCrumbs.size();
+    }
+
     public Object getTopData() {
         Crumb c = getTopCrumb();
         if (c != null) {
@@ -155,14 +165,12 @@
     }
 
     private void pushCrumb(Crumb crumb) {
-        if (!mUseBackButton || (mCrumbs.size() > 0)) {
+        if (mCrumbs.size() > 0) {
             addSeparator();
         }
         mCrumbs.add(crumb);
         addView(crumb.crumbView);
-        if (mUseBackButton) {
-            mBackButton.setVisibility(crumb.canGoBack ? View.VISIBLE : View.INVISIBLE);
-        }
+        updateVisible();
         crumb.crumbView.setOnClickListener(this);
     }
 
@@ -191,12 +199,54 @@
                     mBackButton.setVisibility(View.INVISIBLE);
                 }
             }
+            updateVisible();
             if (notify) {
                 notifyController();
             }
         }
     }
 
+    private void updateVisible() {
+        // start at index 1 (0 == back button)
+        int childIndex = 1;
+        if (mMaxVisible >= 0) {
+            int invisibleCrumbs = size() - mMaxVisible;
+            if (invisibleCrumbs > 0) {
+                int crumbIndex = 0;
+                while (crumbIndex < invisibleCrumbs) {
+                    // Set the crumb to GONE.
+                    getChildAt(childIndex).setVisibility(View.GONE);
+                    childIndex++;
+                    // Each crumb is followed by a separator (except the last
+                    // one).  Also make it GONE
+                    if (getChildAt(childIndex) != null) {
+                        getChildAt(childIndex).setVisibility(View.GONE);
+                    }
+                    childIndex++;
+                    // Move to the next crumb.
+                    crumbIndex++;
+                }
+            }
+            // Make sure the last two are visible.
+            int childCount = getChildCount();
+            while (childIndex < childCount) {
+                getChildAt(childIndex).setVisibility(View.VISIBLE);
+                childIndex++;
+            }
+        } else {
+            int count = getChildCount();
+            for (int i = childIndex; i < count ; i++) {
+                getChildAt(i).setVisibility(View.VISIBLE);
+            }
+        }
+        if (mUseBackButton) {
+            boolean canGoBack = getTopCrumb() != null ? getTopCrumb().canGoBack : false;
+            mBackButton.setVisibility(canGoBack ? View.VISIBLE : View.INVISIBLE);
+        } else {
+            mBackButton.setVisibility(View.GONE);
+        }
+    }
+
     private void removeLastView() {
         int ix = getChildCount();
         if (ix > 0) {
diff --git a/src/com/android/browser/BrowserBookmarksPage.java b/src/com/android/browser/BrowserBookmarksPage.java
index 74385f9..13a0101 100644
--- a/src/com/android/browser/BrowserBookmarksPage.java
+++ b/src/com/android/browser/BrowserBookmarksPage.java
@@ -56,7 +56,6 @@
 import android.widget.AdapterView.OnItemSelectedListener;
 import android.widget.GridView;
 import android.widget.ListView;
-import android.widget.PopupMenu;
 import android.widget.PopupMenu.OnMenuItemClickListener;
 import android.widget.TextView;
 import android.widget.Toast;
@@ -66,6 +65,7 @@
     boolean onBookmarkSelected(Cursor c, boolean isFolder);
     // Return true if handled
     boolean onOpenInNewWindow(Cursor c);
+    void onFolderChanged(int level, Uri uri);
 }
 
 /**
@@ -103,10 +103,12 @@
     View mEmptyView;
     int mCurrentView;
     View mHeader;
-    View mRootFolderView;
     ViewGroup mHeaderContainer;
     BreadCrumbView mCrumbs;
     TextView mSelectBookmarkView;
+    int mCrumbVisibility = View.VISIBLE;
+    int mCrumbMaxVisible = -1;
+    boolean mCrumbBackButton = false;
 
     static BrowserBookmarksPage newInstance(BookmarksPageCallbacks cb,
             Bundle args, ViewGroup headerContainer) {
@@ -242,20 +244,6 @@
         return -1;
     }
 
-    public void onFolderChange(int level, Object data) {
-        Uri uri = (Uri) data;
-        if (uri == null) {
-            // top level
-            uri = BrowserContract.Bookmarks.CONTENT_URI_DEFAULT_FOLDER;
-        }
-        LoaderManager manager = getLoaderManager();
-        BookmarksLoader loader =
-                (BookmarksLoader) ((Loader<?>) manager.getLoader(LOADER_BOOKMARKS));
-        loader.setUri(uri);
-        loader.forceLoad();
-
-    }
-
     @Override
     public boolean onContextItemSelected(MenuItem item) {
         final Activity activity = getActivity();
@@ -420,11 +408,16 @@
         mHeader = inflater.inflate(R.layout.bookmarks_header, hc, true);
         mCrumbs = (BreadCrumbView) mHeader.findViewById(R.id.crumbs);
         mCrumbs.setController(this);
+        mCrumbs.setUseBackButton(mCrumbBackButton);
+        mCrumbs.setMaxVisible(mCrumbMaxVisible);
+        mCrumbs.setVisibility(mCrumbVisibility);
+        String name = getString(R.string.bookmarks);
+        mCrumbs.pushView(name, false, BrowserContract.Bookmarks.CONTENT_URI_DEFAULT_FOLDER);
+        if (mCallbacks != null) {
+            mCallbacks.onFolderChanged(1, BrowserContract.Bookmarks.CONTENT_URI_DEFAULT_FOLDER);
+        }
         mSelectBookmarkView = (TextView) mHeader.findViewById(R.id.select_bookmark_view);
         mSelectBookmarkView.setOnClickListener(this);
-        mRootFolderView = mHeader.findViewById(R.id.root_folder);
-        mRootFolderView.setOnClickListener(this);
-        setShowRootFolder(mShowRootFolder);
 
         // Start the loaders
         LoaderManager lm = getLoaderManager();
@@ -432,9 +425,9 @@
         mCurrentView =
             prefs.getInt(PREF_SELECTED_VIEW, BrowserBookmarksPage.VIEW_THUMBNAILS);
         if (mCurrentView == BrowserBookmarksPage.VIEW_THUMBNAILS) {
-            mSelectBookmarkView.setText(R.string.bookmark_thumbnail_view);
-        } else {
             mSelectBookmarkView.setText(R.string.bookmark_list_view);
+        } else {
+            mSelectBookmarkView.setText(R.string.bookmark_thumbnail_view);
         }
         mAdapter = new BrowserBookmarksAdapter(getActivity(), mCurrentView);
         String accountType = prefs.getString(PREF_ACCOUNT_TYPE, DEFAULT_ACCOUNT);
@@ -459,17 +452,6 @@
         return root;
     }
 
-    public void setShowRootFolder(boolean show) {
-        mShowRootFolder = show;
-        if (mRootFolderView != null) {
-            if (mShowRootFolder) {
-                mRootFolderView.setVisibility(View.VISIBLE);
-            } else {
-                mRootFolderView.setVisibility(View.GONE);
-            }
-        }
-    }
-
     @Override
     public void onDestroyView() {
         super.onDestroyView();
@@ -505,17 +487,13 @@
 
         if (isFolder) {
             String title = cursor.getString(BookmarksLoader.COLUMN_INDEX_TITLE);
-            LoaderManager manager = getLoaderManager();
-            BookmarksLoader loader =
-                    (BookmarksLoader) ((Loader<?>) manager.getLoader(LOADER_BOOKMARKS));
             Uri uri = ContentUris.withAppendedId(
                     BrowserContract.Bookmarks.CONTENT_URI_DEFAULT_FOLDER, id);
             if (mCrumbs != null) {
                 // update crumbs
                 mCrumbs.pushView(title, uri);
             }
-            loader.setUri(uri);
-            loader.forceLoad();
+            loadFolder(uri);
         }
     }
 
@@ -636,6 +614,11 @@
             return;
         }
         mCurrentView = view;
+        if (mCurrentView == BrowserBookmarksPage.VIEW_THUMBNAILS) {
+            mSelectBookmarkView.setText(R.string.bookmark_list_view);
+        } else {
+            mSelectBookmarkView.setText(R.string.bookmark_thumbnail_view);
+        }
         SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getActivity());
         Editor edit = prefs.edit();
         edit.putInt(PREF_SELECTED_VIEW, mCurrentView);
@@ -664,28 +647,39 @@
         }
     }
 
-    public BreadCrumbView getBreadCrumb() {
-        return mCrumbs;
-    }
-
     /**
      * BreadCrumb controller callback
      */
     @Override
     public void onTop(int level, Object data) {
-        onFolderChange(level, data);
+        Uri uri = (Uri) data;
+        if (uri == null) {
+            // top level
+            uri = BrowserContract.Bookmarks.CONTENT_URI_DEFAULT_FOLDER;
+        }
+        loadFolder(uri);
+    }
+
+    /**
+     * @param uri
+     */
+    private void loadFolder(Uri uri) {
+        LoaderManager manager = getLoaderManager();
+        BookmarksLoader loader =
+                (BookmarksLoader) ((Loader<?>) manager.getLoader(LOADER_BOOKMARKS));
+        loader.setUri(uri);
+        loader.forceLoad();
+        if (mCallbacks != null) {
+            mCallbacks.onFolderChanged(mCrumbs.getTopLevel(), uri);
+        }
     }
 
     @Override
     public void onClick(View view) {
         if (mSelectBookmarkView == view) {
-            PopupMenu popup = new PopupMenu(getActivity(), mSelectBookmarkView);
-            popup.getMenuInflater().inflate(R.menu.bookmark_view,
-                    popup.getMenu());
-            popup.setOnMenuItemClickListener(this);
-            popup.show();
-        } else if (mRootFolderView == view) {
-            mCrumbs.clear();
+            selectView(mCurrentView == BrowserBookmarksPage.VIEW_LIST
+                    ? BrowserBookmarksPage.VIEW_THUMBNAILS
+                    : BrowserBookmarksPage.VIEW_LIST);
         }
     }
 
@@ -693,11 +687,9 @@
     public boolean onMenuItemClick(MenuItem item) {
         switch (item.getItemId()) {
         case R.id.list_view:
-            mSelectBookmarkView.setText(R.string.bookmark_list_view);
             selectView(BrowserBookmarksPage.VIEW_LIST);
             return true;
         case R.id.thumbnail_view:
-            mSelectBookmarkView.setText(R.string.bookmark_thumbnail_view);
             selectView(BrowserBookmarksPage.VIEW_THUMBNAILS);
             return true;
         }
@@ -768,4 +760,25 @@
             }
         }
     }
+
+    public void setBreadCrumbVisibility(int visibility) {
+        mCrumbVisibility = visibility;
+        if (mCrumbs != null) {
+            mCrumbs.setVisibility(mCrumbVisibility);
+        }
+    }
+
+    public void setBreadCrumbUseBackButton(boolean use) {
+        mCrumbBackButton = use;
+        if (mCrumbs != null) {
+            mCrumbs.setUseBackButton(mCrumbBackButton);
+        }
+    }
+
+    public void setBreadCrumbMaxVisible(int max) {
+        mCrumbMaxVisible = max;
+        if (mCrumbs != null) {
+            mCrumbs.setMaxVisible(mCrumbMaxVisible);
+        }
+    }
 }
diff --git a/src/com/android/browser/CombinedBookmarkHistoryView.java b/src/com/android/browser/CombinedBookmarkHistoryView.java
index 15f31f6..e63d126 100644
--- a/src/com/android/browser/CombinedBookmarkHistoryView.java
+++ b/src/com/android/browser/CombinedBookmarkHistoryView.java
@@ -24,6 +24,7 @@
 import android.content.res.Resources;
 import android.database.Cursor;
 import android.graphics.Bitmap;
+import android.net.Uri;
 import android.os.AsyncTask;
 import android.os.Bundle;
 import android.provider.Browser;
@@ -66,6 +67,7 @@
     TextView mAddBookmark;
     View mSeperateSelectAdd;
     ViewGroup mBookmarksHeader;
+    View mHome;
 
     BrowserBookmarksPage mBookmarks;
     BrowserHistoryPage mHistory;
@@ -125,9 +127,11 @@
         mTabHistory = (TextView) findViewById(R.id.historytab);
         mAddBookmark = (TextView) findViewById(R.id.addbm);
         mSeperateSelectAdd = findViewById(R.id.seperate_select_add);
+        mHome = findViewById(R.id.home);
         mAddBookmark.setOnClickListener(this);
         mTabHistory.setOnClickListener(this);
         mTabBookmarks.setOnClickListener(this);
+        mHome.setOnClickListener(this);
         // Start up the default fragment
         initFragments(mExtras);
         loadFragment(startingFragment, mExtras, false);
@@ -164,11 +168,25 @@
             mUiController.onUrlSelected(BrowserBookmarksPage.getUrl(c), false);
             return true;
         }
+
+        @Override
+        public void onFolderChanged(int level, Uri uri) {
+            // 1 is "bookmarks" root folder
+            if (level <= 1) {
+                mTabs.setVisibility(View.VISIBLE);
+                mBookmarks.setBreadCrumbVisibility(View.INVISIBLE);
+            } else {
+                mTabs.setVisibility(View.GONE);
+                mBookmarks.setBreadCrumbVisibility(View.VISIBLE);
+            }
+        }
     };
 
     private void initFragments(Bundle extras) {
         mBookmarks = BrowserBookmarksPage.newInstance(mBookmarkCallbackWrapper,
                 extras, mBookmarksHeader);
+        mBookmarks.setBreadCrumbMaxVisible(2);
+        mBookmarks.setBreadCrumbUseBackButton(true);
         mHistory = BrowserHistoryPage.newInstance(mUiController, extras);
     }
 
@@ -180,11 +198,15 @@
                 fragment = mBookmarks;
                 mSeperateSelectAdd.setVisibility(View.VISIBLE);
                 mBookmarksHeader.setVisibility(View.VISIBLE);
+                mTabBookmarks.setActivated(true);
+                mTabHistory.setActivated(false);
                 break;
             case FRAGMENT_ID_HISTORY:
                 fragment = mHistory;
                 mBookmarksHeader.setVisibility(View.INVISIBLE);
                 mSeperateSelectAdd.setVisibility(View.INVISIBLE);
+                mTabBookmarks.setActivated(false);
+                mTabHistory.setActivated(true);
                 break;
             default:
                 throw new IllegalArgumentException();
@@ -217,14 +239,12 @@
         } else if (mTabBookmarks == view) {
             if (mCurrentFragment != FRAGMENT_ID_BOOKMARKS) {
                 loadFragment(FRAGMENT_ID_BOOKMARKS, mExtras, true);
-            } else {
-                BreadCrumbView crumbs = mBookmarks.getBreadCrumb();
-                if (crumbs != null) {
-                    crumbs.clear();
-                }
             }
         } else if (mAddBookmark == view) {
             mUiController.bookmarkCurrentPage(mBookmarks.getFolderId());
+        } else if (mHome == view) {
+            BrowserSettings settings = BrowserSettings.getInstance();
+            mUiController.onUrlSelected(settings.getHomePage(), false);
         }
     }
 
diff --git a/src/com/android/browser/ShortcutActivity.java b/src/com/android/browser/ShortcutActivity.java
index 57cb4a7..786c6e1 100644
--- a/src/com/android/browser/ShortcutActivity.java
+++ b/src/com/android/browser/ShortcutActivity.java
@@ -19,6 +19,7 @@
 import android.app.Activity;
 import android.content.Intent;
 import android.database.Cursor;
+import android.net.Uri;
 import android.os.Bundle;
 
 public class ShortcutActivity extends Activity
@@ -33,7 +34,8 @@
         setDefaultKeyMode(DEFAULT_KEYS_SEARCH_LOCAL);
         mBookmarks = BrowserBookmarksPage.newInstance(this, null, null);
         mBookmarks.setEnableContextMenu(false);
-        mBookmarks.setShowRootFolder(true);
+        mBookmarks.setBreadCrumbMaxVisible(2);
+        mBookmarks.setBreadCrumbUseBackButton(true);
         getFragmentManager()
                 .openTransaction()
                 .add(android.R.id.content, mBookmarks)
@@ -64,4 +66,8 @@
             super.onBackPressed();
         }
     }
+
+    @Override
+    public void onFolderChanged(int level, Uri uri) {
+    }
 }