| Index: content/public/android/java/src/org/chromium/content/browser/HandleView.java
 | 
| diff --git a/content/public/android/java/src/org/chromium/content/browser/HandleView.java b/content/public/android/java/src/org/chromium/content/browser/HandleView.java
 | 
| deleted file mode 100644
 | 
| index a772d5deac6e57ed85091524d9682f64846df063..0000000000000000000000000000000000000000
 | 
| --- a/content/public/android/java/src/org/chromium/content/browser/HandleView.java
 | 
| +++ /dev/null
 | 
| @@ -1,392 +0,0 @@
 | 
| -// Copyright (c) 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;
 | 
| -
 | 
| -import android.content.Context;
 | 
| -import android.content.res.TypedArray;
 | 
| -import android.graphics.Canvas;
 | 
| -import android.graphics.Rect;
 | 
| -import android.graphics.drawable.Drawable;
 | 
| -import android.os.SystemClock;
 | 
| -import android.util.TypedValue;
 | 
| -import android.view.Gravity;
 | 
| -import android.view.LayoutInflater;
 | 
| -import android.view.MotionEvent;
 | 
| -import android.view.View;
 | 
| -import android.view.ViewConfiguration;
 | 
| -import android.view.ViewGroup;
 | 
| -import android.view.ViewParent;
 | 
| -import android.view.WindowManager;
 | 
| -import android.view.View.OnClickListener;
 | 
| -import android.view.ViewGroup.LayoutParams;
 | 
| -import android.widget.PopupWindow;
 | 
| -import android.widget.TextView;
 | 
| -
 | 
| -/**
 | 
| - * View that displays a selection or insertion handle for text editing.
 | 
| - */
 | 
| -class HandleView extends View {
 | 
| -    private static final float FADE_DURATION = 200.f;
 | 
| -
 | 
| -    private Drawable mDrawable;
 | 
| -    private final PopupWindow mContainer;
 | 
| -    private int mPositionX;
 | 
| -    private int mPositionY;
 | 
| -    private final CursorController mController;
 | 
| -    private boolean mIsDragging;
 | 
| -    private float mTouchToWindowOffsetX;
 | 
| -    private float mTouchToWindowOffsetY;
 | 
| -    private float mHotspotX;
 | 
| -    private float mHotspotY;
 | 
| -    private int mLineOffsetY;
 | 
| -    private int mLastParentX;
 | 
| -    private int mLastParentY;
 | 
| -    private float mDownPositionX, mDownPositionY;
 | 
| -    private int mContainerPositionX, mContainerPositionY;
 | 
| -    private long mTouchTimer;
 | 
| -    private boolean mIsInsertionHandle = false;
 | 
| -    private float mAlpha;
 | 
| -    private long mFadeStartTime;
 | 
| -
 | 
| -    private View mParent;
 | 
| -    private InsertionHandleController.PastePopupMenu mPastePopupWindow;
 | 
| -
 | 
| -    private final int mTextSelectHandleLeftRes;
 | 
| -    private final int mTextSelectHandleRightRes;
 | 
| -    private final int mTextSelectHandleRes;
 | 
| -
 | 
| -    private Drawable mSelectHandleLeft;
 | 
| -    private Drawable mSelectHandleRight;
 | 
| -    private Drawable mSelectHandleCenter;
 | 
| -
 | 
| -    private final int[] mTempCoords = new int[2];
 | 
| -    private final Rect mTempRect = new Rect();
 | 
| -
 | 
| -    static final int LEFT = 0;
 | 
| -    static final int CENTER = 1;
 | 
| -    static final int RIGHT = 2;
 | 
| -
 | 
| -    // Number of dips to subtract from the handle's y position to give a suitable
 | 
| -    // y coordinate for the corresponding text position. This is to compensate for the fact
 | 
| -    // that the handle position is at the base of the line of text.
 | 
| -    private static final float LINE_OFFSET_Y_DIP = 5.0f;
 | 
| -
 | 
| -    private static final int[] TEXT_VIEW_HANDLE_ATTRS = {
 | 
| -        android.R.attr.textSelectHandleLeft,
 | 
| -        android.R.attr.textSelectHandle,
 | 
| -        android.R.attr.textSelectHandleRight,
 | 
| -    };
 | 
| -
 | 
| -    HandleView(CursorController controller, int pos, View parent) {
 | 
| -        super(parent.getContext());
 | 
| -        Context context = parent.getContext();
 | 
| -        mParent = parent;
 | 
| -        mController = controller;
 | 
| -        mContainer = new PopupWindow(context, null, android.R.attr.textSelectHandleWindowStyle);
 | 
| -        mContainer.setSplitTouchEnabled(true);
 | 
| -        mContainer.setClippingEnabled(false);
 | 
| -
 | 
| -        TypedArray a = context.obtainStyledAttributes(TEXT_VIEW_HANDLE_ATTRS);
 | 
| -        mTextSelectHandleLeftRes = a.getResourceId(a.getIndex(LEFT), 0);
 | 
| -        mTextSelectHandleRes = a.getResourceId(a.getIndex(CENTER), 0);
 | 
| -        mTextSelectHandleRightRes = a.getResourceId(a.getIndex(RIGHT), 0);
 | 
| -        a.recycle();
 | 
| -
 | 
| -        setOrientation(pos);
 | 
| -
 | 
| -        // Convert line offset dips to pixels.
 | 
| -        mLineOffsetY = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,
 | 
| -                LINE_OFFSET_Y_DIP, context.getResources().getDisplayMetrics());
 | 
| -
 | 
| -        mAlpha = 1.f;
 | 
| -    }
 | 
