Browser bookmark cleanup

- Option to remove bookmark on clicking "star"
  button
- Add bookmark dialog look cleanup
- Hide "account" in "add bookmark dialog" if only
  one account

Change-Id: I42fd4d54f119bb3bcdb784fd2f6f58570d019eee
diff --git a/src/com/android/browser/AddBookmarkFolder.java b/src/com/android/browser/AddBookmarkFolder.java
index b468da2..faff027 100644
--- a/src/com/android/browser/AddBookmarkFolder.java
+++ b/src/com/android/browser/AddBookmarkFolder.java
@@ -638,7 +638,7 @@
         mAddSeparator.setVisibility(View.GONE);
 
         mCrumbs = (BreadCrumbView) findViewById(R.id.crumbs);
-        mCrumbs.setUseBackButton(true);
+        //mCrumbs.setUseBackButton(true);
         mCrumbs.setController(this);
         mHeaderIcon = getResources().getDrawable(R.drawable.ic_deco_folder_normal);
         mCrumbHolder = findViewById(R.id.crumb_holder);
diff --git a/src/com/android/browser/AddBookmarkPage.java b/src/com/android/browser/AddBookmarkPage.java
index a50a7d6..ef462bc 100644
--- a/src/com/android/browser/AddBookmarkPage.java
+++ b/src/com/android/browser/AddBookmarkPage.java
@@ -103,6 +103,7 @@
     private EditText    mAddress;
     private TextView    mButton;
     private View        mCancelButton;
+    private View        mDeleteButton;
     private boolean     mEditingExisting;
     private boolean     mEditingFolder;
     private Bundle      mMap;
@@ -314,6 +315,8 @@
             } else {
                 finish();
             }
+        } else if (v == mDeleteButton || v == mRemoveLink) {
+            onDeleteWithConfirm();
         } else if (v == mFolderCancel) {
             completeOrCancelFolderNaming(true);
         } else if (v == mAddNewFolder) {
@@ -330,16 +333,6 @@
             Class[] type = new Class[] {View.class};
             ReflectHelper.invokeMethod(imm, "focusIn", type, params);
             imm.showSoftInput(mFolderNamer, InputMethodManager.SHOW_IMPLICIT);
-        } else if (v == mRemoveLink) {
-            if (!mEditingExisting) {
-                throw new AssertionError("Remove button should not be shown for"
-                        + " new bookmarks");
-            }
-            long id = mMap.getLong(BrowserContract.Bookmarks._ID);
-            createHandler();
-            Message msg = Message.obtain(mHandler, BOOKMARK_DELETED);
-            BookmarkUtils.displayRemoveBookmarkDialog(id,
-                    mTitle.getText().toString(), this, msg);
         }
     }
 
@@ -546,6 +539,14 @@
                 while (cursor.moveToNext()) {
                     mAccountAdapter.add(new BookmarkAccount(this, cursor));
                 }
+
+                if (cursor.getCount() < 2) {
+                    View accountView = findViewById(R.id.row_account);
+                    if (accountView != null) {
+                        accountView.setVisibility(View.GONE);
+                    }
+                }
+
                 getLoaderManager().destroyLoader(LOADER_ID_ACCOUNTS);
                 getLoaderManager().restartLoader(LOADER_ID_EDIT_INFO, null,
                         mEditInfoLoaderCallbacks);
@@ -660,6 +661,10 @@
         mTouchIconUrl = null;
 
         mFakeTitle = (TextView) findViewById(R.id.fake_title);
+
+        mDeleteButton = findViewById(R.id.delete);
+        mDeleteButton.setOnClickListener(this);
+
         if (mMap != null) {
             Bundle b = mMap.getBundle(EXTRA_EDIT_BOOKMARK);
             if (b != null) {
@@ -691,6 +696,7 @@
                     title = title.substring(0, MAX_TITLE_LENGTH);
                 }
             }
+
         }
 
         mTitle = (EditText) findViewById(R.id.title);
@@ -731,7 +737,7 @@
         mAddSeparator = findViewById(R.id.add_divider);
 
         mCrumbs = (BreadCrumbView) findViewById(R.id.crumbs);
