summaryrefslogtreecommitdiffstats
path: root/android_webview/java
diff options
context:
space:
mode:
authorsgurun@chromium.org <sgurun@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-06-27 20:19:27 +0000
committersgurun@chromium.org <sgurun@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-06-27 20:19:27 +0000
commit32d9fe2ee338a3e9fdec4664b798b1f6248566c4 (patch)
tree24f932cf7f25714ec74a02194d4d10dc90481237 /android_webview/java
parentb17e31d3686dee74e421d31183eb2986e87c6ca3 (diff)
downloadchromium_src-32d9fe2ee338a3e9fdec4664b798b1f6248566c4.zip
chromium_src-32d9fe2ee338a3e9fdec4664b798b1f6248566c4.tar.gz
chromium_src-32d9fe2ee338a3e9fdec4664b798b1f6248566c4.tar.bz2
Implement the autofill UI for chromium powered android webview.
This CL depends on https://codereview.chromium.org/15097004/. Bug: b/5013406 TBR=battre@chromium.org, palmer@chromium.org NOTRY=true contributed by sgurun@chromium.org Review URL: https://chromiumcodereview.appspot.com/16212007 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@208986 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'android_webview/java')
-rw-r--r--android_webview/java/src/org/chromium/android_webview/AwAutofillManagerDelegate.java123
-rw-r--r--android_webview/java/src/org/chromium/android_webview/AwContents.java16
2 files changed, 139 insertions, 0 deletions
diff --git a/android_webview/java/src/org/chromium/android_webview/AwAutofillManagerDelegate.java b/android_webview/java/src/org/chromium/android_webview/AwAutofillManagerDelegate.java
new file mode 100644
index 0000000..c526e58
--- /dev/null
+++ b/android_webview/java/src/org/chromium/android_webview/AwAutofillManagerDelegate.java
@@ -0,0 +1,123 @@
+// Copyright 2013 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.android_webview;
+
+import android.content.Context;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.AbsoluteLayout;
+
+import org.chromium.base.CalledByNative;
+import org.chromium.base.JNINamespace;
+import org.chromium.content.browser.ContentViewCore;
+import org.chromium.ui.ViewAndroidDelegate;
+import org.chromium.ui.autofill.AutofillPopup;
+import org.chromium.ui.autofill.AutofillSuggestion;
+
+// Java counterpart to the AwAutofillManagerDelegate. This class is owned by
+// AwContents and has a weak reference from native side.
+@JNINamespace("android_webview")
+public class AwAutofillManagerDelegate {
+
+ private final int mNativeAwAutofillManagerDelegate;
+ private AutofillPopup mAutofillPopup;
+ private ViewGroup mContainerView;
+ private double mDIPScale;
+ private ContentViewCore mContentViewCore;
+
+ @CalledByNative
+ public static AwAutofillManagerDelegate create(int nativeDelegate) {
+ return new AwAutofillManagerDelegate(nativeDelegate);
+ }
+
+ private AwAutofillManagerDelegate(int nativeAwAutofillManagerDelegate) {
+ mNativeAwAutofillManagerDelegate = nativeAwAutofillManagerDelegate;
+ }
+
+ public void init(ContentViewCore contentViewCore, double DIPScale) {
+ mContentViewCore = contentViewCore;
+ mContainerView = contentViewCore.getContainerView();
+ mDIPScale = DIPScale;
+ }
+
+ @CalledByNative
+ private void showAutofillPopup(float x, float y, float width, float height,
+ AutofillSuggestion[] suggestions) {
+
+ if (mContentViewCore == null) return;
+
+ if (mAutofillPopup == null) {
+ mAutofillPopup = new AutofillPopup(
+ mContentViewCore.getContext(),
+ getViewAndroidDelegate(),
+ new AutofillPopup.AutofillPopupDelegate() {
+ public void requestHide() { }
+ public void suggestionSelected(int listIndex) {
+ nativeSuggestionSelected(mNativeAwAutofillManagerDelegate, listIndex);
+ }
+ });
+ }
+ mAutofillPopup.setAnchorRect(x, y, width, height);
+ mAutofillPopup.show(suggestions);
+ }
+
+ @CalledByNative
+ public void hideAutofillPopup() {
+ if (mAutofillPopup == null)
+ return;
+ mAutofillPopup.hide();
+ mAutofillPopup = null;
+ }
+
+ private ViewAndroidDelegate getViewAndroidDelegate() {
+ return new ViewAndroidDelegate() {
+ @Override
+ public View acquireAnchorView() {
+ View anchorView = new View(mContentViewCore.getContext());
+ mContainerView.addView(anchorView);
+ return anchorView;
+ }
+
+ @Override
+ public void setAnchorViewPosition(
+ View view, float x, float y, float width, float height) {
+ assert(view.getParent() == mContainerView);
+
+ int leftMargin = (int)Math.round(x * mDIPScale);
+ int topMargin = (int)mContentViewCore.getRenderCoordinates().getContentOffsetYPix()
+ + (int)Math.round(y * mDIPScale);
+
+ AbsoluteLayout.LayoutParams lp = new AbsoluteLayout.LayoutParams((int)width,
+ (int)height, leftMargin, topMargin);
+ view.setLayoutParams(lp);
+ }
+
+ @Override
+ public void releaseAnchorView(View anchorView) {
+ mContainerView.removeView(anchorView);
+ }
+ };
+ }
+
+ @CalledByNative
+ private static AutofillSuggestion[] createAutofillSuggestionArray(int size) {
+ return new AutofillSuggestion[size];
+ }
+
+ /**
+ * @param array AutofillSuggestion array that should get a new suggestion added.
+ * @param index Index in the array where to place a new suggestion.
+ * @param name Name of the suggestion.
+ * @param label Label of the suggestion.
+ * @param uniqueId Unique suggestion id.
+ */
+ @CalledByNative
+ private static void addToAutofillSuggestionArray(AutofillSuggestion[] array, int index,
+ String name, String label, int uniqueId) {
+ array[index] = new AutofillSuggestion(name, label, uniqueId);
+ }
+
+ private native void nativeSuggestionSelected(int nativeAwAutofillManagerDelegate, int position);
+}
diff --git a/android_webview/java/src/org/chromium/android_webview/AwContents.java b/android_webview/java/src/org/chromium/android_webview/AwContents.java
index 9da7fd5..f2f80b6 100644
--- a/android_webview/java/src/org/chromium/android_webview/AwContents.java
+++ b/android_webview/java/src/org/chromium/android_webview/AwContents.java
@@ -153,6 +153,8 @@ public class AwContents {
private boolean mContainerViewFocused;
private boolean mWindowFocused;
+ private AwAutofillManagerDelegate mAwAutofillManagerDelegate;
+
private static final class DestroyRunnable implements Runnable {
private int mNativeAwContents;
private DestroyRunnable(int nativeAwContents) {
@@ -1330,6 +1332,14 @@ public class AwContents {
return mContentViewCore.performAccessibilityAction(action, arguments);
}
+ /**
+ * @see android.webkit.WebView#clearFormData()
+ */
+ public void hideAutofillPopup() {
+ if (mAwAutofillManagerDelegate != null)
+ mAwAutofillManagerDelegate.hideAutofillPopup();
+ }
+
//--------------------------------------------------------------------------------------------
// Methods called from native via JNI
//--------------------------------------------------------------------------------------------
@@ -1469,6 +1479,12 @@ public class AwContents {
mScrollOffsetManager.scrollContainerViewTo(x, y);
}
+ @CalledByNative
+ private void setAwAutofillManagerDelegate(AwAutofillManagerDelegate delegate) {
+ mAwAutofillManagerDelegate = delegate;
+ delegate.init(mContentViewCore, mDIPScale);
+ }
+
// -------------------------------------------------------------------------------------------
// Helper methods
// -------------------------------------------------------------------------------------------