| Index: content/public/android/java/src/org/chromium/content/browser/input/InsertionHandleController.java | 
| diff --git a/content/public/android/java/src/org/chromium/content/browser/input/InsertionHandleController.java b/content/public/android/java/src/org/chromium/content/browser/input/InsertionHandleController.java | 
| deleted file mode 100644 | 
| index bd3a464f0098acd0e2bc63dd72ed9db708962152..0000000000000000000000000000000000000000 | 
| --- a/content/public/android/java/src/org/chromium/content/browser/input/InsertionHandleController.java | 
| +++ /dev/null | 
| @@ -1,332 +0,0 @@ | 
| -// Copyright 2012 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.content.browser.input; | 
| - | 
| -import android.content.ClipboardManager; | 
| -import android.content.Context; | 
| -import android.content.res.TypedArray; | 
| -import android.graphics.drawable.Drawable; | 
| -import android.view.Gravity; | 
| -import android.view.LayoutInflater; | 
| -import android.view.View; | 
| -import android.view.View.OnClickListener; | 
| -import android.view.ViewGroup; | 
| -import android.view.ViewGroup.LayoutParams; | 
| -import android.widget.PopupWindow; | 
| - | 
| -import com.google.common.annotations.VisibleForTesting; | 
| - | 
| -import org.chromium.content.browser.PositionObserver; | 
| - | 
| -/** | 
| - * CursorController for inserting text at the cursor position. | 
| - */ | 
| -public abstract class InsertionHandleController implements CursorController { | 
| - | 
| -    /** The handle view, lazily created when first shown */ | 
| -    private HandleView mHandle; | 
| - | 
| -    /** The view over which the insertion handle should be shown */ | 
| -    private final View mParent; | 
| - | 
| -    /** True iff the insertion handle is currently showing */ | 
| -    private boolean mIsShowing; | 
| - | 
| -    /** True iff the insertion handle can be shown automatically when selection changes */ | 
| -    private boolean mAllowAutomaticShowing; | 
| - | 
| -    private final Context mContext; | 
| - | 
| -    private final PositionObserver mPositionObserver; | 
| - | 
| -    public InsertionHandleController(View parent, PositionObserver positionObserver) { | 
| -        mParent = parent; | 
| - | 
| -        mContext = parent.getContext(); | 
| -        mPositionObserver = positionObserver; | 
| -    } | 
| - | 
| -    /** Allows the handle to be shown automatically when cursor position changes */ | 
| -    public void allowAutomaticShowing() { | 
| -        mAllowAutomaticShowing = true; | 
| -    } | 
| - | 
| -    /** Disallows the handle from being shown automatically when cursor position changes */ | 
| -    public void hideAndDisallowAutomaticShowing() { | 
| -        hide(); | 
| -        mAllowAutomaticShowing = false; | 
| -    } | 
| - | 
| -    /** | 
| -     * Shows the handle. | 
| -     */ | 
| -    public void showHandle() { | 
| -        createHandleIfNeeded(); | 
| -        showHandleIfNeeded(); | 
| -    } | 
| - | 
| -    void showPastePopup() { | 
| -        if (mIsShowing) { | 
| -            mHandle.showPastePopupWindow(); | 
| -        } | 
| -    } | 
| - | 
| -    public void showHandleWithPastePopup() { | 
| -        showHandle(); | 
| -        showPastePopup(); | 
| -    } | 
| - | 
| -    /** | 
| -     * @return whether the handle is being dragged. | 
| -     */ | 
| -    public boolean isDragging() { | 
| -        return mHandle != null && mHandle.isDragging(); | 
| -    } | 
| - | 
| -    /** Shows the handle at the given coordinates, as long as automatic showing is allowed */ | 
| -    public void onCursorPositionChanged() { | 
| -        if (mAllowAutomaticShowing) { | 
| -            showHandle(); | 
| -        } | 
| -    } | 
| - | 
| -    /** | 
| -     * Moves the handle so that it points at the given coordinates. | 
| -     * @param x Handle x in physical pixels. | 
| -     * @param y Handle y in physical pixels. | 
| -     */ | 
| -    public void setHandlePosition(float x, float y) { | 
| -        mHandle.positionAt((int) x, (int) y); | 
| -    } | 
| - | 
| -    /** | 
| -     * If the handle is not visible, sets its visibility to View.VISIBLE and begins fading it in. | 
| -     */ | 
| -    public void beginHandleFadeIn() { | 
| -        mHandle.beginFadeIn(); | 
| -    } | 
| - | 
| -    /** | 
| -     * Sets the handle to the given visibility. | 
| -     */ | 
| -    public void setHandleVisibility(int visibility) { | 
| -        mHandle.setVisibility(visibility); | 
| -    } | 
| - | 
| -    int getHandleX() { | 
| -        return mHandle.getAdjustedPositionX(); | 
| -    } | 
| - | 
| -    int getHandleY() { | 
| -        return mHandle.getAdjustedPositionY(); | 
| -    } | 
| - | 
| -    @VisibleForTesting | 
| -    public HandleView getHandleViewForTest() { | 
| -        return mHandle; | 
| -    } | 
| - | 
| -    @Override | 
| -    public void onTouchModeChanged(boolean isInTouchMode) { | 
| -        if (!isInTouchMode) { | 
| -            hide(); | 
| -        } | 
| -    } | 
| - | 
| -    @Override | 
| -    public void hide() { | 
| -        if (mIsShowing) { | 
| -            if (mHandle != null) mHandle.hide(); | 
| -            mIsShowing = false; | 
| -        } | 
| -    } | 
| - | 
| -    @Override | 
| -    public boolean isShowing() { | 
| -        return mIsShowing; | 
| -    } | 
| - | 
| -    @Override | 
| -    public void beforeStartUpdatingPosition(HandleView handle) {} | 
| - | 
| -    @Override | 
| -    public void updatePosition(HandleView handle, int x, int y) { | 
| -        setCursorPosition(x, y); | 
| -    } | 
| - | 
| -    /** | 
| -     * The concrete implementation must cause the cursor position to move to the given | 
| -     * coordinates and (possibly asynchronously) set the insertion handle position | 
| -     * after the cursor position change is made via setHandlePosition. | 
| -     * @param x | 
| -     * @param y | 
| -     */ | 
| -    protected abstract void setCursorPosition(int x, int y); | 
| - | 
| -    /** Pastes the contents of clipboard at the current insertion point */ | 
| -    protected abstract void paste(); | 
| - | 
| -    /** Returns the current line height in pixels */ | 
| -    protected abstract int getLineHeight(); | 
| - | 
| -    @Override | 
| -    public void onDetached() {} | 
| - | 
| -    boolean canPaste() { | 
| -        return ((ClipboardManager) mContext.getSystemService( | 
| -                Context.CLIPBOARD_SERVICE)).hasPrimaryClip(); | 
| -    } | 
| - | 
| -    private void createHandleIfNeeded() { | 
| -        if (mHandle == null) { | 
| -            mHandle = new HandleView(this, HandleView.CENTER, mParent, mPositionObserver); | 
| -        } | 
| -    } | 
| - | 
| -    private void showHandleIfNeeded() { | 
| -        if (!mIsShowing) { | 
| -            mIsShowing = true; | 
| -            mHandle.show(); | 
| -            setHandleVisibility(HandleView.VISIBLE); | 
| -        } | 
| -    } | 
| - | 
| -    /* | 
| -     * This class is based on TextView.PastePopupMenu. | 
| -     */ | 
| -    class PastePopupMenu implements OnClickListener { | 
| -        private final PopupWindow mContainer; | 
| -        private int mPositionX; | 
| -        private int mPositionY; | 
| -        private final View[] mPasteViews; | 
| -        private final int[] mPasteViewLayouts; | 
| - | 
| -        public PastePopupMenu() { | 
| -            mContainer = new PopupWindow(mContext, null, | 
| -                    android.R.attr.textSelectHandleWindowStyle); | 
| -            mContainer.setSplitTouchEnabled(true); | 
| -            mContainer.setClippingEnabled(false); | 
| - | 
| -            mContainer.setWidth(ViewGroup.LayoutParams.WRAP_CONTENT); | 
| -            mContainer.setHeight(ViewGroup.LayoutParams.WRAP_CONTENT); | 
| - | 
| -            final int[] POPUP_LAYOUT_ATTRS = { | 
| -                android.R.attr.textEditPasteWindowLayout, | 
| -                android.R.attr.textEditNoPasteWindowLayout, | 
| -                android.R.attr.textEditSidePasteWindowLayout, | 
| -                android.R.attr.textEditSideNoPasteWindowLayout, | 
| -            }; | 
| - | 
| -            mPasteViews = new View[POPUP_LAYOUT_ATTRS.length]; | 
| -            mPasteViewLayouts = new int[POPUP_LAYOUT_ATTRS.length]; | 
| - | 
| -            TypedArray attrs = mContext.obtainStyledAttributes(POPUP_LAYOUT_ATTRS); | 
| -            for (int i = 0; i < attrs.length(); ++i) { | 
| -                mPasteViewLayouts[i] = attrs.getResourceId(attrs.getIndex(i), 0); | 
| -            } | 
| -            attrs.recycle(); | 
| -        } | 
| - | 
| -        private int viewIndex(boolean onTop) { | 
| -            return (onTop ? 0 : 1 << 1) + (canPaste() ? 0 : 1 << 0); | 
| -        } | 
| - | 
| -        private void updateContent(boolean onTop) { | 
| -            final int viewIndex = viewIndex(onTop); | 
| -            View view = mPasteViews[viewIndex]; | 
| - | 
| -            if (view == null) { | 
| -                final int layout = mPasteViewLayouts[viewIndex]; | 
| -                LayoutInflater inflater = (LayoutInflater) mContext. | 
| -                    getSystemService(Context.LAYOUT_INFLATER_SERVICE); | 
| -                if (inflater != null) { | 
| -                    view = inflater.inflate(layout, null); | 
| -                } | 
| - | 
| -                if (view == null) { | 
| -                    throw new IllegalArgumentException("Unable to inflate TextEdit paste window"); | 
| -                } | 
| - | 
| -                final int size = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED); | 
| -                view.setLayoutParams(new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, | 
| -                        ViewGroup.LayoutParams.WRAP_CONTENT)); | 
| -                view.measure(size, size); | 
| - | 
| -                view.setOnClickListener(this); | 
| - | 
| -                mPasteViews[viewIndex] = view; | 
| -            } | 
| - | 
| -            mContainer.setContentView(view); | 
| -        } | 
| - | 
| -        void show() { | 
| -            updateContent(true); | 
| -            positionAtCursor(); | 
| -        } | 
| - | 
| -        void hide() { | 
| -            mContainer.dismiss(); | 
| -        } | 
| - | 
| -        boolean isShowing() { | 
| -            return mContainer.isShowing(); | 
| -        } | 
| - | 
| -        @Override | 
| -        public void onClick(View v) { | 
| -            if (canPaste()) { | 
| -                paste(); | 
| -            } | 
| -            hide(); | 
| -        } | 
| - | 
| -        void positionAtCursor() { | 
| -            View contentView = mContainer.getContentView(); | 
| -            int width = contentView.getMeasuredWidth(); | 
| -            int height = contentView.getMeasuredHeight(); | 
| - | 
| -            int lineHeight = getLineHeight(); | 
| - | 
| -            mPositionX = (int) (mHandle.getAdjustedPositionX() - width / 2.0f); | 
| -            mPositionY = mHandle.getAdjustedPositionY() - height - lineHeight; | 
| - | 
| -            final int[] coords = new int[2]; | 
| -            mParent.getLocationInWindow(coords); | 
| -            coords[0] += mPositionX; | 
| -            coords[1] += mPositionY; | 
| - | 
| -            final int screenWidth = mContext.getResources().getDisplayMetrics().widthPixels; | 
| -            if (coords[1] < 0) { | 
| -                updateContent(false); | 
| -                // Update dimensions from new view | 
| -                contentView = mContainer.getContentView(); | 
| -                width = contentView.getMeasuredWidth(); | 
| -                height = contentView.getMeasuredHeight(); | 
| - | 
| -                // Vertical clipping, move under edited line and to the side of insertion cursor | 
| -                // TODO bottom clipping in case there is no system bar | 
| -                coords[1] += height; | 
| -                coords[1] += lineHeight; | 
| - | 
| -                // Move to right hand side of insertion cursor by default. TODO RTL text. | 
| -                final Drawable handle = mHandle.getDrawable(); | 
| -                final int handleHalfWidth = handle.getIntrinsicWidth() / 2; | 
| - | 
| -                if (mHandle.getAdjustedPositionX() + width < screenWidth) { | 
| -                    coords[0] += handleHalfWidth + width / 2; | 
| -                } else { | 
| -                    coords[0] -= handleHalfWidth + width / 2; | 
| -                } | 
| -            } else { | 
| -                // Horizontal clipping | 
| -                coords[0] = Math.max(0, coords[0]); | 
| -                coords[0] = Math.min(screenWidth - width, coords[0]); | 
| -            } | 
| - | 
| -            mContainer.showAtLocation(mParent, Gravity.NO_GRAVITY, coords[0], coords[1]); | 
| -        } | 
| -    } | 
| -} | 
|  |