Show a remove button for existing bookmarks.

Bug:3222677

Change-Id: Id11585bc68f239a02aa477898f6c00792ad44093
diff --git a/src/com/android/browser/AddBookmarkPage.java b/src/com/android/browser/AddBookmarkPage.java
index 5a55f67..a93a518 100644
--- a/src/com/android/browser/AddBookmarkPage.java
+++ b/src/com/android/browser/AddBookmarkPage.java
@@ -115,6 +115,8 @@
     private long mRootFolder;
     private TextView mTopLevelLabel;
     private Drawable mHeaderIcon;
+    private View mRemoveLink;
+    private View mFakeTitleHolder;
     private static class Folder {
         String Name;
         long Id;
@@ -127,6 +129,7 @@
     // Message IDs
     private static final int SAVE_BOOKMARK = 100;
     private static final int TOUCH_ICON_DOWNLOADED = 101;
+    private static final int BOOKMARK_DELETED = 102;
 
     private Handler mHandler;
 
@@ -194,7 +197,7 @@
         mFolderSelector.setVisibility(View.GONE);
         mDefaultView.setVisibility(View.VISIBLE);
         mCrumbHolder.setVisibility(View.GONE);
-        mFakeTitle.setVisibility(View.VISIBLE);
+        mFakeTitleHolder.setVisibility(View.VISIBLE);
         if (changedFolder) {
             Object data = mCrumbs.getTopData();
             if (data != null) {
@@ -257,6 +260,16 @@
             // can transfer the focus to mFolderNamer.
             imm.focusIn(mListView);
             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);
         }
     }
 
@@ -334,7 +347,7 @@
         mDefaultView.setVisibility(View.GONE);
         mFolderSelector.setVisibility(View.VISIBLE);
         mCrumbHolder.setVisibility(View.VISIBLE);
-        mFakeTitle.setVisibility(View.GONE);
+        mFakeTitleHolder.setVisibility(View.GONE);
         mAddNewFolder.setVisibility(View.VISIBLE);
         mAddSeparator.setVisibility(View.VISIBLE);
     }
@@ -423,6 +436,7 @@
                 if (cursor != null && cursor.moveToFirst()) {
                     // Site is bookmarked.
                     mEditingExisting = true;
+                    showRemoveButton();
                     mFakeTitle.setText(R.string.edit_bookmark);
                     int index = cursor.getColumnIndexOrThrow(
                             BrowserContract.Bookmarks.PARENT);
@@ -603,6 +617,8 @@
                 mFakeTitle.setText(R.string.edit_bookmark);
                 if (mEditingFolder) {
                     findViewById(R.id.row_address).setVisibility(View.GONE);
+                } else {
+                    showRemoveButton();
                 }
             } else {
                 int gravity = mMap.getInt("gravity", -1);
@@ -662,6 +678,8 @@
         mListView.setOnItemClickListener(this);
         mListView.addEditText(mFolderNamer);
 
+        mFakeTitleHolder = findViewById(R.id.title_holder);
+
         if (!window.getDecorView().isInTouchMode()) {
             mButton.requestFocus();
         }
@@ -678,6 +696,13 @@
 
     }
 
+    private void showRemoveButton() {
+        findViewById(R.id.remove_divider).setVisibility(View.VISIBLE);
+        mRemoveLink = findViewById(R.id.remove);
+        mRemoveLink.setVisibility(View.VISIBLE);
+        mRemoveLink.setOnClickListener(this);
+    }
+
     // Called once we have determined which folder is the root folder
     private void onRootFolderFound(long root) {
         mRootFolder = root;
@@ -819,6 +844,9 @@
                                     (Bitmap) b.getParcelable(BrowserContract.Bookmarks.TOUCH_ICON),
                                     (Bitmap) b.getParcelable(BrowserContract.Bookmarks.FAVICON)));
                             break;
+                        case BOOKMARK_DELETED:
+                            finish();
+                            break;
                     }
                 }
             };
