Merge "Import revised translations."
diff --git a/res/layout/bookmark_list.xml b/res/layout/bookmark_list.xml
index 7413ca8..4425a26 100644
--- a/res/layout/bookmark_list.xml
+++ b/res/layout/bookmark_list.xml
@@ -14,29 +14,30 @@
      limitations under the License.
 -->
 
-<LinearLayout
+<com.android.browser.view.BookmarkContainer
     xmlns:android="http://schemas.android.com/apk/res/android"
     android:id="@+id/list_item"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:minHeight="@dimen/widgetItemMinHeight"
-    android:orientation="horizontal"
-    android:paddingLeft="16dip">
+    android:paddingLeft="16dip"
+    android:background="@drawable/bookmark_thumb_selector">
     <ImageView
         android:id="@+id/favicon"
         android:layout_height="32dip"
         android:layout_width="32dip"
-        android:layout_gravity="center_vertical"
+        android:layout_centerVertical="true"
         android:background="@drawable/bookmark_list_favicon_bg"
         android:scaleType="fitXY" />
     <TextView
         android:id="@+id/label"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
-        android:layout_gravity="center_vertical"
+        android:layout_centerVertical="true"
+        android:layout_toRightOf="@id/favicon"
         android:textAppearance="?android:attr/textAppearanceMedium"
         android:paddingLeft="16dip"
         android:maxLines="1"
         android:scrollHorizontally="true"
         android:ellipsize="marquee"/>
-</LinearLayout>
+</com.android.browser.view.BookmarkContainer>
diff --git a/res/layout/bookmarks.xml b/res/layout/bookmarks.xml
index 4a13c6f..e02e2ff 100644
--- a/res/layout/bookmarks.xml
+++ b/res/layout/bookmarks.xml
@@ -31,7 +31,7 @@
     <FrameLayout
         android:layout_width="match_parent"
         android:layout_height="match_parent">
-        <com.android.browser.view.BookmarkExpandableGridView
+        <com.android.browser.view.BookmarkExpandableView
             android:id="@+id/grid"
             android:layout_width="match_parent"
             android:layout_height="match_parent"
@@ -39,15 +39,6 @@
             android:childDivider="@android:color/transparent"
             android:divider="@android:color/transparent"
             android:dividerHeight="0dp" />
-        <ListView
-            android:id="@+id/list"
-            android:layout_width="match_parent"
-            android:layout_height="match_parent"
-            android:listSelector="@drawable/bookmark_thumb_selector"
-            android:drawSelectorOnTop="true"
-            android:focusable="true"
-            android:focusableInTouchMode="true"
-            android:visibility="gone"/>
         <TextView
             android:id="@android:id/empty"
             android:layout_width="wrap_content"
diff --git a/src/com/android/browser/BrowserBookmarksAdapter.java b/src/com/android/browser/BrowserBookmarksAdapter.java
index 16bcda5..b3f8d98 100644
--- a/src/com/android/browser/BrowserBookmarksAdapter.java
+++ b/src/com/android/browser/BrowserBookmarksAdapter.java
@@ -124,6 +124,10 @@
         mCurrentView = view;
     }
 
