diff options
author | sgurun@chromium.org <sgurun@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-06-27 20:19:27 +0000 |
---|---|---|
committer | sgurun@chromium.org <sgurun@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-06-27 20:19:27 +0000 |
commit | 32d9fe2ee338a3e9fdec4664b798b1f6248566c4 (patch) | |
tree | 24f932cf7f25714ec74a02194d4d10dc90481237 /android_webview/java | |
parent | b17e31d3686dee74e421d31183eb2986e87c6ca3 (diff) | |
download | chromium_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.java | 123 | ||||
-rw-r--r-- | android_webview/java/src/org/chromium/android_webview/AwContents.java | 16 |
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 // ------------------------------------------------------------------------------------------- |