| -
 | 
| -    void setOrientation(int pos) {
 | 
| -        int handleWidth;
 | 
| -        switch (pos) {
 | 
| -        case LEFT: {
 | 
| -            if (mSelectHandleLeft == null) {
 | 
| -                mSelectHandleLeft = getContext().getResources().getDrawable(
 | 
| -                        mTextSelectHandleLeftRes);
 | 
| -            }
 | 
| -            mDrawable = mSelectHandleLeft;
 | 
| -            handleWidth = mDrawable.getIntrinsicWidth();
 | 
| -            mHotspotX = (handleWidth * 3) / 4;
 | 
| -            break;
 | 
| -        }
 | 
| -
 | 
| -        case RIGHT: {
 | 
| -            if (mSelectHandleRight == null) {
 | 
| -                mSelectHandleRight = getContext().getResources().getDrawable(
 | 
| -                        mTextSelectHandleRightRes);
 | 
| -            }
 | 
| -            mDrawable = mSelectHandleRight;
 | 
| -            handleWidth = mDrawable.getIntrinsicWidth();
 | 
| -            mHotspotX = handleWidth / 4;
 | 
| -            break;
 | 
| -        }
 | 
| -
 | 
| -        case CENTER:
 | 
| -        default: {
 | 
| -            if (mSelectHandleCenter == null) {
 | 
| -                mSelectHandleCenter = getContext().getResources().getDrawable(
 | 
| -                        mTextSelectHandleRes);
 | 
| -            }
 | 
| -            mDrawable = mSelectHandleCenter;
 | 
| -            handleWidth = mDrawable.getIntrinsicWidth();
 | 
| -            mHotspotX = handleWidth / 2;
 | 
| -            mIsInsertionHandle = true;
 | 
| -            break;
 | 
| -        }
 | 
| -        }
 | 
| -
 | 
| -        mHotspotY = 0;
 | 
| -        invalidate();
 | 
| -    }
 | 
| -
 | 
| -    @Override
 | 
| -    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
 | 
| -        setMeasuredDimension(mDrawable.getIntrinsicWidth(),
 | 
| -                mDrawable.getIntrinsicHeight());
 | 
| -    }
 | 
| -
 | 
| -    void show() {
 | 
| -        if (!isPositionVisible()) {
 | 
| -            hide();
 | 
| -            return;
 | 
| -        }
 | 
| -        mContainer.setContentView(this);
 | 
| -        final int[] coords = mTempCoords;
 | 
| -        mParent.getLocationInWindow(coords);
 | 
| -        mContainerPositionX = coords[0] + mPositionX;
 | 
| -        mContainerPositionY = coords[1] + mPositionY;
 | 
| -        mContainer.showAtLocation(mParent, 0, mContainerPositionX, mContainerPositionY);
 | 
| -
 | 
| -        // Hide paste view when handle is moved on screen.
 | 
| -        if (mPastePopupWindow != null) {
 | 
| -            mPastePopupWindow.hide();
 | 
| -        }
 | 
| -    }
 | 
| -
 | 
| -    void hide() {
 | 
| -        mIsDragging = false;
 | 
| -        mContainer.dismiss();
 | 
| -        if (mPastePopupWindow != null) {
 | 
| -            mPastePopupWindow.hide();
 | 
| -        }
 | 
| -    }
 | 
| -
 | 
| -    boolean isShowing() {
 | 
| -        return mContainer.isShowing();
 | 
| -    }
 | 
| -
 | 
