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

Unified Diff: ui/android/java/src/org/chromium/ui/base/ViewAndroidDelegate.java

Issue 2103243002: Factor out ContentViewAndroidDelegate (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Addressed comments chrome/webview Created 4 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: ui/android/java/src/org/chromium/ui/base/ViewAndroidDelegate.java
diff --git a/ui/android/java/src/org/chromium/ui/base/ViewAndroidDelegate.java b/ui/android/java/src/org/chromium/ui/base/ViewAndroidDelegate.java
index a97b7565637c7985b9fb71bde689944900d053ec..cf0298ccabe0d8084d1bd0e574c8938e1c527f4e 100644
--- a/ui/android/java/src/org/chromium/ui/base/ViewAndroidDelegate.java
+++ b/ui/android/java/src/org/chromium/ui/base/ViewAndroidDelegate.java
@@ -4,39 +4,127 @@
package org.chromium.ui.base;
+import android.content.ClipData;
import android.graphics.Bitmap;
import android.view.View;
+import android.view.ViewGroup;
+import android.widget.FrameLayout.LayoutParams;
+import android.widget.ImageView;
+
+import org.chromium.base.ApiCompatibilityUtils;
+import org.chromium.base.annotations.CalledByNative;
+import org.chromium.base.annotations.JNINamespace;
/**
- * Interface to acquire and release anchor views from the implementing View.
+ * Class to acquire, position, and remove anchor views from the implementing View.
*/
-public interface ViewAndroidDelegate {
+@JNINamespace("ui")
+public abstract class ViewAndroidDelegate {
+
+ // TODO(hush): use View#DRAG_FLAG_GLOBAL when Chromium starts to build with API 24.
+ private static final int DRAG_FLAG_GLOBAL = 1 << 8;
/**
* @return An anchor view that can be used to anchor decoration views like Autofill popup.
*/
- View acquireAnchorView();
+ @CalledByNative
+ public View acquireView() {
+ ViewGroup containerView = getContainerView();
+ if (containerView == null) return null;
+ View anchorView = new View(containerView.getContext());
+ containerView.addView(anchorView);
+ return anchorView;
+ }
+
+ /**
+ * Release given anchor view.
+ * @param anchorView The anchor view that needs to be released.
+ */
+ @CalledByNative
+ public void removeView(View anchorView) {
+ ViewGroup containerView = getContainerView();
+ if (containerView == null) return;
+ containerView.removeView(anchorView);
+ }
/**
- * Set the anchor view to specified position and width (all units in dp).
+ * Set the anchor view to specified position and size (all units in dp).
* @param view The anchor view that needs to be positioned.
* @param x X coordinate of the top left corner of the anchor view.
* @param y Y coordinate of the top left corner of the anchor view.
* @param width The width of the anchor view.
* @param height The height of the anchor view.
*/
- void setAnchorViewPosition(View view, float x, float y, float width, float height);
+ @CalledByNative
+ public void setViewPosition(View view, float x, float y,
+ float width, float height, float scale, int leftMargin, int topMargin) {
+ ViewGroup containerView = getContainerView();
+ if (containerView == null) return;
- /**
- * Release given anchor view.
- * @param anchorView The anchor view that needs to be released.
- */
- void releaseAnchorView(View anchorView);
+ int scaledWidth = Math.round(width * scale);
+ int scaledHeight = Math.round(height * scale);
+ int startMargin;
+
+ if (ApiCompatibilityUtils.isLayoutRtl(containerView)) {
+ startMargin = containerView.getMeasuredWidth() - Math.round((width + x) * scale);
+ } else {
+ startMargin = leftMargin;
+ }
+ if (scaledWidth + startMargin > containerView.getWidth()) {
+ scaledWidth = containerView.getWidth() - startMargin;
+ }
+ LayoutParams lp = new LayoutParams(scaledWidth, scaledHeight);
+ ApiCompatibilityUtils.setMarginStart(lp, startMargin);
+ lp.topMargin = topMargin;
+ view.setLayoutParams(lp);
+ }
/**
* Drag the text out of current view.
* @param text The dragged text.
* @param shadowImage The shadow image for the dragged text.
*/
- void startDragAndDrop(String text, Bitmap shadowImage);
+ @SuppressWarnings("deprecation")
+ @CalledByNative
+ private void startDragAndDrop(String text, Bitmap shadowImage) {
+ ClipData data = ClipData.newPlainText(null, text);
+
+ ViewGroup containerView = getContainerView();
+ if (containerView == null) return;
+
+ ImageView imageView = new ImageView(containerView.getContext());
+ imageView.setImageBitmap(shadowImage);
+ imageView.layout(0, 0, shadowImage.getWidth(), shadowImage.getHeight());
+
+ // TODO(hush): use View#startDragAndDrop when Chromium starts to build with API 24.
+ containerView.startDrag(
+ data, new View.DragShadowBuilder(imageView), null, DRAG_FLAG_GLOBAL);
+ }
+
+ /**
+ * @return container view that the anchor views are added to. May be null.
+ */
+ public abstract ViewGroup getContainerView();
+
+ /**
+ * Create and return a basic implementation of {@link ViewAndroidDelegate} where
+ * the container view is not allowed to be changed after initialization.
+ * @param containerView {@link ViewGroup} to be used as a container view.
+ * @return a new instance of {@link ViewAndroidDelegate}.
+ */
+ public static ViewAndroidDelegate createBasicDelegate(ViewGroup containerView) {
+ return new ViewAndroidDelegate() {
+ private ViewGroup mContainerView;
+
+ private ViewAndroidDelegate init(ViewGroup containerView) {
+ mContainerView = containerView;
+ return this;
+ }
+
+ @Override
+ public ViewGroup getContainerView() {
+ return mContainerView;
+ }
+ }.init(containerView);
+ }
}

Powered by Google App Engine
This is Rietveld 408576698