Browser: change the bookmark UI spec in Browser

Change to just show current directory name, if
there are parent directories, show parent label
before current directory name. Change back button
icon and make it right-align.

CRs-Fixed: 546256

Change-Id: I632d0f6045797bc6032da84870a0570974872bc6
diff --git a/src/com/android/browser/BreadCrumbView.java b/src/com/android/browser/BreadCrumbView.java
index d331b53..c3bff59 100644
--- a/src/com/android/browser/BreadCrumbView.java
+++ b/src/com/android/browser/BreadCrumbView.java
@@ -28,6 +28,7 @@
 import android.widget.ImageButton;
 import android.widget.ImageView;
 import android.widget.LinearLayout;
+import android.widget.RelativeLayout;
 import android.widget.TextView;
 
 import java.util.ArrayList;
@@ -38,7 +39,7 @@
  * Use setController to receive callbacks from user interactions
  * Use pushView, popView, clear, and getTopData to change/access the view stack
  */
-public class BreadCrumbView extends LinearLayout implements OnClickListener {
+public class BreadCrumbView extends RelativeLayout implements OnClickListener {
     private static final int DIVIDER_PADDING = 12; // dips
     private static final int CRUMB_PADDING = 8; // dips
 
@@ -47,6 +48,8 @@
     }
 
     private ImageButton mBackButton;
+    private LinearLayout mCrumbLayout;
+    private LinearLayout mBackLayout;
     private Controller mController;
     private List<Crumb> mCrumbs;
     private boolean mUseBackButton;
@@ -86,6 +89,7 @@
     private void init(Context ctx) {
         mContext = ctx;
         setFocusable(true);
+        setGravity(Gravity.CENTER_VERTICAL);
         mUseBackButton = false;
         mCrumbs = new ArrayList<Crumb>();
         TypedArray a = mContext.obtainStyledAttributes(com.android.internal.R.styleable.Theme);
@@ -94,7 +98,8 @@
         float density = mContext.getResources().getDisplayMetrics().density;
         mDividerPadding = DIVIDER_PADDING * density;
         mCrumbPadding = (int) (CRUMB_PADDING * density);
-        addBackButton();
+        addCrumbLayout();
+        addBackLayout();
     }
 
     public void setUseBackButton(boolean useflag) {
@@ -169,27 +174,61 @@
 
     private void addBackButton() {
         mBackButton = new ImageButton(mContext);
-        mBackButton.setImageResource(R.drawable.ic_back_hierarchy_holo_dark);
+        mBackButton.setImageResource(R.drawable.icon_up);
         TypedValue outValue = new TypedValue();
         getContext().getTheme().resolveAttribute(
                 android.R.attr.selectableItemBackground, outValue, true);
         int resid = outValue.resourceId;
         mBackButton.setBackgroundResource(resid);
+        mBackButton.setPadding(mCrumbPadding, 0, mCrumbPadding, 0);
         mBackButton.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT,
                 LayoutParams.MATCH_PARENT));
         mBackButton.setOnClickListener(this);
-        mBackButton.setVisibility(View.GONE);
         mBackButton.setContentDescription(mContext.getText(
                 R.string.accessibility_button_bookmarks_folder_up));
-        addView(mBackButton, 0);
+        mBackLayout.addView(mBackButton);
+    }
+
+    private void addParentLabel() {
+        TextView tv = new TextView(mContext);
+        tv.setTextAppearance(mContext, android.R.style.TextAppearance_Medium);
+        tv.setPadding(mCrumbPadding, 0, 0, 0);
+        tv.setGravity(Gravity.CENTER_VERTICAL);
+        tv.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT,
+                LayoutParams.WRAP_CONTENT));
+        tv.setText("/ .../");
+        tv.setSingleLine();
+        tv.setVisibility(View.GONE);
+        mCrumbLayout.addView(tv);
+    }
+
+    private void addCrumbLayout() {
+        mCrumbLayout = new LinearLayout(mContext);
+        LayoutParams params = new LayoutParams(LayoutParams.WRAP_CONTENT,
+                LayoutParams.WRAP_CONTENT);
+        params.addRule(ALIGN_PARENT_LEFT, TRUE);
+        params.setMargins(0, 0, 4 * mCrumbPadding, 0);
+        mCrumbLayout.setLayoutParams(params);
+        mCrumbLayout.setVisibility(View.VISIBLE);
+        addParentLabel();
+        addView(mCrumbLayout);
+    }
+
+    private void addBackLayout() {
+        mBackLayout= new LinearLayout(mContext);
+        LayoutParams params = new LayoutParams(LayoutParams.WRAP_CONTENT,
+                LayoutParams.WRAP_CONTENT);
+        params.addRule(ALIGN_PARENT_RIGHT, TRUE);
+        mBackLayout.setLayoutParams(params);
+        mBackLayout.setVisibility(View.GONE);
+        addSeparator();
+        addBackButton();
+        addView(mBackLayout);
     }
 
     private void pushCrumb(Crumb crumb) {
-        if (mCrumbs.size() > 0) {
-            addSeparator();
-        }
         mCrumbs.add(crumb);
-        addView(crumb.crumbView);
+        mCrumbLayout.addView(crumb.crumbView);
         updateVisible();
         crumb.crumbView.setOnClickListener(this);
     }