| -    private boolean isPositionVisible() {
 | 
| -        // Always show a dragging handle.
 | 
| -        if (mIsDragging) {
 | 
| -            return true;
 | 
| -        }
 | 
| -
 | 
| -        final Rect clip = mTempRect;
 | 
| -        clip.left = 0;
 | 
| -        clip.top = 0;
 | 
| -        clip.right = mParent.getWidth();
 | 
| -        clip.bottom = mParent.getHeight();
 | 
| -
 | 
| -        final ViewParent parent = mParent.getParent();
 | 
| -        if (parent == null || !parent.getChildVisibleRect(mParent, clip, null)) {
 | 
| -            return false;
 | 
| -        }
 | 
| -
 | 
| -        final int[] coords = mTempCoords;
 | 
| -        mParent.getLocationInWindow(coords);
 | 
| -        final int posX = coords[0] + mPositionX + (int) mHotspotX;
 | 
| -        final int posY = coords[1] + mPositionY + (int) mHotspotY;
 | 
| -
 | 
| -        return posX >= clip.left && posX <= clip.right &&
 | 
| -                posY >= clip.top && posY <= clip.bottom;
 | 
| -    }
 | 
| -
 | 
| -    // x and y are in physical pixels.
 | 
| -    void moveTo(int x, int y) {
 | 
| -        mPositionX = x;
 | 
| -        mPositionY = y;
 | 
| -        if (isPositionVisible()) {
 | 
| -            int[] coords = null;
 | 
| -            if (mContainer.isShowing()) {
 | 
| -                coords = mTempCoords;
 | 
| -                mParent.getLocationInWindow(coords);
 | 
| -                final int containerPositionX = coords[0] + mPositionX;
 | 
| -                final int containerPositionY = coords[1] + mPositionY;
 | 
| -
 | 
| -                if (containerPositionX != mContainerPositionX ||
 | 
| -                    containerPositionY != mContainerPositionY) {
 | 
| -                    mContainerPositionX = containerPositionX;
 | 
| -                    mContainerPositionY = containerPositionY;
 | 
| -
 | 
| -                    mContainer.update(mContainerPositionX, mContainerPositionY,
 | 
| -                            getRight() - getLeft(), getBottom() - getTop());
 | 
| -
 | 
| -                    // Hide paste popup window as soon as a scroll occurs.
 | 
| -                    if (mPastePopupWindow != null) {
 | 
| -                        mPastePopupWindow.hide();
 | 
| -                    }
 | 
| -                }
 | 
| -            } else {
 | 
| -                show();
 | 
| -            }
 | 
| -
 | 
| -            if (mIsDragging) {
 | 
| -                if (coords == null) {
 | 
| -                    coords = mTempCoords;
 | 
| -                    mParent.getLocationInWindow(coords);
 | 
| -                }
 | 
| -                if (coords[0] != mLastParentX || coords[1] != mLastParentY) {
 | 
| -                    mTouchToWindowOffsetX += coords[0] - mLastParentX;
 | 
| -                    mTouchToWindowOffsetY += coords[1] - mLastParentY;
 | 
| -                    mLastParentX = coords[0];
 | 
| -                    mLastParentY = coords[1];
 | 
| -                }
 | 
| -                // Hide paste popup window as soon as the handle is dragged.
 | 
| -                if (mPastePopupWindow != null) {
 | 
| -                    mPastePopupWindow.hide();
 | 
| -                }
 | 
| -            }
 | 
| -        } else {
 | 
| -            hide();
 | 
| -        }
 | 
| -    }
 | 
| -
 | 
| -    @Override
 | 
| -    protected void onDraw(Canvas c) {
 | 
| -        updateAlpha();
 | 
| -        mDrawable.setBounds(0, 0, getRight() - getLeft(), getBottom() - getTop());
 | 
| -        mDrawable.draw(c);
 | 
| -    }
 | 
| -
 | 
| -    @Override
 | 
| -    public boolean onTouchEvent(MotionEvent ev) {
 | 
| -        switch (ev.getActionMasked()) {
 | 
| -            case MotionEvent.ACTION_DOWN: {
 | 
| -                mDownPositionX = ev.getRawX();
 | 
| -                mDownPositionY = ev.getRawY();
 | 
| -                mTouchToWindowOffsetX = mDownPositionX - mPositionX;
 | 
| -                mTouchToWindowOffsetY = mDownPositionY - mPositionY;
 | 
| -                final int[] coords = mTempCoords;
 | 
| -                mParent.getLocationInWindow(coords);
 | 
| -                mLastParentX = coords[0];
 | 
| -                mLastParentY = coords[1];
 | 
| -                mIsDragging = true;
 | 
| -                mController.beforeStartUpdatingPosition(this);
 | 
| -                mTouchTimer = SystemClock.uptimeMillis();
 | 
| -                break;
 | 
| -            }
 | 
| -
 | 
| -            case MotionEvent.ACTION_MOVE: {
 | 
| -                updatePosition(ev.getRawX(), ev.getRawY());
 | 
| -                break;
 | 
| -            }
 | 
| -
 | 
| -            case MotionEvent.ACTION_UP:
 | 
| -                if (mIsInsertionHandle) {
 | 
| -                    long delay = SystemClock.uptimeMillis() - mTouchTimer;
 | 
| -                    if (delay < ViewConfiguration.getTapTimeout()) {
 | 
| -                        if (mPastePopupWindow != null && mPastePopupWindow.isShowing()) {
 | 
| -                            // Tapping on the handle dismisses the displayed paste view,
 | 
| -                            mPastePopupWindow.hide();
 | 
| -                        } else {
 | 
| -                            showPastePopupWindow();
 | 
| -                        }
 | 
| -                    }
 | 
| -                }
 | 
| -                mIsDragging = false;
 | 
| -                break;
 | 
| -
 | 
| -            case MotionEvent.ACTION_CANCEL:
 | 
| -                mIsDragging = false;
 | 
| -                break;
 | 
| -        }
 | 
| -        return true;
 | 
| -    }
 | 