+    public int getViewMode() {
+        return mCurrentView;
+    }
+
     @Override
     public Cursor getItem(int position) {
         return (Cursor) super.getItem(position);
diff --git a/src/com/android/browser/BrowserBookmarksPage.java b/src/com/android/browser/BrowserBookmarksPage.java
index f2f7de3..b6a50da 100644
--- a/src/com/android/browser/BrowserBookmarksPage.java
+++ b/src/com/android/browser/BrowserBookmarksPage.java
@@ -49,19 +49,17 @@
 import android.view.MenuItem;
 import android.view.View;
 import android.view.ViewGroup;
-import android.webkit.WebIconDatabase.IconListener;
 import android.widget.ExpandableListView;
 import android.widget.ExpandableListView.OnChildClickListener;
 import android.widget.ImageView;
 import android.widget.LinearLayout;
-import android.widget.ListView;
 import android.widget.PopupMenu.OnMenuItemClickListener;
 import android.widget.Toast;
 
 import com.android.browser.BookmarkDragHandler.BookmarkDragController;
 import com.android.browser.BookmarkDragHandler.BookmarkDragState;
-import com.android.browser.view.BookmarkExpandableGridView;
-import com.android.browser.view.BookmarkExpandableGridView.BookmarkContextMenuInfo;
+import com.android.browser.view.BookmarkExpandableView;
+import com.android.browser.view.BookmarkExpandableView.BookmarkContextMenuInfo;
 
 import java.util.HashMap;
 
@@ -76,8 +74,8 @@
  *  View showing the user's bookmarks in the browser.
  */
 public class BrowserBookmarksPage extends Fragment implements View.OnCreateContextMenuListener,
-        LoaderManager.LoaderCallbacks<Cursor>, IconListener,
-        BreadCrumbView.Controller, OnMenuItemClickListener, OnChildClickListener {
+        LoaderManager.LoaderCallbacks<Cursor>, BreadCrumbView.Controller,
+        OnMenuItemClickListener, OnChildClickListener {
 
     public static class ExtraDragState {
         public int childPosition;
@@ -94,14 +92,13 @@
     static final String ACCOUNT_TYPE = "account_type";
     static final String ACCOUNT_NAME = "account_name";
 
-    static final int VIEW_THUMBNAILS = 1;
-    static final int VIEW_LIST = 2;
+    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;
-    BookmarkExpandableGridView mGrid;
-    ListView mList;
+    BookmarkExpandableView mGrid;
     boolean mDisableNewWindow;
     boolean mEnableContextMenu = true;
     View mEmptyView;
@@ -167,7 +164,6 @@
 
     @Override
     public void onLoaderReset(Loader<Cursor> loader) {
-        // TODO: Figure out what to do here (if anything?)
     }
 
     @Override
@@ -326,8 +322,6 @@
         SharedPreferences prefs = PreferenceManager
             .getDefaultSharedPreferences(getActivity());
         mCurrentView = prefs.getInt(PREF_SELECTED_VIEW, getDefaultView());
-        // TODO: Support list view
-        mCurrentView = VIEW_THUMBNAILS;
 
         Bundle args = getArguments();
         mDisableNewWindow = args == null ? false : args.getBoolean(EXTRA_DISABLE_WINDOW, false);
@@ -341,12 +335,10 @@
         mRoot = inflater.inflate(R.layout.bookmarks, container, false);
         mEmptyView = mRoot.findViewById(android.R.id.empty);
 
-        mGrid = (BookmarkExpandableGridView) mRoot.findViewById(R.id.grid);
+        mGrid = (BookmarkExpandableView) mRoot.findViewById(R.id.grid);
         mGrid.setOnChildClickListener(this);
         mGrid.setColumnWidthFromLayout(R.layout.bookmark_thumbnail);
         mGrid.setBreadcrumbController(this);
-        mList = (ListView) mRoot.findViewById(R.id.list);
-        // TODO: mList.setOnItemClickListener(this);
         setEnableContextMenu(mEnableContextMenu);
         mDragHandler = new BookmarkDragHandler(getActivity(), mDragController,
                 mGrid.getDragAdapter());
@@ -355,9 +347,6 @@
         LoaderManager lm = getLoaderManager();
         lm.restartLoader(LOADER_ACCOUNTS, null, this);
 
-        // Add our own listener in case there are favicons that have yet to be loaded.
-        CombinedBookmarkHistoryView.getIconListenerSet().addListener(this);
-
         return mRoot;
     }
 
@@ -378,34 +367,14 @@
             lm.destroyLoader(id);
         }
         mBookmarkAdapters.clear();
-
-        CombinedBookmarkHistoryView.getIconListenerSet().removeListener(this);
-    }
-
-    @Override
-    public void onReceivedIcon(String url, Bitmap icon) {
-        // A new favicon has been loaded, so let anything attached to the adapter know about it
-        // so new icons will be loaded.
-        // TODO: Notify all of data set changed
-        // TODO: Wait, is this even needed? Won't this trigger a DB change anyway?
     }
 
     private BrowserBookmarksAdapter getChildAdapter(int groupPosition) {
-        if (mCurrentView == VIEW_THUMBNAILS) {
-            return mGrid.getChildAdapter(groupPosition);
-        } else {
-            // TODO: Support expandable list
-            return null;
-        }
+        return mGrid.getChildAdapter(groupPosition);
     }
 
     private BreadCrumbView getBreadCrumbs(int groupPosition) {
-        if (mCurrentView == VIEW_THUMBNAILS) {
-            return mGrid.getBreadCrumbs(groupPosition);
-        } else {
-            // TODO: Support expandable list
-            return null;
-        }
+        return mGrid.getBreadCrumbs(groupPosition);
     }
 
     @Override
@@ -566,11 +535,10 @@
     }
 
     void selectView(int view) {
-        // TODO: Support list view
-        view = mCurrentView;
         if (view == mCurrentView) {
             return;
         }
+        mCurrentView = view;
         SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getActivity());
         Editor edit = prefs.edit();
         edit.putInt(PREF_SELECTED_VIEW, mCurrentView);