@@ -197,7 +236,7 @@
     private void addSeparator() {
         View sep = makeDividerView();
         sep.setLayoutParams(makeDividerLayoutParams());
-        addView(sep);
+        mBackLayout.addView(sep);
     }
 
     private ImageView makeDividerView() {
@@ -207,11 +246,9 @@
         return result;
     }
 
-    private LayoutParams makeDividerLayoutParams() {
-        LayoutParams params = new LayoutParams(LayoutParams.WRAP_CONTENT,
-                LayoutParams.MATCH_PARENT);
-        params.topMargin = (int) mDividerPadding;
-        params.bottomMargin = (int) mDividerPadding;
+    private LinearLayout.LayoutParams makeDividerLayoutParams() {
+        LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
+                LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT);
         return params;
     }
 
@@ -219,17 +256,13 @@
         int n = mCrumbs.size();
         if (n > 0) {
             removeLastView();
-            if (!mUseBackButton || (n > 1)) {
-                // remove separator
-                removeLastView();
-            }
             mCrumbs.remove(n - 1);
             if (mUseBackButton) {
                 Crumb top = getTopCrumb();
                 if (top != null && top.canGoBack) {
-                    mBackButton.setVisibility(View.VISIBLE);
+                    mBackLayout.setVisibility(View.VISIBLE);
                 } else {
-                    mBackButton.setVisibility(View.GONE);
+                    mBackLayout.setVisibility(View.GONE);
                 }
             }
             updateVisible();
@@ -240,7 +273,7 @@
     }
 
     private void updateVisible() {
-        // start at index 1 (0 == back button)
+        // start at index 1 (0 == parent label)
         int childIndex = 1;
         if (mMaxVisible >= 0) {
             int invisibleCrumbs = size() - mMaxVisible;
@@ -248,22 +281,16 @@
                 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);
-                    }
+                    mCrumbLayout.getChildAt(childIndex).setVisibility(View.GONE);
                     childIndex++;
                     // Move to the next crumb.
                     crumbIndex++;
                 }
             }
-            // Make sure the last two are visible.
-            int childCount = getChildCount();
+            // Make sure the last is visible.
+            int childCount = mCrumbLayout.getChildCount();
             while (childIndex < childCount) {
-                getChildAt(childIndex).setVisibility(View.VISIBLE);
+                mCrumbLayout.getChildAt(childIndex).setVisibility(View.VISIBLE);
                 childIndex++;
             }
         } else {
@@ -274,16 +301,21 @@
         }
         if (mUseBackButton) {
             boolean canGoBack = getTopCrumb() != null ? getTopCrumb().canGoBack : false;
-            mBackButton.setVisibility(canGoBack ? View.VISIBLE : View.GONE);
+            mBackLayout.setVisibility(canGoBack ? View.VISIBLE : View.GONE);
+            if (canGoBack) {
+                mCrumbLayout.getChildAt(0).setVisibility(VISIBLE);
+            } else {
+                mCrumbLayout.getChildAt(0).setVisibility(GONE);
+            }
         } else {
-            mBackButton.setVisibility(View.GONE);
+            mBackLayout.setVisibility(View.GONE);
         }
     }
 
     private void removeLastView() {
-        int ix = getChildCount();
+        int ix = mCrumbLayout.getChildCount();
         if (ix > 0) {
-            removeViewAt(ix-1);
+            mCrumbLayout.removeViewAt(ix-1);
         }
     }