| Index: chrome/android/java_staging/src/org/chromium/chrome/browser/enhancedbookmarks/EnhancedBookmarkDetailActivity.java | 
| diff --git a/chrome/android/java_staging/src/org/chromium/chrome/browser/enhancedbookmarks/EnhancedBookmarkDetailActivity.java b/chrome/android/java_staging/src/org/chromium/chrome/browser/enhancedbookmarks/EnhancedBookmarkDetailActivity.java | 
| deleted file mode 100644 | 
| index 6574749dcc08b3e911d00ade11f5b74f15f45b39..0000000000000000000000000000000000000000 | 
| --- a/chrome/android/java_staging/src/org/chromium/chrome/browser/enhancedbookmarks/EnhancedBookmarkDetailActivity.java | 
| +++ /dev/null | 
| @@ -1,389 +0,0 @@ | 
| -// Copyright 2015 The Chromium Authors. All rights reserved. | 
| -// Use of this source code is governed by a BSD-style license that can be | 
| -// found in the LICENSE file. | 
| - | 
| -package org.chromium.chrome.browser.enhancedbookmarks; | 
| - | 
| -import android.animation.Animator; | 
| -import android.animation.AnimatorListenerAdapter; | 
| -import android.animation.ObjectAnimator; | 
| -import android.annotation.TargetApi; | 
| -import android.content.Context; | 
| -import android.graphics.Bitmap; | 
| -import android.os.Build; | 
| -import android.os.Bundle; | 
| -import android.text.Editable; | 
| -import android.text.TextWatcher; | 
| -import android.transition.Fade; | 
| -import android.transition.Transition; | 
| -import android.view.View; | 
| -import android.view.ViewGroup; | 
| -import android.view.inputmethod.InputMethodManager; | 
| -import android.widget.EditText; | 
| -import android.widget.ImageButton; | 
| -import android.widget.ImageView; | 
| -import android.widget.LinearLayout; | 
| -import android.widget.RelativeLayout; | 
| -import android.widget.TextView; | 
| - | 
| -import org.chromium.base.ApiCompatibilityUtils; | 
| -import org.chromium.chrome.R; | 
| -import org.chromium.chrome.browser.BookmarksBridge.BookmarkItem; | 
| -import org.chromium.chrome.browser.BookmarksBridge.BookmarkModelObserver; | 
| -import org.chromium.chrome.browser.UrlUtilities; | 
| -import org.chromium.chrome.browser.enhanced_bookmarks.EnhancedBookmarksBridge.SalientImageCallback; | 
| -import org.chromium.chrome.browser.enhanced_bookmarks.EnhancedBookmarksModel; | 
| -import org.chromium.chrome.browser.enhancedbookmarks.EnhancedBookmarkDetailScrollView.OnScrollListener; | 
| -import org.chromium.chrome.browser.widget.FadingShadow; | 
| -import org.chromium.chrome.browser.widget.FadingShadowView; | 
| -import org.chromium.components.bookmarks.BookmarkId; | 
| -import org.chromium.components.bookmarks.BookmarkType; | 
| -import org.chromium.ui.UiUtils; | 
| -import org.chromium.ui.base.DeviceFormFactor; | 
| - | 
| -/** | 
| - * Dialog to show details of the selected bookmark. It has two modes: read-only mode and editing | 
| - * mode. Clicking on a textview will make the dialog animate to editing mode. On a handset this | 
| - * dialog will be full-screen; on tablet it will be a fixed-size dialog popping up in the middle of | 
| - * the screen. | 
| - */ | 
| -public class EnhancedBookmarkDetailActivity extends EnhancedBookmarkActivityBase implements | 
| -        View.OnClickListener, OnScrollListener { | 
| -    public static final String INTENT_BOOKMARK_ID = "EnhancedBookmarkDetailActivity.BookmarkId"; | 
| -    private static final int ANIMATION_DURATION_MS = 300; | 
| - | 
| -    private EnhancedBookmarksModel mEnhancedBookmarksModel; | 
| -    private BookmarkId mBookmarkId; | 
| - | 
| -    private EnhancedBookmarkDetailScrollView mScrollView; | 
| -    private LinearLayout mContentLayout; | 
| -    private ImageView mImageView; | 
| -    private EditText mTitleEditText; | 
| -    private EditText mUrlEditText; | 
| -    private View mFolderBox; | 
| -    private TextView mFolderTextView; | 
| -    private EditText mDescriptionEditText; | 
| -    private View mMaskView; | 
| -    private RelativeLayout mActionBarLayout; | 
| -    private ImageButton mCloseButton; | 
| -    private ImageButton mDeleteButton; | 
| -    private ImageButton mSaveButton; | 
| -    private FadingShadowView mImageShadowMask; | 
| -    private FadingShadowView mShadow; | 
| -    private View mBottomSpacer; | 
| -    private EditText[] mEditTexts; | 
| - | 
| -    private Animator mCurrentAnimator; | 
| -    private int mDominantColor; | 
| - | 
| -    private BookmarkModelObserver mBookmarkModelObserver = new BookmarkModelObserver() { | 
| -        @Override | 
| -        public void bookmarkNodeRemoved(BookmarkItem parent, int oldIndex, BookmarkItem node, | 
| -                boolean isDoingExtensiveChanges) { | 
| -            if (mBookmarkId.equals(node.getId())) { | 
| -                dismiss(); | 
| -            } | 
| -        } | 
| - | 
| -        @Override | 
| -        public void bookmarkNodeMoved(BookmarkItem oldParent, int oldIndex, BookmarkItem newParent, | 
| -                int newIndex) { | 
| -            BookmarkId movedBookmark = mEnhancedBookmarksModel.getChildAt(newParent.getId(), | 
| -                    newIndex); | 
| -            if (movedBookmark.equals(mBookmarkId)) { | 
| -                setParentFolderName(newParent.getId()); | 
| -            } | 
| -        } | 
| - | 
| -        @Override | 
| -        public void bookmarkNodeChanged(BookmarkItem node) { | 
| -            if (mBookmarkId.equals(node.getId())) updateViews(node); | 
| -        } | 
| - | 
| -        @Override | 
| -        public void bookmarkModelChanged() { | 
| -        } | 
| -    }; | 
| - | 
| -    @Override | 
| -    public void onCreate(Bundle savedInstanceState) { | 
| -        super.onCreate(savedInstanceState); | 
| -        EnhancedBookmarkUtils.setTaskDescriptionInDocumentMode(this, | 
| -                getString(R.string.accessibility_enhanced_bookmark_detail_view)); | 
| -        mEnhancedBookmarksModel = new EnhancedBookmarksModel(); | 
| -        mBookmarkId = BookmarkId.getBookmarkIdFromString( | 
| -                getIntent().getStringExtra(INTENT_BOOKMARK_ID)); | 
| -        mEnhancedBookmarksModel.addModelObserver(mBookmarkModelObserver); | 
| -        setContentView(R.layout.eb_detail); | 
| -        mScrollView = (EnhancedBookmarkDetailScrollView) findViewById( | 
| -                R.id.eb_detail_scroll_view); | 
| -        mContentLayout = (LinearLayout) findViewById(R.id.eb_detail_content); | 
| -        mImageView = (ImageView) findViewById(R.id.eb_detail_image_view); | 
| -        mTitleEditText = (EditText) findViewById(R.id.eb_detail_title); | 
| -        mUrlEditText = (EditText) findViewById(R.id.eb_detail_url); | 
| -        mFolderBox = findViewById(R.id.eb_detail_folder_box); | 
| -        mFolderTextView = (TextView) findViewById(R.id.eb_detail_folder_textview); | 
| -        mDescriptionEditText = (EditText) findViewById(R.id.eb_detail_description); | 
| -        mMaskView = findViewById(R.id.eb_detail_image_mask); | 
| -        mActionBarLayout = (RelativeLayout) findViewById(R.id.eb_detail_action_bar); | 
| -        mSaveButton = (ImageButton) findViewById(R.id.eb_detail_actionbar_save_button); | 
| -        mDeleteButton = (ImageButton) findViewById(R.id.eb_detail_actionbar_delete_button); | 
| -        mCloseButton = (ImageButton) findViewById(R.id.eb_detail_actionbar_close_button); | 
| -        mImageShadowMask = (FadingShadowView) findViewById(R.id.eb_detail_top_shadow); | 
| -        mShadow = (FadingShadowView) findViewById(R.id.eb_detail_shadow); | 
| -        mBottomSpacer = mScrollView.findViewById(R.id.bottom_spacer); | 
| -        mEditTexts = new EditText[]{mTitleEditText, mUrlEditText, mDescriptionEditText}; | 
| - | 
| -        // Listen to click event of EditTexts while setting them not focusable in order to | 
| -        // postpone showing soft keyboard until animations are finished. | 
| -        for (EditText editText : mEditTexts) editText.setOnClickListener(this); | 
| -        clearErrorWhenNonEmpty(mEditTexts); | 
| -        int shadowColor = getResources().getColor( | 
| -                R.color.enhanced_bookmark_detail_dialog_shadow_color); | 
| -        mShadow.init(shadowColor, FadingShadow.POSITION_TOP); | 
| -        mImageShadowMask.init(shadowColor, FadingShadow.POSITION_TOP); | 
| -        mImageShadowMask.setStrength(1.0f); | 
| - | 
| -        mSaveButton.setOnClickListener(this); | 
| -        mDeleteButton.setOnClickListener(this); | 
| -        mCloseButton.setOnClickListener(this); | 
| -        mFolderBox.setOnClickListener(this); | 
| - | 
| -        mScrollView.setOnScrollListener(this); | 
| - | 
| -        updateViews(); | 
| -        setUpSharedElementAnimation(); | 
| -    } | 
| - | 
| -    @TargetApi(Build.VERSION_CODES.LOLLIPOP) | 
| -    private void setUpSharedElementAnimation() { | 
| -        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) return; | 
| -        Transition t = new Fade(); | 
| -        // Exlude status bar and navigation bar, to work around an Android bug that white background | 
| -        // activity will cause these two bars blink/flash during content transition. | 
| -        t.excludeTarget(android.R.id.statusBarBackground, true); | 
| -        t.excludeTarget(android.R.id.navigationBarBackground, true); | 
| -        getWindow().setEnterTransition(t); | 
| -        getWindow().setExitTransition(t); | 
| -    } | 
| - | 
| -    /** | 
| -     * Hides soft keyboard and finishes Activity. | 
| -     */ | 
| -    private void dismiss() { | 
| -        UiUtils.hideKeyboard(mContentLayout); | 
| -        ApiCompatibilityUtils.finishAfterTransition(this); | 
| -    } | 
| - | 
| -    @Override | 
| -    public void onBackPressed() { | 
| -        onClick(mCloseButton); | 
| -    } | 
| - | 
| -    private void updateViews() { | 
| -        BookmarkItem bookmarkItem = mEnhancedBookmarksModel.getBookmarkById(mBookmarkId); | 
| -        updateViews(bookmarkItem); | 
| -    } | 
| - | 
| -    /** | 
| -     * Updates each EditText to display the data in bookmarkItem. This function will be called every | 
| -     * time user cancels editing. | 
| -     */ | 
| -    private void updateViews(BookmarkItem bookmarkItem) { | 
| -        mTitleEditText.setText(bookmarkItem.getTitle()); | 
| -        mUrlEditText.setText(bookmarkItem.getUrl()); | 
| -        setParentFolderName(bookmarkItem.getParentId()); | 
| - | 
| -        if (bookmarkItem.getId().getType() == BookmarkType.PARTNER) { | 
| -            mUrlEditText.setEnabled(false); | 
| -            mDescriptionEditText.setVisibility(View.GONE); | 
| -        } else { | 
| -            mUrlEditText.setEnabled(true); | 
| -            mDescriptionEditText.setText( | 
| -                    mEnhancedBookmarksModel.getBookmarkDescription(mBookmarkId)); | 
| -            mDescriptionEditText.setVisibility(View.VISIBLE); | 
| -        } | 
| - | 
| -        mDominantColor = EnhancedBookmarkUtils.generateBackgroundColor(bookmarkItem); | 
| -        mImageView.setBackgroundColor(mDominantColor); | 
| -        mMaskView.setBackgroundColor(mDominantColor); | 
| -        mEnhancedBookmarksModel.salientImageForUrl(bookmarkItem.getUrl(), | 
| -                new SalientImageCallback() { | 
| -                    @Override | 
| -                    public void onSalientImageReady(Bitmap bitmap, String imageUrl) { | 
| -                        if (bitmap == null) return; | 
| -                        mImageView.setImageBitmap(bitmap); | 
| -                        mDominantColor = EnhancedBookmarkUtils.getDominantColorForBitmap(bitmap); | 
| -                        mImageView.setBackgroundColor(mDominantColor); | 
| -                        mMaskView.setBackgroundColor(mDominantColor); | 
| -                    } | 
| -                }); | 
| -        mMaskView.setAlpha(0.0f); | 
| -    } | 
| - | 
| -    private void setParentFolderName(BookmarkId parentId) { | 
| -        mFolderTextView.setText(mEnhancedBookmarksModel.getBookmarkTitle(parentId)); | 
| -        mFolderTextView.setEnabled(parentId.getType() != BookmarkType.PARTNER); | 
| -    } | 
| - | 
| -    @Override | 
| -    public void onClick(View v) { | 
| -        // During animation, do not respond to any clicking events. | 
| -        if (mCurrentAnimator != null) return; | 
| -        if (v == mCloseButton) { | 
| -            dismiss(); | 
| -        } else if (v == mSaveButton) { | 
| -            if (save()) { | 
| -                dismiss(); | 
| -            } | 
| -        } else if (v instanceof EditText) { | 
| -            scrollToEdit((EditText) v); | 
| -        } else if (v == mFolderBox) { | 
| -            EnhancedBookmarkFolderSelectActivity.startFolderSelectActivity(this, mBookmarkId); | 
| -        } else if (v == mDeleteButton) { | 
| -            mEnhancedBookmarksModel.deleteBookmarks(mBookmarkId); | 
| -            dismiss(); | 
| -        } | 
| -    } | 
| - | 
| -    /** | 
| -     * Editing a TextView will trigger scrolling-up animation, as an effort to smoothly place the | 
| -     * focused EditText to be the best editable position to user. | 
| -     * <p> | 
| -     * To ensure the view can always be scrolled up, before animation: | 
| -     *   1) If content is shorter than screen height, then we fill the content view by | 
| -     *      emptyAreaHeight so as to align the content and scroll view. | 
| -     *   2) Calculate the scrolling amount. | 
| -     *   3) If the scrolling amount is larger than the current maximum scrollable amount, increase | 
| -     *      height of mBottomSpacer to make the content long enough. | 
| -     *   4) trigger scroll-up animation. | 
| -     */ | 
| -    private void scrollToEdit(final EditText editText) { | 
| -        if (DeviceFormFactor.isTablet(this)) { | 
| -            // On tablet this the size of the dialog is controlled by framework. To avoid any | 
| -            // jumpy behavior, we skip the crazy scrolling effect below. | 
| -            animateScrolling(mScrollView.getScrollY(), editText); | 
| -        } else { | 
| -            int scrollAmount = mScrollView.getHeightCompensation() + editText.getTop() | 
| -                    - mTitleEditText.getTop(); | 
| - | 
| -            // If there is not enough space to scroll, create padding at bottom. | 
| -            if (scrollAmount > mScrollView.getMaximumScrollY()) { | 
| -                // First try to align content view and scroll view. | 
| -                int emptyAreaHeight = mScrollView.getHeight() - mContentLayout.getHeight(); | 
| -                if (emptyAreaHeight < 0) emptyAreaHeight = 0; | 
| -                // Then increase height of bottom spacer to create margin for scroll. | 
| -                setViewHeight(mBottomSpacer, | 
| -                        scrollAmount - mScrollView.getMaximumScrollY() + emptyAreaHeight); | 
| -            } | 
| - | 
| -            animateScrolling(scrollAmount, editText); | 
| -        } | 
| -    } | 
| - | 
| -    private void animateScrolling(int scrollAmount, final EditText editText) { | 
| -        ObjectAnimator animator = ObjectAnimator.ofInt(mScrollView, "scrollY", scrollAmount); | 
| -        animator.setDuration(scrollAmount == mScrollView.getScrollY() ? 0 : ANIMATION_DURATION_MS); | 
| -        animator.addListener(new AnimatorListenerAdapter() { | 
| -            @Override | 
| -            public void onAnimationEnd(Animator animation) { | 
| -                for (EditText text : mEditTexts) text.setFocusableInTouchMode(true); | 
| -                editText.requestFocus(); | 
| -                InputMethodManager imm = (InputMethodManager) getSystemService( | 
| -                        Context.INPUT_METHOD_SERVICE); | 
| -                imm.showSoftInput(editText, 0); | 
| -                mCurrentAnimator = null; | 
| -            } | 
| -        }); | 
| -        mCurrentAnimator = animator; | 
| -        animator.start(); | 
| -    } | 
| - | 
| -    /** | 
| -     * Saves the edited content. | 
| -     * @return Whether the content was successfully saved. | 
| -     */ | 
| -    private boolean save() { | 
| -        String newTitle = mTitleEditText.getText().toString().trim(); | 
| -        String newUrl = mUrlEditText.getText().toString().trim(); | 
| - | 
| -        boolean urlOrTitleInvalid = false; | 
| -        // Fix user input urls, if necessary. | 
| -        newUrl = UrlUtilities.fixupUrl(newUrl); | 
| -        if (newUrl == null) newUrl = ""; | 
| -        mUrlEditText.setText(newUrl); | 
| -        if (newUrl.isEmpty()) { | 
| -            mUrlEditText.setError(getString(R.string.bookmark_missing_url)); | 
| -            urlOrTitleInvalid = true; | 
| -        } | 
| -        if (newTitle.isEmpty()) { | 
| -            mTitleEditText.setError(getString(R.string.bookmark_missing_title)); | 
| -            urlOrTitleInvalid = true; | 
| -        } | 
| -        if (urlOrTitleInvalid) return false; | 
| - | 
| -        BookmarkItem bookmarkItem = mEnhancedBookmarksModel.getBookmarkById(mBookmarkId); | 
| -        String newDescription = mDescriptionEditText.getText().toString().trim(); | 
| -        if (!bookmarkItem.getTitle().equals(newTitle)) { | 
| -            mEnhancedBookmarksModel.setBookmarkTitle(mBookmarkId, newTitle); | 
| -        } | 
| -        if (!bookmarkItem.getUrl().equals(newUrl) | 
| -                && bookmarkItem.getId().getType() != BookmarkType.PARTNER) { | 
| -            mEnhancedBookmarksModel.setBookmarkUrl(mBookmarkId, newUrl); | 
| -        } | 
| -        if (bookmarkItem.getId().getType() != BookmarkType.PARTNER) { | 
| -            mEnhancedBookmarksModel.setBookmarkDescription(mBookmarkId, newDescription); | 
| -        } | 
| - | 
| -        return true; | 
| -    } | 
| - | 
| -    @Override | 
| -    public void onScrollChanged(int y, int oldY) { | 
| -        int offset = mScrollView.getHeightCompensation(); | 
| -        if (y < offset) { | 
| -            mMaskView.setAlpha(y / (float) offset); | 
| -            mActionBarLayout.setBackgroundResource(0); | 
| -            mShadow.setStrength(0.0f); | 
| -        } else { | 
| -            mMaskView.setAlpha(1.0f); | 
| -            mActionBarLayout.setBackgroundColor(mDominantColor); | 
| -            mShadow.setStrength(1.0f); | 
| -        } | 
| - | 
| -    } | 
| - | 
| -    /** | 
| -     * Adds a listener to EditTexts that clears the TextView's error once the user types something. | 
| -     */ | 
| -    private void clearErrorWhenNonEmpty(TextView... textViews) { | 
| -        for (final TextView textView : textViews) { | 
| -            textView.addTextChangedListener(new TextWatcher() { | 
| -                @Override | 
| -                public void beforeTextChanged(CharSequence s, int start, int count, int after) { | 
| -                } | 
| -                @Override | 
| -                public void onTextChanged(CharSequence s, int start, int before, int count) { | 
| -                } | 
| -                @Override | 
| -                public void afterTextChanged(Editable s) { | 
| -                    if (s.length() != 0 && textView.getError() != null) textView.setError(null); | 
| -                } | 
| -            }); | 
| -        } | 
| -    } | 
| - | 
| -    @Override | 
| -    public void onDestroy() { | 
| -        mEnhancedBookmarksModel.removeModelObserver(mBookmarkModelObserver); | 
| -        mEnhancedBookmarksModel.destroy(); | 
| -        mEnhancedBookmarksModel = null; | 
| -        super.onDestroy(); | 
| -    } | 
| - | 
| -    private static void setViewHeight(View view, int height) { | 
| -        ViewGroup.LayoutParams lp = view.getLayoutParams(); | 
| -        lp.height = height; | 
| -        view.setLayoutParams(lp); | 
| -    } | 
| -} | 
|  |