-        mCrumbs.setUseBackButton(true);
+        //mCrumbs.setUseBackButton(true);
         mCrumbs.setController(this);
         mHeaderIcon = getResources().getDrawable(R.drawable.ic_deco_folder_normal);
         mCrumbHolder = findViewById(R.id.crumb_holder);
@@ -769,6 +775,7 @@
     }
 
     private void showRemoveButton() {
+        mDeleteButton.setVisibility(View.VISIBLE);
         findViewById(R.id.remove_divider).setVisibility(View.VISIBLE);
         mRemoveLink = findViewById(R.id.remove);
         mRemoveLink.setVisibility(View.VISIBLE);
@@ -909,6 +916,52 @@
         context.getContentResolver().delete(uri, null, null);
     }
 
+    private void onDeleteWithConfirm() {
+        final String title = mTitle.getText().toString().trim();
+        final String unfilteredUrl = UrlUtils.fixUrl(mAddress.getText().toString());
+        final String url = unfilteredUrl.trim();
+        new AlertDialog.Builder(this)
+                .setIconAttribute(android.R.attr.alertDialogIcon)
+                .setMessage(getString(R.string.delete_bookmark_warning, title))
+                .setNegativeButton(android.R.string.cancel, null)
+                .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
+                    public void onClick(DialogInterface dialog, int which) {
+                        ContentResolver cr = getContentResolver();
+                        Cursor cursor = cr.query(BrowserContract.Bookmarks.CONTENT_URI,
+                                BookmarksLoader.PROJECTION,
+                                "title = ? OR url = ?",
+                                new String[] {
+                                        title, url
+                                },
+                                null);
+
+                        if (cursor == null) {
+                            finish();
+                            return;
+                        }
+
+                        try {
+                            if (cursor.moveToFirst()) {
+                                do {
+                                    long index = cursor.getLong(
+                                            cursor.getColumnIndex(BrowserContract.Bookmarks._ID));
+                                    cr.delete(ContentUris.withAppendedId(
+                                            BrowserContract.Bookmarks.CONTENT_URI, index),
+                                            null, null);
+                                } while (cursor.moveToNext());
+                            }
+                        } catch (IllegalStateException e) {
+                            e.printStackTrace();
+                        } finally {
+                            if (cursor != null)
+                                cursor.close();
+                        }
+                        finish();
+                    }
+                })
+                .show();
+    }
+
     private void onSaveWithConfirm() {
         String title = mTitle.getText().toString().trim();
         String unfilteredUrl = UrlUtils.fixUrl(mAddress.getText().toString());
diff --git a/src/com/android/browser/BookmarkUtils.java b/src/com/android/browser/BookmarkUtils.java
index 0bce3c2..335a352 100644
--- a/src/com/android/browser/BookmarkUtils.java
+++ b/src/com/android/browser/BookmarkUtils.java
@@ -235,12 +235,13 @@
      * @param msg Message to send if the bookmark is deleted.
      */
     static void displayRemoveBookmarkDialog( final long id, final String title,
-            final Context context, final Message msg) {
+            final Context context, final Message msg, boolean is_folder) {
 
         new AlertDialog.Builder(context)
                 .setIconAttribute(android.R.attr.alertDialogIcon)
-                .setMessage(context.getString(R.string.delete_bookmark_warning,
-                        title))
+                .setMessage(is_folder ?
+                        context.getString(R.string.delete_folder_warning, title) :
+                        context.getString(R.string.delete_bookmark_warning, title))
                 .setPositiveButton(R.string.ok,
                         new DialogInterface.OnClickListener() {
                             @Override
@@ -248,7 +249,7 @@
                                 if (msg != null) {
                                     msg.sendToTarget();
                                 }
-                                Runnable runnable = new Runnable(){
+                                Runnable runnable = new Runnable() {
                                     @Override
                                     public void run() {
                                         removeBookmarkOrFolder(context, id);
diff --git a/src/com/android/browser/BreadCrumbView.java b/src/com/android/browser/BreadCrumbView.java
index 0cd8226..1501d21 100644
--- a/src/com/android/browser/BreadCrumbView.java
+++ b/src/com/android/browser/BreadCrumbView.java
@@ -60,6 +60,7 @@
     private int mMaxVisible = -1;
     private Context mContext;
     private int mCrumbPadding;
+    private TextView mOverflowView;
 
     /**
      * @param context
@@ -164,6 +165,16 @@
         return crumb.crumbView;
     }
 
+    public void addOverflowLabel(TextView view) {
+        mOverflowView = view;
+        if (view != null) {
+            view.setTextAppearance(mContext, R.style.BookmarkPathText);
+            view.setPadding(mCrumbPadding, 0, mCrumbPadding, 0);
+            view.setGravity(Gravity.CENTER_VERTICAL);
+            view.setText("... >");
+        }
+    }
+
     public void pushView(View view, Object data) {
         Crumb crumb = new Crumb(view, true, data);
         pushCrumb(crumb);
@@ -211,7 +222,7 @@
         params.setMargins(0, 0, 4 * mCrumbPadding, 0);
         mCrumbLayout.setLayoutParams(params);
         mCrumbLayout.setVisibility(View.VISIBLE);
-        addParentLabel();
+        //addParentLabel();
         addView(mCrumbLayout);
     }
 
@@ -275,11 +286,15 @@
 
     private void updateVisible() {
         // start at index 1 (0 == parent label)
-        int childIndex = 1;
+        int childIndex = 0;
         if (mMaxVisible >= 0) {
             int invisibleCrumbs = size() - mMaxVisible;
             if (invisibleCrumbs > 0) {
                 int crumbIndex = 0;
+                if (mOverflowView != null) {
+                    mOverflowView.setVisibility(VISIBLE);
+                    mOverflowView.setOnClickListener(this);
+                }
                 while (crumbIndex < invisibleCrumbs) {
                     // Set the crumb to GONE.
                     mCrumbLayout.getChildAt(childIndex).setVisibility(View.GONE);
@@ -287,6 +302,10 @@
                     // Move to the next crumb.
                     crumbIndex++;
                 }
+            } else {
+                if (mOverflowView != null) {
+                    mOverflowView.setVisibility(GONE);
+                }
             }
             // Make sure the last is visible.
             int childCount = mCrumbLayout.getChildCount();
@@ -333,6 +352,13 @@
         if (mBackButton == v) {
             popView();
             notifyController();
+        } else if (mOverflowView == v) {
+            int maxVisible = getMaxVisible();
+            while (maxVisible > 0) {
+                pop(false);
+                maxVisible--;
+            }
+            notifyController();
         } else {
             // pop until view matches crumb view
             while (v != getTopCrumb().crumbView) {
@@ -397,10 +423,10 @@
 
         private TextView makeCrumbView(String name) {
             TextView tv = new TextView(mContext);
-            tv.setTextAppearance(mContext, R.style.BookmarkText);
+            tv.setTextAppearance(mContext, R.style.BookmarkPathText);
             tv.setPadding(mCrumbPadding, 0, mCrumbPadding, 0);
             tv.setGravity(Gravity.CENTER_VERTICAL);
-            tv.setText(name);
+            tv.setText(name + " >");
             tv.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT,
                     LayoutParams.MATCH_PARENT));
             tv.setSingleLine();
diff --git a/src/com/android/browser/BrowserBookmarksPage.java b/src/com/android/browser/BrowserBookmarksPage.java
index 59d4a68..935bdc6 100644
--- a/src/com/android/browser/BrowserBookmarksPage.java
+++ b/src/com/android/browser/BrowserBookmarksPage.java
@@ -723,7 +723,8 @@
         long id = cursor.getLong(BookmarksLoader.COLUMN_INDEX_ID);
         String title = cursor.getString(BookmarksLoader.COLUMN_INDEX_TITLE);
         Context context = getActivity();
-        BookmarkUtils.displayRemoveBookmarkDialog(id, title, context, null);
+        BookmarkUtils.displayRemoveBookmarkDialog(id, title, context, null,
+                (cursor.getInt(BookmarksLoader.COLUMN_INDEX_IS_FOLDER) == 1));
     }
 
     private String getUrl(BrowserBookmarksAdapter adapter, int position) {
diff --git a/src/com/android/browser/Controller.java b/src/com/android/browser/Controller.java
index 5c6a9b8..6337237 100644
--- a/src/com/android/browser/Controller.java
+++ b/src/com/android/browser/Controller.java
@@ -261,6 +261,8 @@
     private PowerConnectionReceiver mLowPowerReceiver;
     private PowerConnectionReceiver mPowerChangeReceiver;
 
+    private boolean mCurrentPageBookmarked;
+
     public Controller(Activity browser) {
         mActivity = browser;
         mSettings = BrowserSettings.getInstance();
@@ -1947,7 +1949,8 @@
 
         String title = w.getTitle();
         String url = w.getUrl();
-        if (title != null && url != null && lookupBookmark(title, url) > 0) {
+        mCurrentPageBookmarked = (lookupBookmark(title, url) > 0);
+        if (title != null && url != null && mCurrentPageBookmarked) {
             bookmark_icon.setChecked(true);
         } else {
             bookmark_icon.setChecked(false);
@@ -2348,7 +2351,7 @@
             WebView w = getCurrentTopWebView();
             if (w == null)
                 return;
-            final Intent i = createBookmarkCurrentPageIntent(false);
+            final Intent i = createBookmarkCurrentPageIntent(mCurrentPageBookmarked);
             mActivity.startActivity(i);
         }
     }
diff --git a/src/com/android/browser/view/BookmarkExpandableView.java b/src/com/android/browser/view/BookmarkExpandableView.java
index 5e68565..3ed000c 100644
--- a/src/com/android/browser/view/BookmarkExpandableView.java
+++ b/src/com/android/browser/view/BookmarkExpandableView.java
@@ -82,6 +82,9 @@
                 .getInteger(R.integer.max_bookmark_columns);
         setScrollBarStyle(SCROLLBARS_OUTSIDE_OVERLAY);
         mAdapter = new BookmarkAccountAdapter(mContext);
+        if (mAdapter.getGroupCount() < 2) {
+            setGroupIndicator(null);
+        }
         super.setAdapter(mAdapter);
     }
 
@@ -251,6 +254,10 @@
 
         @Override
         public void onClick(View v) {
+            if (mAdapter.getGroupCount() < 2) {
+                return;
+            }
+
             int groupPosition = (Integer) v.getTag(R.id.group_position);
             if (isGroupExpanded(groupPosition)) {
                 collapseGroup(groupPosition);
@@ -402,6 +409,7 @@
                 View view, ViewGroup parent) {
             if (view == null) {
                 view = mInflater.inflate(R.layout.bookmark_group_view, parent, false);
+                view.setEnabled(false);
                 view.setOnClickListener(mGroupOnClickListener);
             }
             view.setTag(R.id.group_position, groupPosition);
@@ -411,13 +419,19 @@
             if (crumbs.getParent() != null) {
                 ((ViewGroup)crumbs.getParent()).removeView(crumbs);
             }
+            crumbs.setVisibility(VISIBLE);
             crumbHolder.addView(crumbs);
+
+            TextView overflowView = (TextView) view.findViewById(R.id.crumb_overflow);
+            crumbs.addOverflowLabel(overflowView);
+/*
             TextView name = (TextView) view.findViewById(R.id.group_name);
             String groupName = mGroups.get(groupPosition);
             if (groupName == null) {
-                groupName = mContext.getString(R.string.local_bookmarks);
+                groupName = mContext.getString(R.string.bookmarks);
             }
             name.setText(groupName);
+*/
             return view;
         }
 
@@ -427,8 +441,8 @@
                 crumbs = (BreadCrumbView)
                         mInflater.inflate(R.layout.bookmarks_header, null);
                 crumbs.setController(BookmarkExpandableView.this);
-                crumbs.setUseBackButton(true);
-                crumbs.setMaxVisible(1);
+                //crumbs.setUseBackButton(true);
+                crumbs.setMaxVisible(2);
                 String bookmarks = mContext.getString(R.string.bookmarks);
                 crumbs.pushView(bookmarks, false,
                         BrowserContract.Bookmarks.CONTENT_URI_DEFAULT_FOLDER);