Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1838)

Unified Diff: content/public/android/java/src/org/chromium/content/browser/input/InsertionHandleController.java

Issue 335943002: [Android] Composited selection handle rendering (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@input_native_handles_final
Patch Set: Clean up paste popup interaction Created 6 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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]);
- }
- }
-}

Powered by Google App Engine
This is Rietveld 408576698