diff --git a/src/com/android/browser/BookmarkUtils.java b/src/com/android/browser/BookmarkUtils.java
index b548607..27d3310 100644
--- a/src/com/android/browser/BookmarkUtils.java
+++ b/src/com/android/browser/BookmarkUtils.java
@@ -16,7 +16,10 @@
 
 package com.android.browser;
 
+import android.app.AlertDialog;
+import android.content.ContentUris;
 import android.content.Context;
+import android.content.DialogInterface;
 import android.content.Intent;
 import android.content.SharedPreferences;
 import android.graphics.Bitmap;
@@ -30,6 +33,7 @@
 import android.graphics.Rect;
 import android.graphics.RectF;
 import android.net.Uri;
+import android.os.Message;
 import android.preference.PreferenceManager;
 import android.provider.Browser;
 import android.provider.BrowserContract;
@@ -212,4 +216,42 @@
                 BrowserContract.Bookmarks.PARAM_ACCOUNT_TYPE, accountType);
         return ub;
     }
+
+    /**
+     * Show a confirmation dialog to remove a bookmark.
+     * @param id Id of the bookmark to remove
+     * @param title Title of the bookmark, to be displayed in the confirmation method.
+     * @param context Package Context for strings, dialog, ContentResolver
+     * @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) {
+
+        new AlertDialog.Builder(context)
+                .setTitle(R.string.delete_bookmark)
+                .setIcon(android.R.drawable.ic_dialog_alert)
+                .setMessage(context.getString(R.string.delete_bookmark_warning,
+                        title))
+                .setPositiveButton(R.string.ok,
+                        new DialogInterface.OnClickListener() {
+                            @Override
+                            public void onClick(DialogInterface dialog, int whichButton) {
+                                if (msg != null) {
+                                    msg.sendToTarget();
+                                }
+                                Runnable runnable = new Runnable(){
+                                    @Override
+                                    public void run() {
+                                        Uri uri = ContentUris.withAppendedId(
+                                                BrowserContract.Bookmarks.CONTENT_URI,
+                                                id);
+                                        context.getContentResolver().delete(uri, null, null);
+                                    }
+                                };
+                                new Thread(runnable).start();
+                            }
+                        })
+                .setNegativeButton(R.string.cancel, null)
+                .show();
+    }
 }
diff --git a/src/com/android/browser/BrowserBookmarksPage.java b/src/com/android/browser/BrowserBookmarksPage.java
index ea97c29..d5a5182 100644
--- a/src/com/android/browser/BrowserBookmarksPage.java
+++ b/src/com/android/browser/BrowserBookmarksPage.java
@@ -630,25 +630,10 @@
         // Put up a dialog asking if the user really wants to
         // delete the bookmark
         Cursor cursor = mAdapter.getItem(position);
+        long id = cursor.getLong(BookmarksLoader.COLUMN_INDEX_ID);
+        String title = cursor.getString(BookmarksLoader.COLUMN_INDEX_TITLE);
         Context context = getActivity();
-        final ContentResolver resolver = context.getContentResolver();
-        final Uri uri = ContentUris.withAppendedId(BrowserContract.Bookmarks.CONTENT_URI,
-                cursor.getLong(BookmarksLoader.COLUMN_INDEX_ID));
-
-        new AlertDialog.Builder(context)
-                .setTitle(R.string.delete_bookmark)
-                .setIcon(android.R.drawable.ic_dialog_alert)
-                .setMessage(context.getString(R.string.delete_bookmark_warning,
-                        cursor.getString(BookmarksLoader.COLUMN_INDEX_TITLE)))
-                .setPositiveButton(R.string.ok,
-                        new DialogInterface.OnClickListener() {
-                            @Override
-                            public void onClick(DialogInterface dialog, int whichButton) {
-                                resolver.delete(uri, null, null);
-                            }
-                        })
-                .setNegativeButton(R.string.cancel, null)
-                .show();
+        BookmarkUtils.displayRemoveBookmarkDialog(id, title, context, null);
     }
 
     private String getUrl(int position) {