diff options
author | jdduke <jdduke@chromium.org> | 2014-12-19 15:39:49 -0800 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2014-12-19 23:41:02 +0000 |
commit | 282f5e18d266541f69bfd79b01257e490b00d9b0 (patch) | |
tree | 741fe586bba0d0c76c523c02c6cb475d0a18d78c | |
parent | 93761d507b748c31730eb86ad5fd6e16d5d459af (diff) | |
download | chromium_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}
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) { |