diff options
author | aurimas@chromium.org <aurimas@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-04-23 07:36:40 +0000 |
---|---|---|
committer | aurimas@chromium.org <aurimas@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-04-23 07:36:40 +0000 |
commit | 74d969838ae9091cbfe0caafe18d979bcc181f5e (patch) | |
tree | 55584d6633cb1627b5ecb3153235b4069c256c84 /ui/android | |
parent | 5b881abc43e42ea82bd64f974fcd35abff455cfc (diff) | |
download | chromium_src-74d969838ae9091cbfe0caafe18d979bcc181f5e.zip chromium_src-74d969838ae9091cbfe0caafe18d979bcc181f5e.tar.gz chromium_src-74d969838ae9091cbfe0caafe18d979bcc181f5e.tar.bz2 |
[Android] Refactor NativeView to be able to use it for AutofillDialog.
Create a new class WindowAndroid that serves the purpose of representing a native (platform specific) view where Chromium code expects to have a cross platform handle to the system view type. As Views are Java objects on Android, ViewAndroid.java and view_android.* will provide the expected abstractions on the C++ side and allow it to be flexibly glued to an actual Android Java View at runtime. It should only be used where access to Android Views is needed from the C++ code as there are easier/better ways to access Views from Java.
This new abstraction will allow to reuse AutofillPopup for regular use in a webpage (using ContentView) as well as for AutofillDialog.
BUG=229199
Review URL: https://chromiumcodereview.appspot.com/14018004
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@195750 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'ui/android')
-rw-r--r-- | ui/android/java/src/org/chromium/ui/ViewAndroid.java | 60 | ||||
-rw-r--r-- | ui/android/java/src/org/chromium/ui/ViewAndroidDelegate.java | 31 | ||||
-rw-r--r-- | ui/android/ui_jni_registrar.cc | 2 | ||||
-rw-r--r-- | ui/android/view_android.cc | 51 | ||||
-rw-r--r-- | ui/android/view_android.h | 41 |
5 files changed, 185 insertions, 0 deletions
diff --git a/ui/android/java/src/org/chromium/ui/ViewAndroid.java b/ui/android/java/src/org/chromium/ui/ViewAndroid.java new file mode 100644 index 0000000..0f0ca11 --- /dev/null +++ b/ui/android/java/src/org/chromium/ui/ViewAndroid.java @@ -0,0 +1,60 @@ +// Copyright (c) 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.ui; + +import org.chromium.base.JNINamespace; +import org.chromium.ui.ViewAndroidDelegate; +import org.chromium.ui.WindowAndroid; + +/** + * From the Chromium architecture point of view, ViewAndroid and its native counterpart + * serve purpose of representing Android view where Chrome expects to have a cross platform + * handle to the system view type. As Views are Java object on Android, this ViewAndroid + * and its native counterpart provide the expected abstractions on the C++ side and allow + * it to be flexibly glued to an actual Android Java View at runtime. + * + * It should only be used where access to Android Views is needed from the C++ code. + */ +@JNINamespace("ui") +public class ViewAndroid { + // Native pointer to the c++ ViewAndroid object. + private int mNativeViewAndroid = 0; + private final ViewAndroidDelegate mViewAndroidDelegate; + private final WindowAndroid mWindowAndroid; + + /** + * Constructs a View object. + */ + public ViewAndroid(WindowAndroid nativeWindow, ViewAndroidDelegate viewAndroidDelegate) { + mWindowAndroid = nativeWindow; + mViewAndroidDelegate = viewAndroidDelegate; + mNativeViewAndroid = nativeInit(mWindowAndroid.getNativePointer()); + } + + public ViewAndroidDelegate getViewAndroidDelegate() { + return mViewAndroidDelegate; + } + + /** + * Destroys the c++ ViewAndroid object if one has been created. + */ + public void destroy() { + if (mNativeViewAndroid != 0) { + nativeDestroy(mNativeViewAndroid); + mNativeViewAndroid = 0; + } + } + + /** + * Returns a pointer to the c++ AndroidWindow object. + * @return A pointer to the c++ AndroidWindow. + */ + public int getNativePointer() { + return mNativeViewAndroid; + } + + private native int nativeInit(int windowPtr); + private native void nativeDestroy(int nativeViewAndroid); +} diff --git a/ui/android/java/src/org/chromium/ui/ViewAndroidDelegate.java b/ui/android/java/src/org/chromium/ui/ViewAndroidDelegate.java new file mode 100644 index 0000000..c6855a1 --- /dev/null +++ b/ui/android/java/src/org/chromium/ui/ViewAndroidDelegate.java @@ -0,0 +1,31 @@ +// 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.ui; + +import android.view.View; + +/** + * Interface to add and remove views from the implementing view. + */ +public interface ViewAndroidDelegate { + + /** + * Add the view. + * @param view The view to be added. + */ + void addViewToContainerView(View view); + + /** + * Remove the view if it is present, otherwise do nothing. + * @param view The view to be removed. + */ + void removeViewFromContainerView(View view); + + /** + * Used for any calculations that need to place a View near a particular piece of web content. + * @return The Y offset in pixels to apply to any added views. + */ + int getChildViewOffsetYPix(); +}
\ No newline at end of file diff --git a/ui/android/ui_jni_registrar.cc b/ui/android/ui_jni_registrar.cc index 5a0149b..8216e01 100644 --- a/ui/android/ui_jni_registrar.cc +++ b/ui/android/ui_jni_registrar.cc @@ -6,6 +6,7 @@ #include "base/android/jni_android.h" #include "base/android/jni_registrar.h" +#include "ui/android/view_android.h" #include "ui/android/window_android.h" #include "ui/base/clipboard/clipboard_android_initialization.h" #include "ui/base/l10n/l10n_util_android.h" @@ -20,6 +21,7 @@ static base::android::RegistrationMethod kUiRegisteredMethods[] = { { "DeviceDisplayInfo", gfx::DeviceDisplayInfo::RegisterDeviceDisplayInfo }, { "JavaBitmap", gfx::JavaBitmap::RegisterJavaBitmap }, { "LocalizationUtils", l10n_util::RegisterLocalizationUtil }, + { "ViewAndroid", ui::ViewAndroid::RegisterViewAndroid }, { "WindowAndroid", ui::WindowAndroid::RegisterWindowAndroid }, }; diff --git a/ui/android/view_android.cc b/ui/android/view_android.cc new file mode 100644 index 0000000..adfd987 --- /dev/null +++ b/ui/android/view_android.cc @@ -0,0 +1,51 @@ +// Copyright (c) 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. + +#include "ui/android/view_android.h" + +#include "base/android/jni_android.h" +#include "base/android/jni_helper.h" +#include "base/android/scoped_java_ref.h" +#include "jni/ViewAndroid_jni.h" +#include "ui/android/window_android.h" + +namespace ui { + +using base::android::AttachCurrentThread; +using base::android::ScopedJavaLocalRef; + +ViewAndroid::ViewAndroid(JNIEnv* env, jobject obj, WindowAndroid* window) + : weak_java_view_(env, obj), + window_android_(window) {} + +void ViewAndroid::Destroy(JNIEnv* env, jobject obj) { + DCHECK(obj && env->IsSameObject(weak_java_view_.get(env).obj(), obj)); + delete this; +} + +ScopedJavaLocalRef<jobject> ViewAndroid::GetJavaObject() { + // It is mandatory to explicitly call destroy() before releasing the java + // side object. This could be changed in future by adding CleanupReference + // based destruct path; + return weak_java_view_.get(AttachCurrentThread()); +} + +WindowAndroid* ViewAndroid::GetWindowAndroid() { + return window_android_; +} + +bool ViewAndroid::RegisterViewAndroid(JNIEnv* env) { + return RegisterNativesImpl(env); +} + +ViewAndroid::~ViewAndroid() { +} + +jint Init(JNIEnv* env, jobject obj, jint window) { + ViewAndroid* view = new ViewAndroid( + env, obj, reinterpret_cast<ui::WindowAndroid*>(window)); + return reinterpret_cast<jint>(view); +} + +} // namespace ui diff --git a/ui/android/view_android.h b/ui/android/view_android.h new file mode 100644 index 0000000..c95608d --- /dev/null +++ b/ui/android/view_android.h @@ -0,0 +1,41 @@ +// Copyright (c) 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. + +#ifndef UI_ANDROID_VIEW_ANDROID_H_ +#define UI_ANDROID_VIEW_ANDROID_H_ + +#include <jni.h> +#include "base/android/jni_helper.h" +#include "base/android/scoped_java_ref.h" +#include "ui/base/ui_export.h" + +namespace ui { + +class WindowAndroid; + +// This class is the native counterpart for ViewAndroid. It is owned by the +// Java ViewAndroid object. +class UI_EXPORT ViewAndroid { + public: + ViewAndroid(JNIEnv* env, jobject obj, WindowAndroid* window); + + void Destroy(JNIEnv* env, jobject obj); + + WindowAndroid* GetWindowAndroid(); + + base::android::ScopedJavaLocalRef<jobject> GetJavaObject(); + + static bool RegisterViewAndroid(JNIEnv* env); + + private: + ~ViewAndroid(); + JavaObjectWeakGlobalRef weak_java_view_; + WindowAndroid* window_android_; + + DISALLOW_COPY_AND_ASSIGN(ViewAndroid); +}; + +} // namespace ui + +#endif // UI_ANDROID_VIEW_ANDROID_H_ |