| -
 | 
| -    boolean isDragging() {
 | 
| -        return mIsDragging;
 | 
| -    }
 | 
| -
 | 
| -    /**
 | 
| -     * @return Returns the x position of the handle
 | 
| -     */
 | 
| -    int getPositionX() {
 | 
| -        return mPositionX;
 | 
| -    }
 | 
| -
 | 
| -    /**
 | 
| -     * @return Returns the y position of the handle
 | 
| -     */
 | 
| -    int getPositionY() {
 | 
| -        return mPositionY;
 | 
| -    }
 | 
| -
 | 
| -    private void updatePosition(float rawX, float rawY) {
 | 
| -        final float newPosX = rawX - mTouchToWindowOffsetX + mHotspotX;
 | 
| -        final float newPosY = rawY - mTouchToWindowOffsetY + mHotspotY - mLineOffsetY;
 | 
| -
 | 
| -        mController.updatePosition(this, Math.round(newPosX), Math.round(newPosY));
 | 
| -    }
 | 
| -
 | 
| -    // x and y are in physical pixels.
 | 
| -    void positionAt(int x, int y) {
 | 
| -        moveTo((int)(x - mHotspotX), (int)(y - mHotspotY));
 | 
| -    }
 | 
| -
 | 
| -    // Returns the x coordinate of the position that the handle appears to be pointing to.
 | 
| -    int getAdjustedPositionX() {
 | 
| -        return (int) (mPositionX + mHotspotX);
 | 
| -    }
 | 
| -
 | 
| -    // Returns the y coordinate of the position that the handle appears to be pointing to.
 | 
| -    int getAdjustedPositionY() {
 | 
| -        return (int) (mPositionY + mHotspotY);
 | 
| -    }
 | 
| -
 | 
| -    // Returns a suitable y coordinate for the text position corresponding to the handle.
 | 
| -    // As the handle points to a position on the base of the line of text, this method
 | 
| -    // returns a coordinate a small number of pixels higher (i.e. a slightly smaller number)
 | 
| -    // than getAdjustedPositionY.
 | 
| -    int getLineAdjustedPositionY() {
 | 
| -        return (int) (mPositionY + mHotspotY - mLineOffsetY);
 | 
| -    }
 | 
| -
 | 
| -    Drawable getDrawable() {
 | 
| -        return mDrawable;
 | 
| -    }
 | 
| -
 | 
| -    private void updateAlpha() {
 | 
| -        if (mAlpha == 1.f) return;
 | 
| -        mAlpha = Math.min(1.f, (System.currentTimeMillis() - mFadeStartTime) / FADE_DURATION);
 | 
| -        mDrawable.setAlpha((int) (255 * mAlpha));
 | 
| -        invalidate();
 | 
| -    }
 | 
| -
 | 
| -    /**
 | 
| -     * If the handle is not visible, sets its visibility to View.VISIBLE and begins fading it in.
 | 
| -     */
 | 
| -    void beginFadeIn() {
 | 
| -        if (getVisibility() == VISIBLE) return;
 | 
| -        mAlpha = 0.f;
 | 
| -        mFadeStartTime = System.currentTimeMillis();
 | 
| -        setVisibility(VISIBLE);
 | 
| -    }
 | 
| -
 | 
| -    void showPastePopupWindow() {
 | 
| -        InsertionHandleController ihc = (InsertionHandleController) mController;
 | 
| -        if (mIsInsertionHandle && ihc.canPaste()) {
 | 
| -            if (mPastePopupWindow == null) {
 | 
| -                // Lazy initialization: create when actually shown only.
 | 
| -                mPastePopupWindow = ihc.new PastePopupMenu();
 | 
| -            }
 | 
| -            mPastePopupWindow.show();
 | 
| -        }
 | 
| -    }
 | 
| -}
 | 
| 
 |