summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjdduke <jdduke@chromium.org>2014-12-19 15:39:49 -0800
committerCommit bot <commit-bot@chromium.org>2014-12-19 23:41:02 +0000
commit282f5e18d266541f69bfd79b01257e490b00d9b0 (patch)
tree741fe586bba0d0c76c523c02c6cb475d0a18d78c
parent93761d507b748c31730eb86ad5fd6e16d5d459af (diff)
downloadchromium_src-282f5e18d266541f69bfd79b01257e490b00d9b0.zip
chromium_src-282f5e18d266541f69bfd79b01257e490b00d9b0.tar.gz
chromium_src-282f5e18d266541f69bfd79b01257e490b00d9b0.tar.bz2
Make ResourceManager an interface
Simplify testing by making the ResourceManager a pure interface. Also add some basic trace coverage for resource loading. BUG=426939 Review URL: https://codereview.chromium.org/802013004 Cr-Commit-Position: refs/heads/master@{#309296}
-rw-r--r--android_webview/java_library_common.mk2
-rw-r--r--content/browser/android/edge_effect.cc12
-rw-r--r--content/browser/android/edge_effect_l.cc1
-rw-r--r--content/browser/android/overscroll_refresh.cc1
-rw-r--r--content/browser/android/overscroll_refresh_unittest.cc17
-rw-r--r--content/browser/renderer_host/compositor_impl_android.h4
-rw-r--r--ui/android/BUILD.gn8
-rw-r--r--ui/android/DEPS1
-rw-r--r--ui/android/java/src/org/chromium/ui/resources/ResourceManager.java4
-rw-r--r--ui/android/java/src/org/chromium/ui/resources/async/AsyncPreloadResourceLoader.java16
-rw-r--r--ui/android/java/src/org/chromium/ui/resources/system/SystemResourceLoader.java2
-rw-r--r--ui/android/resources/resource_manager.cc122
-rw-r--r--ui/android/resources/resource_manager.h75
-rw-r--r--ui/android/resources/resource_manager_impl.cc132
-rw-r--r--ui/android/resources/resource_manager_impl.h66
-rw-r--r--ui/android/resources/resource_manager_impl_unittest.cc (renamed from ui/android/resources/resource_manager_unittest.cc)32
-rw-r--r--ui/android/resources/system_ui_resource_type.h (renamed from ui/base/android/system_ui_resource_type.h)12
-rw-r--r--ui/android/resources/ui_resource_android.h1
-rw-r--r--ui/android/ui_android.gyp6
-rw-r--r--ui/android/ui_android_jni_registrar.cc4
20 files changed, 297 insertions, 221 deletions
diff --git a/android_webview/java_library_common.mk b/android_webview/java_library_common.mk
index 48762a6..40fedc5 100644
--- a/android_webview/java_library_common.mk
+++ b/android_webview/java_library_common.mk
@@ -67,7 +67,7 @@ $(call intermediates-dir-for,GYP,shared)/enums/base_java_library_load_from_apk_s
$(call intermediates-dir-for,GYP,shared)/enums/base_java_memory_pressure_level/org/chromium/base/MemoryPressureLevel.java \
$(call intermediates-dir-for,GYP,shared)/enums/media_android_imageformat/org/chromium/media/AndroidImageFormat.java \
$(call intermediates-dir-for,GYP,shared)/enums/page_transition_types_java/org/chromium/ui/base/PageTransition.java \
-$(call intermediates-dir-for,GYP,shared)/enums/system_ui_resource_type_java/org/chromium/ui/base/SystemUIResourceType.java \
+$(call intermediates-dir-for,GYP,shared)/enums/system_ui_resource_type_java/org/chromium/ui/resources/SystemUIResourceType.java \
$(call intermediates-dir-for,GYP,shared)/enums/text_input_type_java/org/chromium/ui/base/ime/TextInputType.java \
$(call intermediates-dir-for,GYP,shared)/enums/touch_device_types_java/org/chromium/ui/base/HoverType.java \
$(call intermediates-dir-for,GYP,shared)/enums/touch_device_types_java/org/chromium/ui/base/PointerType.java \
diff --git a/content/browser/android/edge_effect.cc b/content/browser/android/edge_effect.cc
index 41d25bf..abce9c2 100644
--- a/content/browser/android/edge_effect.cc
+++ b/content/browser/android/edge_effect.cc
@@ -8,11 +8,15 @@
#include "cc/layers/ui_resource_layer.h"
#include "content/browser/android/animation_utils.h"
#include "ui/android/resources/resource_manager.h"
+#include "ui/android/resources/system_ui_resource_type.h"
namespace content {
namespace {
+const ui::SystemUIResourceType kEdgeResourceId = ui::OVERSCROLL_EDGE;
+const ui::SystemUIResourceType kGlowResourceId = ui::OVERSCROLL_GLOW;
+
// Time it will take the effect to fully recede in ms
const int kRecedeTimeMs = 1000;
@@ -94,8 +98,8 @@ class EdgeEffect::EffectLayer {
EdgeEffect::EdgeEffect(ui::ResourceManager* resource_manager,
float device_scale_factor)
- : edge_(new EffectLayer(ui::OVERSCROLL_EDGE, resource_manager)),
- glow_(new EffectLayer(ui::OVERSCROLL_GLOW, resource_manager)),
+ : edge_(new EffectLayer(kEdgeResourceId, resource_manager)),
+ glow_(new EffectLayer(kGlowResourceId, resource_manager)),
base_edge_height_(kEdgeHeightAtMdpi * device_scale_factor),
base_glow_height_(kGlowHeightAtMdpi * device_scale_factor),
edge_alpha_(0),
@@ -338,9 +342,9 @@ void EdgeEffect::SetParent(cc::Layer* parent) {
void EdgeEffect::PreloadResources(ui::ResourceManager* resource_manager) {
DCHECK(resource_manager);
resource_manager->PreloadResource(ui::ANDROID_RESOURCE_TYPE_SYSTEM,
- ui::OVERSCROLL_EDGE);
+ kEdgeResourceId);
resource_manager->PreloadResource(ui::ANDROID_RESOURCE_TYPE_SYSTEM,
- ui::OVERSCROLL_GLOW);
+ kGlowResourceId);
}
} // namespace content
diff --git a/content/browser/android/edge_effect_l.cc b/content/browser/android/edge_effect_l.cc
index 41bb873..4fac472 100644
--- a/content/browser/android/edge_effect_l.cc
+++ b/content/browser/android/edge_effect_l.cc
@@ -7,6 +7,7 @@
#include "cc/layers/ui_resource_layer.h"
#include "content/browser/android/animation_utils.h"
#include "ui/android/resources/resource_manager.h"
+#include "ui/android/resources/system_ui_resource_type.h"
namespace content {
diff --git a/content/browser/android/overscroll_refresh.cc b/content/browser/android/overscroll_refresh.cc
index 3183eef..7d73929 100644
--- a/content/browser/android/overscroll_refresh.cc
+++ b/content/browser/android/overscroll_refresh.cc
@@ -9,6 +9,7 @@
#include "cc/trees/layer_tree_host.h"
#include "content/browser/android/animation_utils.h"
#include "ui/android/resources/resource_manager.h"
+#include "ui/android/resources/system_ui_resource_type.h"
#include "ui/gfx/geometry/size_conversions.h"
using std::abs;
diff --git a/content/browser/android/overscroll_refresh_unittest.cc b/content/browser/android/overscroll_refresh_unittest.cc
index f715503..e7c9075 100644
--- a/content/browser/android/overscroll_refresh_unittest.cc
+++ b/content/browser/android/overscroll_refresh_unittest.cc
@@ -20,7 +20,7 @@ class OverscrollRefreshTest : public OverscrollRefreshClient,
public testing::Test {
public:
OverscrollRefreshTest()
- : ui::ResourceManager(nullptr), refresh_triggered_(false) {}
+ : refresh_triggered_(false), still_refreshing_(false) {}
// OverscrollRefreshClient implementation.
void TriggerRefresh() override {
@@ -30,7 +30,15 @@ class OverscrollRefreshTest : public OverscrollRefreshClient,
bool IsStillRefreshing() const override { return still_refreshing_; }
- // ResoruceManager implementation.
+ // ResourceManager implementation.
+ base::android::ScopedJavaLocalRef<jobject> GetJavaObject() override {
+ return base::android::ScopedJavaLocalRef<jobject>();
+ }
+
+ Resource* GetResource(ui::AndroidResourceType res_type, int res_id) override {
+ return nullptr;
+ }
+
void PreloadResource(ui::AndroidResourceType res_type, int res_id) override {}
bool GetAndResetRefreshTriggered() {
@@ -42,11 +50,6 @@ class OverscrollRefreshTest : public OverscrollRefreshClient,
protected:
void SignalRefreshCompleted() { still_refreshing_ = false; }
- cc::UIResourceId GetUIResourceId(ui::AndroidResourceType res_type,
- int res_id) override {
- return 0;
- }
-
private:
bool refresh_triggered_;
bool still_refreshing_;
diff --git a/content/browser/renderer_host/compositor_impl_android.h b/content/browser/renderer_host/compositor_impl_android.h
index b0f6aad..0b60c23 100644
--- a/content/browser/renderer_host/compositor_impl_android.h
+++ b/content/browser/renderer_host/compositor_impl_android.h
@@ -17,7 +17,7 @@
#include "content/public/browser/android/compositor.h"
#include "gpu/command_buffer/common/capabilities.h"
#include "third_party/khronos/GLES2/gl2.h"
-#include "ui/android/resources/resource_manager.h"
+#include "ui/android/resources/resource_manager_impl.h"
#include "ui/android/resources/ui_resource_provider.h"
#include "ui/base/android/window_android_compositor.h"
@@ -141,7 +141,7 @@ class CONTENT_EXPORT CompositorImpl
scoped_ptr<cc::LayerTreeHost> host_;
ui::UIResourceProvider ui_resource_provider_;
- ui::ResourceManager resource_manager_;
+ ui::ResourceManagerImpl resource_manager_;
scoped_ptr<OnscreenDisplayClient> display_client_;
scoped_ptr<cc::SurfaceIdAllocator> surface_id_allocator_;
diff --git a/ui/android/BUILD.gn b/ui/android/BUILD.gn
index 1cf50e5..f74ba7e 100644
--- a/ui/android/BUILD.gn
+++ b/ui/android/BUILD.gn
@@ -7,6 +7,8 @@ component("android") {
sources = [
"resources/resource_manager.cc",
"resources/resource_manager.h",
+ "resources/resource_manager_impl.cc",
+ "resources/resource_manager_impl.h",
"resources/ui_resource_android.cc",
"resources/ui_resource_android.h",
"resources/ui_resource_client_android.h",
@@ -40,20 +42,20 @@ java_cpp_enum("java_enums_srcjar") {
"../base/page_transition_types.h",
"../base/touch/touch_device.h",
"../base/window_open_disposition.h",
- "../base/android/system_ui_resource_type.h",
"../base/ime/text_input_type.h",
"../gfx/android/java_bitmap.h",
"resources/resource_manager.h",
+ "resources/system_ui_resource_type.h",
]
outputs = [
"org/chromium/ui/WindowOpenDisposition.java",
"org/chromium/ui/base/PageTransition.java",
- "org/chromium/ui/base/SystemUIResourceType.java",
"org/chromium/ui/base/HoverType.java",
"org/chromium/ui/base/PointerType.java",
"org/chromium/ui/base/ime/TextInputType.java",
"org/chromium/ui/gfx/BitmapFormat.java",
"org/chromium/ui/resources/AndroidResourceType.java",
+ "org/chromium/ui/resources/SystemUIResourceType.java",
]
}
@@ -137,7 +139,7 @@ android_library("ui_javatests") {
test("ui_android_unittests") {
sources = [
- "resources/resource_manager_unittest.cc",
+ "resources/resource_manager_impl_unittest.cc",
"run_all_unittests.cc",
]
deps = [
diff --git a/ui/android/DEPS b/ui/android/DEPS
index 2e47eb0..fb0cc93 100644
--- a/ui/android/DEPS
+++ b/ui/android/DEPS
@@ -5,7 +5,6 @@ include_rules = [
"+jni",
"+skia/ext",
"+third_party/skia",
- "+ui/base/android/system_ui_resource_type.h",
"+ui/base/resource/resource_bundle.h",
"+ui/base/ui_base_paths.h",
"+ui/gfx",
diff --git a/ui/android/java/src/org/chromium/ui/resources/ResourceManager.java b/ui/android/java/src/org/chromium/ui/resources/ResourceManager.java
index d6574fe..3bf7418 100644
--- a/ui/android/java/src/org/chromium/ui/resources/ResourceManager.java
+++ b/ui/android/java/src/org/chromium/ui/resources/ResourceManager.java
@@ -161,9 +161,9 @@ public class ResourceManager implements ResourceLoaderCallback {
mResourceLoaders.put(loader.getResourceType(), loader);
}
- private native void nativeOnResourceReady(long nativeResourceManager, int resType,
+ private native void nativeOnResourceReady(long nativeResourceManagerImpl, int resType,
int resId, Bitmap bitmap, int paddingLeft, int paddingTop, int paddingRight,
int paddingBottom, int apertureLeft, int apertureTop, int apertureRight,
int apertureBottom);
-} \ No newline at end of file
+}
diff --git a/ui/android/java/src/org/chromium/ui/resources/async/AsyncPreloadResourceLoader.java b/ui/android/java/src/org/chromium/ui/resources/async/AsyncPreloadResourceLoader.java
index fb27244..84babbe 100644
--- a/ui/android/java/src/org/chromium/ui/resources/async/AsyncPreloadResourceLoader.java
+++ b/ui/android/java/src/org/chromium/ui/resources/async/AsyncPreloadResourceLoader.java
@@ -7,6 +7,7 @@ package org.chromium.ui.resources.async;
import android.os.AsyncTask;
import android.util.SparseArray;
+import org.chromium.base.TraceEvent;
import org.chromium.ui.resources.Resource;
import org.chromium.ui.resources.ResourceLoader;
@@ -71,7 +72,7 @@ public class AsyncPreloadResourceLoader extends ResourceLoader {
return;
}
}
- registerResource(mCreator.create(resId), resId);
+ registerResource(createResource(resId), resId);
}
/**
@@ -87,6 +88,15 @@ public class AsyncPreloadResourceLoader extends ResourceLoader {
mOutstandingLoads.put(resId, task);
}
+ private Resource createResource(int resId) {
+ try {
+ TraceEvent.begin("AsyncPreloadResourceLoader.createResource");
+ return mCreator.create(resId);
+ } finally {
+ TraceEvent.end("AsyncPreloadResourceLoader.createResource");
+ }
+ }
+
private void registerResource(Resource resource, int resourceId) {
notifyLoadFinished(resourceId, resource);
if (resource != null) resource.getBitmap().recycle();
@@ -102,7 +112,7 @@ public class AsyncPreloadResourceLoader extends ResourceLoader {
@Override
protected Resource doInBackground(Void... params) {
- return mCreator.create(mResourceId);
+ return createResource(mResourceId);
}
@Override
@@ -113,4 +123,4 @@ public class AsyncPreloadResourceLoader extends ResourceLoader {
registerResource(resource, mResourceId);
}
}
-} \ No newline at end of file
+}
diff --git a/ui/android/java/src/org/chromium/ui/resources/system/SystemResourceLoader.java b/ui/android/java/src/org/chromium/ui/resources/system/SystemResourceLoader.java
index 2f74ce9..b49eed7 100644
--- a/ui/android/java/src/org/chromium/ui/resources/system/SystemResourceLoader.java
+++ b/ui/android/java/src/org/chromium/ui/resources/system/SystemResourceLoader.java
@@ -13,9 +13,9 @@ import android.graphics.Paint.Style;
import android.graphics.RectF;
import org.chromium.ui.R;
-import org.chromium.ui.base.SystemUIResourceType;
import org.chromium.ui.gfx.DeviceDisplayInfo;
import org.chromium.ui.resources.Resource;
+import org.chromium.ui.resources.SystemUIResourceType;
import org.chromium.ui.resources.async.AsyncPreloadResourceLoader;
import org.chromium.ui.resources.statics.StaticResource;
diff --git a/ui/android/resources/resource_manager.cc b/ui/android/resources/resource_manager.cc
index a27ea6e..2117572 100644
--- a/ui/android/resources/resource_manager.cc
+++ b/ui/android/resources/resource_manager.cc
@@ -4,11 +4,6 @@
#include "ui/android/resources/resource_manager.h"
-#include "base/android/jni_string.h"
-#include "jni/ResourceManager_jni.h"
-#include "ui/android/resources/ui_resource_android.h"
-#include "ui/android/resources/ui_resource_provider.h"
-#include "ui/gfx/android/java_bitmap.h"
#include "ui/gfx/geometry/insets_f.h"
namespace ui {
@@ -19,12 +14,12 @@ ResourceManager::Resource::Resource() {
ResourceManager::Resource::~Resource() {
}
-gfx::Rect ResourceManager::Resource::Border(const gfx::Size& bounds) {
+gfx::Rect ResourceManager::Resource::Border(const gfx::Size& bounds) const {
return Border(bounds, gfx::InsetsF(1.f, 1.f, 1.f, 1.f));
}
gfx::Rect ResourceManager::Resource::Border(const gfx::Size& bounds,
- const gfx::InsetsF& scale) {
+ const gfx::InsetsF& scale) const {
// Calculate whether or not we need to scale down the border if the bounds of
// the layer are going to be smaller than the aperture padding.
float x_scale = std::min((float)bounds.width() / size.width(), 1.f);
@@ -40,117 +35,4 @@ gfx::Rect ResourceManager::Resource::Border(const gfx::Size& bounds,
(size.height() - aperture.height()) * bottom_scale);
}
-// static
-ResourceManager* ResourceManager::FromJavaObject(jobject jobj) {
- return reinterpret_cast<ResourceManager*>(Java_ResourceManager_getNativePtr(
- base::android::AttachCurrentThread(), jobj));
-}
-
-ResourceManager::ResourceManager(ui::UIResourceProvider* ui_resource_provider)
- : ui_resource_provider_(ui_resource_provider) {
- JNIEnv* env = base::android::AttachCurrentThread();
- java_obj_.Reset(env, Java_ResourceManager_create(
- env, base::android::GetApplicationContext(),
- reinterpret_cast<intptr_t>(this)).obj());
- DCHECK(!java_obj_.is_null());
-}
-
-ResourceManager::~ResourceManager() {
- Java_ResourceManager_destroy(base::android::AttachCurrentThread(),
- java_obj_.obj());
-}
-
-base::android::ScopedJavaLocalRef<jobject> ResourceManager::GetJavaObject(
- JNIEnv* env) {
- return base::android::ScopedJavaLocalRef<jobject>(java_obj_);
-}
-
-cc::UIResourceId ResourceManager::GetUIResourceId(AndroidResourceType res_type,
- int res_id) {
- ui::ResourceManager::Resource* resource = GetResource(res_type, res_id);
- if (!resource->ui_resource)
- return 0;
- return resource->ui_resource->id();
-}
-
-ResourceManager::Resource* ResourceManager::GetResource(
- AndroidResourceType res_type,
- int res_id) {
- DCHECK_GE(res_type, ANDROID_RESOURCE_TYPE_FIRST);
- DCHECK_LE(res_type, ANDROID_RESOURCE_TYPE_LAST);
-
- Resource* resource = resources_[res_type].Lookup(res_id);
-
- if (!resource || res_type == ANDROID_RESOURCE_TYPE_DYNAMIC ||
- res_type == ANDROID_RESOURCE_TYPE_DYNAMIC_BITMAP) {
- RequestResourceFromJava(res_type, res_id);
- resource = resources_[res_type].Lookup(res_id);
- }
-
- return resource;
-}
-
-void ResourceManager::PreloadResource(AndroidResourceType res_type,
- int res_id) {
- DCHECK_GE(res_type, ANDROID_RESOURCE_TYPE_FIRST);
- DCHECK_LE(res_type, ANDROID_RESOURCE_TYPE_LAST);
-
- // Don't send out a query if the resource is already loaded.
- if (resources_[res_type].Lookup(res_id))
- return;
-
- PreloadResourceFromJava(res_type, res_id);
-}
-
-void ResourceManager::OnResourceReady(JNIEnv* env,
- jobject jobj,
- jint res_type,
- jint res_id,
- jobject bitmap,
- jint padding_left,
- jint padding_top,
- jint padding_right,
- jint padding_bottom,
- jint aperture_left,
- jint aperture_top,
- jint aperture_right,
- jint aperture_bottom) {
- DCHECK_GE(res_type, ANDROID_RESOURCE_TYPE_FIRST);
- DCHECK_LE(res_type, ANDROID_RESOURCE_TYPE_LAST);
-
- Resource* resource = resources_[res_type].Lookup(res_id);
- if (!resource) {
- resource = new Resource();
- resources_[res_type].AddWithID(resource, res_id);
- }
-
- gfx::JavaBitmap jbitmap(bitmap);
- resource->size = jbitmap.size();
- resource->padding.SetRect(padding_left, padding_top,
- padding_right - padding_left,
- padding_bottom - padding_top);
- resource->aperture.SetRect(aperture_left, aperture_top,
- aperture_right - aperture_left,
- aperture_bottom - aperture_top);
- resource->ui_resource =
- UIResourceAndroid::CreateFromJavaBitmap(ui_resource_provider_, jbitmap);
-}
-
-// static
-bool ResourceManager::RegisterResourceManager(JNIEnv* env) {
- return RegisterNativesImpl(env);
-}
-
-void ResourceManager::PreloadResourceFromJava(AndroidResourceType res_type,
- int res_id) {
- Java_ResourceManager_preloadResource(base::android::AttachCurrentThread(),
- java_obj_.obj(), res_type, res_id);
-}
-
-void ResourceManager::RequestResourceFromJava(AndroidResourceType res_type,
- int res_id) {
- Java_ResourceManager_resourceRequested(base::android::AttachCurrentThread(),
- java_obj_.obj(), res_type, res_id);
-}
-
} // namespace ui
diff --git a/ui/android/resources/resource_manager.h b/ui/android/resources/resource_manager.h
index c11e058..dbd19b3 100644
--- a/ui/android/resources/resource_manager.h
+++ b/ui/android/resources/resource_manager.h
@@ -5,14 +5,13 @@
#ifndef UI_ANDROID_RESOURCES_RESOURCE_MANAGER_H_
#define UI_ANDROID_RESOURCES_RESOURCE_MANAGER_H_
-#include <string>
-
#include "base/android/jni_android.h"
-#include "base/id_map.h"
+#include "base/memory/scoped_ptr.h"
#include "cc/resources/ui_resource_client.h"
+#include "ui/android/resources/ui_resource_android.h"
#include "ui/android/ui_android_export.h"
-#include "ui/base/android/system_ui_resource_type.h"
#include "ui/gfx/geometry/rect.h"
+#include "ui/gfx/geometry/size.h"
namespace ui {
@@ -32,15 +31,16 @@ enum AndroidResourceType {
ANDROID_RESOURCE_TYPE_LAST = ANDROID_RESOURCE_TYPE_SYSTEM,
};
-// TODO(jdduke): Make ResourceManager a pure interface, crbug/426939.
+// The ResourceManager serves as a cache for resources obtained through Android
+// APIs and consumed by the compositor.
class UI_ANDROID_EXPORT ResourceManager {
public:
struct Resource {
public:
Resource();
~Resource();
- gfx::Rect Border(const gfx::Size& bounds);
- gfx::Rect Border(const gfx::Size& bounds, const gfx::InsetsF& scale);
+ gfx::Rect Border(const gfx::Size& bounds) const;
+ gfx::Rect Border(const gfx::Size& bounds, const gfx::InsetsF& scale) const;
scoped_ptr<UIResourceAndroid> ui_resource;
gfx::Size size;
@@ -48,53 +48,28 @@ class UI_ANDROID_EXPORT ResourceManager {
gfx::Rect aperture;
};
- static ResourceManager* FromJavaObject(jobject jobj);
-
- explicit ResourceManager(ui::UIResourceProvider* ui_resource_provider);
- virtual ~ResourceManager();
-
- base::android::ScopedJavaLocalRef<jobject> GetJavaObject(JNIEnv* env);
-
- virtual cc::UIResourceId GetUIResourceId(AndroidResourceType res_type,
- int res_id);
- ResourceManager::Resource* GetResource(AndroidResourceType res_type,
- int res_id);
- virtual void PreloadResource(AndroidResourceType res_type, int res_id);
-
- // Called from Java ----------------------------------------------------------
- void OnResourceReady(JNIEnv* env,
- jobject jobj,
- jint res_type,
- jint res_id,
- jobject bitmap,
- jint padding_left,
- jint padding_top,
- jint padding_right,
- jint padding_bottom,
- jint aperture_left,
- jint aperture_top,
- jint aperture_right,
- jint aperture_bottom);
-
- static bool RegisterResourceManager(JNIEnv* env);
-
- private:
- friend class TestResourceManager;
-
- // Start loading the resource. virtual for testing.
- virtual void PreloadResourceFromJava(AndroidResourceType res_type,
- int res_id);
- virtual void RequestResourceFromJava(AndroidResourceType res_type,
- int res_id);
+ // Obtain a handle to the Java ResourceManager counterpart.
+ virtual base::android::ScopedJavaLocalRef<jobject> GetJavaObject() = 0;
- typedef IDMap<Resource, IDMapOwnPointer> ResourceMap;
+ // Return a handle to the resource specified by |res_type| and |res_id|.
+ // If the resource has not been loaded, loading will be performed
+ // synchronously, blocking until the load completes.
+ // If load fails, a null handle will be returned and it is up to the caller
+ // to react appropriately.
+ virtual Resource* GetResource(AndroidResourceType res_type, int res_id) = 0;
- ui::UIResourceProvider* ui_resource_provider_;
- ResourceMap resources_[ANDROID_RESOURCE_TYPE_COUNT];
+ // Trigger asynchronous loading of the resource specified by |res_type| and
+ // |res_id|, if it has not yet been loaded.
+ virtual void PreloadResource(AndroidResourceType res_type, int res_id) = 0;
- base::android::ScopedJavaGlobalRef<jobject> java_obj_;
+ // Convenience wrapper method.
+ cc::UIResourceId GetUIResourceId(AndroidResourceType res_type, int res_id) {
+ Resource* resource = GetResource(res_type, res_id);
+ return resource && resource->ui_resource ? resource->ui_resource->id() : 0;
+ }
- DISALLOW_COPY_AND_ASSIGN(ResourceManager);
+ protected:
+ virtual ~ResourceManager() {}
};
} // namespace ui
diff --git a/ui/android/resources/resource_manager_impl.cc b/ui/android/resources/resource_manager_impl.cc
new file mode 100644
index 0000000..02275ef
--- /dev/null
+++ b/ui/android/resources/resource_manager_impl.cc
@@ -0,0 +1,132 @@
+// Copyright 2014 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/resources/resource_manager_impl.h"
+
+#include "base/android/jni_string.h"
+#include "base/debug/trace_event.h"
+#include "jni/ResourceManager_jni.h"
+#include "ui/android/resources/ui_resource_android.h"
+#include "ui/android/resources/ui_resource_provider.h"
+#include "ui/gfx/android/java_bitmap.h"
+
+namespace ui {
+
+// static
+ResourceManagerImpl* ResourceManagerImpl::FromJavaObject(jobject jobj) {
+ return reinterpret_cast<ResourceManagerImpl*>(
+ Java_ResourceManager_getNativePtr(base::android::AttachCurrentThread(),
+ jobj));
+}
+
+ResourceManagerImpl::ResourceManagerImpl(
+ ui::UIResourceProvider* ui_resource_provider)
+ : ui_resource_provider_(ui_resource_provider) {
+ JNIEnv* env = base::android::AttachCurrentThread();
+ java_obj_.Reset(env, Java_ResourceManager_create(
+ env, base::android::GetApplicationContext(),
+ reinterpret_cast<intptr_t>(this)).obj());
+ DCHECK(!java_obj_.is_null());
+}
+
+ResourceManagerImpl::~ResourceManagerImpl() {
+ Java_ResourceManager_destroy(base::android::AttachCurrentThread(),
+ java_obj_.obj());
+}
+
+base::android::ScopedJavaLocalRef<jobject>
+ResourceManagerImpl::GetJavaObject() {
+ return base::android::ScopedJavaLocalRef<jobject>(java_obj_);
+}
+
+ResourceManager::Resource* ResourceManagerImpl::GetResource(
+ AndroidResourceType res_type,
+ int res_id) {
+ DCHECK_GE(res_type, ANDROID_RESOURCE_TYPE_FIRST);
+ DCHECK_LE(res_type, ANDROID_RESOURCE_TYPE_LAST);
+
+ Resource* resource = resources_[res_type].Lookup(res_id);
+
+ if (!resource || res_type == ANDROID_RESOURCE_TYPE_DYNAMIC ||
+ res_type == ANDROID_RESOURCE_TYPE_DYNAMIC_BITMAP) {
+ RequestResourceFromJava(res_type, res_id);
+ resource = resources_[res_type].Lookup(res_id);
+ }
+
+ return resource;
+}
+
+void ResourceManagerImpl::PreloadResource(AndroidResourceType res_type,
+ int res_id) {
+ DCHECK_GE(res_type, ANDROID_RESOURCE_TYPE_FIRST);
+ DCHECK_LE(res_type, ANDROID_RESOURCE_TYPE_LAST);
+
+ // Don't send out a query if the resource is already loaded.
+ if (resources_[res_type].Lookup(res_id))
+ return;
+
+ PreloadResourceFromJava(res_type, res_id);
+}
+
+void ResourceManagerImpl::OnResourceReady(JNIEnv* env,
+ jobject jobj,
+ jint res_type,
+ jint res_id,
+ jobject bitmap,
+ jint padding_left,
+ jint padding_top,
+ jint padding_right,
+ jint padding_bottom,
+ jint aperture_left,
+ jint aperture_top,
+ jint aperture_right,
+ jint aperture_bottom) {
+ DCHECK_GE(res_type, ANDROID_RESOURCE_TYPE_FIRST);
+ DCHECK_LE(res_type, ANDROID_RESOURCE_TYPE_LAST);
+ TRACE_EVENT2("ui", "ResourceManagerImpl::OnResourceReady",
+ "resource_type", res_type,
+ "resource_id", res_id);
+
+ Resource* resource = resources_[res_type].Lookup(res_id);
+ if (!resource) {
+ resource = new Resource();
+ resources_[res_type].AddWithID(resource, res_id);
+ }
+
+ gfx::JavaBitmap jbitmap(bitmap);
+ resource->size = jbitmap.size();
+ resource->padding.SetRect(padding_left, padding_top,
+ padding_right - padding_left,
+ padding_bottom - padding_top);
+ resource->aperture.SetRect(aperture_left, aperture_top,
+ aperture_right - aperture_left,
+ aperture_bottom - aperture_top);
+ resource->ui_resource =
+ UIResourceAndroid::CreateFromJavaBitmap(ui_resource_provider_, jbitmap);
+}
+
+// static
+bool ResourceManagerImpl::RegisterResourceManager(JNIEnv* env) {
+ return RegisterNativesImpl(env);
+}
+
+void ResourceManagerImpl::PreloadResourceFromJava(AndroidResourceType res_type,
+ int res_id) {
+ TRACE_EVENT2("ui", "ResourceManagerImpl::PreloadResourceFromJava",
+ "resource_type", res_type,
+ "resource_id", res_id);
+ Java_ResourceManager_preloadResource(base::android::AttachCurrentThread(),
+ java_obj_.obj(), res_type, res_id);
+}
+
+void ResourceManagerImpl::RequestResourceFromJava(AndroidResourceType res_type,
+ int res_id) {
+ TRACE_EVENT2("ui", "ResourceManagerImpl::RequestResourceFromJava",
+ "resource_type", res_type,
+ "resource_id", res_id);
+ Java_ResourceManager_resourceRequested(base::android::AttachCurrentThread(),
+ java_obj_.obj(), res_type, res_id);
+}
+
+} // namespace ui
diff --git a/ui/android/resources/resource_manager_impl.h b/ui/android/resources/resource_manager_impl.h
new file mode 100644
index 0000000..9f3388d
--- /dev/null
+++ b/ui/android/resources/resource_manager_impl.h
@@ -0,0 +1,66 @@
+// Copyright 2014 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_RESOURCES_RESOURCE_MANAGER_IMPL_H_
+#define UI_ANDROID_RESOURCES_RESOURCE_MANAGER_IMPL_H_
+
+#include "base/id_map.h"
+#include "ui/android/resources/resource_manager.h"
+#include "ui/android/ui_android_export.h"
+#include "ui/gfx/geometry/rect.h"
+
+namespace ui {
+
+class UI_ANDROID_EXPORT ResourceManagerImpl : public ResourceManager {
+ public:
+ static ResourceManagerImpl* FromJavaObject(jobject jobj);
+
+ explicit ResourceManagerImpl(ui::UIResourceProvider* ui_resource_provider);
+ ~ResourceManagerImpl() override;
+
+ // ResourceManager implementation.
+ base::android::ScopedJavaLocalRef<jobject> GetJavaObject() override;
+ Resource* GetResource(AndroidResourceType res_type, int res_id) override;
+ void PreloadResource(AndroidResourceType res_type, int res_id) override;
+
+ // Called from Java
+ // ----------------------------------------------------------
+ void OnResourceReady(JNIEnv* env,
+ jobject jobj,
+ jint res_type,
+ jint res_id,
+ jobject bitmap,
+ jint padding_left,
+ jint padding_top,
+ jint padding_right,
+ jint padding_bottom,
+ jint aperture_left,
+ jint aperture_top,
+ jint aperture_right,
+ jint aperture_bottom);
+
+ static bool RegisterResourceManager(JNIEnv* env);
+
+ private:
+ friend class TestResourceManagerImpl;
+
+ // Start loading the resource. virtual for testing.
+ virtual void PreloadResourceFromJava(AndroidResourceType res_type,
+ int res_id);
+ virtual void RequestResourceFromJava(AndroidResourceType res_type,
+ int res_id);
+
+ typedef IDMap<Resource, IDMapOwnPointer> ResourceMap;
+
+ ui::UIResourceProvider* const ui_resource_provider_;
+ ResourceMap resources_[ANDROID_RESOURCE_TYPE_COUNT];
+
+ base::android::ScopedJavaGlobalRef<jobject> java_obj_;
+
+ DISALLOW_COPY_AND_ASSIGN(ResourceManagerImpl);
+};
+
+} // namespace ui
+
+#endif // UI_ANDROID_RESOURCES_RESOURCE_MANAGER_IMPL_H_
diff --git a/ui/android/resources/resource_manager_unittest.cc b/ui/android/resources/resource_manager_impl_unittest.cc
index fa8f3e0..1b1a2c1 100644
--- a/ui/android/resources/resource_manager_unittest.cc
+++ b/ui/android/resources/resource_manager_impl_unittest.cc
@@ -6,27 +6,20 @@
#include "testing/gtest/include/gtest/gtest.h"
#include "third_party/skia/include/core/SkBitmap.h"
#include "third_party/skia/include/core/SkCanvas.h"
-#include "ui/android/resources/resource_manager.h"
+#include "ui/android/resources/resource_manager_impl.h"
+#include "ui/android/resources/system_ui_resource_type.h"
#include "ui/android/resources/ui_resource_client_android.h"
#include "ui/android/resources/ui_resource_provider.h"
#include "ui/gfx/android/java_bitmap.h"
namespace ui {
-class TestResourceManager : public ResourceManager {
+class TestResourceManagerImpl : public ResourceManagerImpl {
public:
- TestResourceManager(UIResourceProvider* provider)
- : ResourceManager(provider) {}
+ explicit TestResourceManagerImpl(UIResourceProvider* provider)
+ : ResourceManagerImpl(provider) {}
- virtual ~TestResourceManager() {}
-
- virtual void PreloadResourceFromJava(AndroidResourceType res_type,
- int res_id) override {}
-
- virtual void RequestResourceFromJava(AndroidResourceType res_type,
- int res_id) override {
- SetResourceAsLoaded(res_type, res_id);
- }
+ virtual ~TestResourceManagerImpl() {}
void SetResourceAsLoaded(AndroidResourceType res_type, int res_id) {
SkBitmap small_bitmap;
@@ -40,6 +33,15 @@ class TestResourceManager : public ResourceManager {
gfx::ConvertToJavaBitmap(&small_bitmap).obj(), 0, 0, 0, 0,
0, 0, 0, 0);
}
+
+ protected:
+ void PreloadResourceFromJava(AndroidResourceType res_type,
+ int res_id) override {}
+
+ void RequestResourceFromJava(AndroidResourceType res_type,
+ int res_id) override {
+ SetResourceAsLoaded(res_type, res_id);
+ }
};
namespace {
@@ -84,7 +86,7 @@ class MockUIResourceProvider : public ui::UIResourceProvider {
void LayerTreeHostReturned() { has_layer_tree_host_ = true; }
- TestResourceManager& GetResourceManager() { return resource_manager_; }
+ TestResourceManagerImpl& GetResourceManager() { return resource_manager_; }
cc::UIResourceId next_ui_resource_id() const { return next_ui_resource_id_; }
@@ -97,7 +99,7 @@ class MockUIResourceProvider : public ui::UIResourceProvider {
bool has_layer_tree_host_;
// The UIResourceProvider owns the ResourceManager.
- TestResourceManager resource_manager_;
+ TestResourceManagerImpl resource_manager_;
};
} // namespace
diff --git a/ui/base/android/system_ui_resource_type.h b/ui/android/resources/system_ui_resource_type.h
index 6b70114d..f6ffcaf 100644
--- a/ui/base/android/system_ui_resource_type.h
+++ b/ui/android/resources/system_ui_resource_type.h
@@ -2,23 +2,21 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#ifndef UI_BASE_ANDROID_SYSTEM_UI_RESOURCE_TYPE_H_
-#define UI_BASE_ANDROID_SYSTEM_UI_RESOURCE_TYPE_H_
+#ifndef UI_ANDROID_RESOURCES_SYSTEM_UI_RESOURCE_TYPE_H_
+#define UI_ANDROID_RESOURCES_SYSTEM_UI_RESOURCE_TYPE_H_
namespace ui {
// A Java counterpart will be generated for this enum.
-// GENERATED_JAVA_ENUM_PACKAGE: org.chromium.ui.base
+// GENERATED_JAVA_ENUM_PACKAGE: org.chromium.ui.resources
enum SystemUIResourceType {
OVERSCROLL_EDGE,
OVERSCROLL_GLOW,
OVERSCROLL_GLOW_L,
OVERSCROLL_REFRESH_IDLE,
- OVERSCROLL_REFRESH_ACTIVE,
- SYSTEM_UI_RESOURCE_TYPE_FIRST = OVERSCROLL_EDGE,
- SYSTEM_UI_RESOURCE_TYPE_LAST = OVERSCROLL_REFRESH_ACTIVE
+ OVERSCROLL_REFRESH_ACTIVE
};
} // namespace ui
-#endif // UI_BASE_ANDROID_SYSTEM_UI_RESOURCE_TYPE_H_
+#endif // UI_ANDROID_RESOURCES_SYSTEM_UI_RESOURCE_TYPE_H_
diff --git a/ui/android/resources/ui_resource_android.h b/ui/android/resources/ui_resource_android.h
index 3f5e55c..60f7888 100644
--- a/ui/android/resources/ui_resource_android.h
+++ b/ui/android/resources/ui_resource_android.h
@@ -8,7 +8,6 @@
#include "base/basictypes.h"
#include "cc/resources/ui_resource_bitmap.h"
#include "third_party/skia/include/core/SkBitmap.h"
-#include "ui/android/resources/ui_resource_android.h"
#include "ui/android/resources/ui_resource_client_android.h"
#include "ui/android/ui_android_export.h"
#include "ui/gfx/android/java_bitmap.h"
diff --git a/ui/android/ui_android.gyp b/ui/android/ui_android.gyp
index 943b41b..4621233 100644
--- a/ui/android/ui_android.gyp
+++ b/ui/android/ui_android.gyp
@@ -25,6 +25,8 @@
'sources' : [
'resources/resource_manager.cc',
'resources/resource_manager.h',
+ 'resources/resource_manager_impl.cc',
+ 'resources/resource_manager_impl.h',
'resources/ui_resource_android.cc',
'resources/ui_resource_android.h',
'resources/ui_resource_client_android.h',
@@ -74,7 +76,7 @@
'target_name': 'system_ui_resource_type_java',
'type': 'none',
'variables': {
- 'source_file': '../base/android/system_ui_resource_type.h',
+ 'source_file': 'resources/system_ui_resource_type.h',
},
'includes': [ '../../build/android/java_cpp_enum.gypi' ],
},
@@ -165,7 +167,7 @@
'ui_android',
],
'sources': [
- 'resources/resource_manager_unittest.cc',
+ 'resources/resource_manager_impl_unittest.cc',
'run_all_unittests.cc',
],
},
diff --git a/ui/android/ui_android_jni_registrar.cc b/ui/android/ui_android_jni_registrar.cc
index e0e1fd6..734dc9f 100644
--- a/ui/android/ui_android_jni_registrar.cc
+++ b/ui/android/ui_android_jni_registrar.cc
@@ -6,12 +6,12 @@
#include "base/android/jni_android.h"
#include "base/android/jni_registrar.h"
-#include "ui/android/resources/resource_manager.h"
+#include "ui/android/resources/resource_manager_impl.h"
namespace ui {
static base::android::RegistrationMethod kAndroidRegisteredMethods[] = {
- {"ResourceManager", ui::ResourceManager::RegisterResourceManager},
+ {"ResourceManager", ui::ResourceManagerImpl::RegisterResourceManager},
};
bool RegisterUIAndroidJni(JNIEnv* env) {