@@ -578,31 +546,7 @@
         if (mEmptyView.getVisibility() == View.VISIBLE) {
             return;
         }
-        setupBookmarkView();
-    }
-
-    private void setupBookmarkView() {
-        // TODO: Support list view
-//        mAdapter.selectView(mCurrentView);
-//        switch (mCurrentView) {
-//        case VIEW_THUMBNAILS:
-//            mList.setAdapter(null);
-//            SharedPreferences prefs = PreferenceManager
-//                    .getDefaultSharedPreferences(getActivity());
-//            String accountName = prefs.getString(PREF_ACCOUNT_NAME, null);
-//            mGrid.addAccount(accountName, mAdapter);
-//            mGrid.setVisibility(View.VISIBLE);
-//            mList.setVisibility(View.GONE);
-//            break;
-//        case VIEW_LIST:
-//            mGrid.clearAccounts();
-//            if (mList.getAdapter() != mAdapter) {
-//                mList.setAdapter(mAdapter);
-//            }
-//            mGrid.setVisibility(View.GONE);
-//            mList.setVisibility(View.VISIBLE);
-//            break;
-//        }
+        mGrid.selectView(mCurrentView);
     }
 
     /**
@@ -662,14 +606,6 @@
                 mGrid.setLongClickable(false);
             }
         }
-        if (mList != null) {
-            if (mEnableContextMenu) {
-                registerForContextMenu(mList);
-            } else {
-                unregisterForContextMenu(mList);
-                mList.setLongClickable(false);
-            }
-        }
     }
 
     private BookmarkDragController mDragController = new BookmarkDragController() {
@@ -702,11 +638,7 @@
         @Override
         public void actionItemClicked(View v, BookmarkDragState state) {
             if (v.getId() == R.id.info) {
-                if (mCurrentView == VIEW_THUMBNAILS) {
-                    mGrid.showContextMenuForState(state);
-                } else {
-                    // TODO: Support expandable list
-                }
+                mGrid.showContextMenuForState(state);
             } else {
                 ExtraDragState extraState = (ExtraDragState) state.extraState;
                 handleContextItem(v.getId(), extraState.groupPosition,
diff --git a/src/com/android/browser/view/BookmarkExpandableGridView.java b/src/com/android/browser/view/BookmarkExpandableView.java
similarity index 89%
rename from src/com/android/browser/view/BookmarkExpandableGridView.java
rename to src/com/android/browser/view/BookmarkExpandableView.java
index c8811d1..6f5fdaa 100644
--- a/src/com/android/browser/view/BookmarkExpandableGridView.java
+++ b/src/com/android/browser/view/BookmarkExpandableView.java
@@ -38,6 +38,7 @@
 import com.android.browser.BookmarkDragHandler.BookmarkDragState;
 import com.android.browser.BreadCrumbView;
 import com.android.browser.BrowserBookmarksAdapter;
+import com.android.browser.BrowserBookmarksPage;
 import com.android.browser.BrowserBookmarksPage.ExtraDragState;
 import com.android.browser.R;
 import com.android.internal.view.menu.MenuBuilder;
@@ -45,7 +46,7 @@
 import java.util.ArrayList;
 import java.util.HashMap;
 
-public class BookmarkExpandableGridView extends ExpandableListView
+public class BookmarkExpandableView extends ExpandableListView
         implements BreadCrumbView.Controller {
 
     private BookmarkAccountAdapter mAdapter;
@@ -58,18 +59,19 @@
     private BreadCrumbView.Controller mBreadcrumbController;
     private BookmarkDragHandler mDragHandler;
     private int mMaxColumnCount;
+    private int mCurrentView = -1;
 
-    public BookmarkExpandableGridView(Context context) {
+    public BookmarkExpandableView(Context context) {
         super(context);
         init(context);
     }
 
-    public BookmarkExpandableGridView(Context context, AttributeSet attrs) {
+    public BookmarkExpandableView(Context context, AttributeSet attrs) {
         super(context, attrs);
         init(context);
     }
 
-    public BookmarkExpandableGridView(
+    public BookmarkExpandableView(
             Context context, AttributeSet attrs, int defStyle) {
         super(context, attrs, defStyle);
         init(context);
@@ -131,6 +133,9 @@
                 adapter.registerDataSetObserver(mAdapter.mObserver);
             }
         } else {
+            if (mCurrentView >= 0) {
+                adapter.selectView(mCurrentView);
+            }
             mAdapter.mGroups.add(accountName);
             mAdapter.mChildren.add(adapter);
             adapter.registerDataSetObserver(mAdapter.mObserver);
@@ -224,7 +229,7 @@
                 extraState.childPosition,
                 extraState.groupPosition);
         if (getParent() != null) {
-            getParent().showContextMenuForChild(BookmarkExpandableGridView.this);
+            getParent().showContextMenuForChild(BookmarkExpandableView.this);
         }
     }
 
@@ -252,7 +257,7 @@
             int childPosition = (Integer) v.getTag(R.id.child_position);
             long id = (Long) v.getTag(R.id.child_id);
             if (mOnChildClickListener != null) {
-                mOnChildClickListener.onChildClick(BookmarkExpandableGridView.this,
+                mOnChildClickListener.onChildClick(BookmarkExpandableView.this,
                         v, groupPosition, childPosition, id);
             }
         }
@@ -289,6 +294,14 @@
         return mAdapter.getBreadCrumbView(groupPosition);
     }
 
+    public void selectView(int view) {
+        mCurrentView = view;
+        for (BrowserBookmarksAdapter adapter : mAdapter.mChildren) {
+            adapter.selectView(mCurrentView);
+        }
+        mAdapter.notifyDataSetChanged();
+    }
+
     class BookmarkAccountAdapter extends BaseExpandableListAdapter {
         ArrayList<BrowserBookmarksAdapter> mChildren;
         ArrayList<String> mGroups;
@@ -339,17 +352,21 @@
             if (convertView == null) {
                 convertView = mInflater.inflate(R.layout.bookmark_grid_row, parent, false);
             }
-            LinearLayout row = (LinearLayout) convertView;
-            if (row.getChildCount() > mRowCount) {
-                row.removeViews(mRowCount, row.getChildCount() - mRowCount);
+            BrowserBookmarksAdapter childAdapter = mChildren.get(groupPosition);
+            int rowCount = mRowCount;
+            if (childAdapter.getViewMode() == BrowserBookmarksPage.VIEW_LIST) {
+                rowCount = 1;
             }
-            for (int i = 0; i < mRowCount; i++) {
+            LinearLayout row = (LinearLayout) convertView;
+            if (row.getChildCount() > rowCount) {
+                row.removeViews(rowCount, row.getChildCount() - rowCount);
+            }
+            for (int i = 0; i < rowCount; i++) {
                 View cv = null;
                 if (row.getChildCount() > i) {
                     cv = row.getChildAt(i);
                 }
-                int realChildPosition = (childPosition * mRowCount) + i;
-                BrowserBookmarksAdapter childAdapter = mChildren.get(groupPosition);
+                int realChildPosition = (childPosition * rowCount) + i;
                 if (realChildPosition < childAdapter.getCount()) {
                     View v = childAdapter.getView(realChildPosition, cv, row);
                     v.setTag(R.id.group_position, groupPosition);
@@ -378,8 +395,11 @@
 
         @Override
         public int getChildrenCount(int groupPosition) {
-            return (int) Math.ceil(
-                    mChildren.get(groupPosition).getCount() / (float)mRowCount);
+            BrowserBookmarksAdapter adapter = mChildren.get(groupPosition);
+            if (adapter.getViewMode() == BrowserBookmarksPage.VIEW_LIST) {
+                return adapter.getCount();
+            }
+            return (int) Math.ceil(adapter.getCount() / (float)mRowCount);
         }
 
         @Override
@@ -443,7 +463,7 @@
             if (crumbs == null) {
                 crumbs = (BreadCrumbView)
                         mInflater.inflate(R.layout.bookmarks_header, null);
-                crumbs.setController(BookmarkExpandableGridView.this);
+                crumbs.setController(BookmarkExpandableView.this);
                 crumbs.setUseBackButton(true);
                 crumbs.setMaxVisible(2);
                 String bookmarks = mContext.getString(R.string.bookmarks);
@@ -464,6 +484,20 @@
         public boolean isChildSelectable(int groupPosition, int childPosition) {
             return true;
         }
+
+        @Override
+        public int getChildTypeCount() {
+            return 2;
+        }
+
+        @Override
+        public int getChildType(int groupPosition, int childPosition) {
+            BrowserBookmarksAdapter adapter = mChildren.get(groupPosition);
+            if (adapter.getViewMode() == BrowserBookmarksPage.VIEW_LIST) {
+                return 1;
+            }
+            return 0;
+        }
     }
 
     public static class BookmarkContextMenuInfo implements ContextMenuInfo {