summaryrefslogtreecommitdiffstats
path: root/ui/android
diff options
context:
space:
mode:
authoraurimas@chromium.org <aurimas@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-04-23 07:36:40 +0000
committeraurimas@chromium.org <aurimas@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-04-23 07:36:40 +0000
commit74d969838ae9091cbfe0caafe18d979bcc181f5e (patch)
tree55584d6633cb1627b5ecb3153235b4069c256c84 /ui/android
parent5b881abc43e42ea82bd64f974fcd35abff455cfc (diff)
downloadchromium_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.java60
-rw-r--r--ui/android/java/src/org/chromium/ui/ViewAndroidDelegate.java31
-rw-r--r--ui/android/ui_jni_registrar.cc2
-rw-r--r--ui/android/view_android.cc51
-rw-r--r--ui/android/view_android.h41
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_