Chromium Code Reviews| Index: content/browser/android/system_ui_resource_manager_impl.cc |
| diff --git a/content/browser/android/system_ui_resource_manager_impl.cc b/content/browser/android/system_ui_resource_manager_impl.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..8653ed8046aceff7ad76982c2cae6d81adcf886b |
| --- /dev/null |
| +++ b/content/browser/android/system_ui_resource_manager_impl.cc |
| @@ -0,0 +1,154 @@ |
| +// 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 "content/browser/android/system_ui_resource_manager_impl.h" |
| + |
| +#include "base/bind.h" |
| +#include "base/bind_helpers.h" |
| +#include "base/location.h" |
| +#include "base/threading/worker_pool.h" |
| +#include "cc/resources/ui_resource_bitmap.h" |
| +#include "content/browser/android/system_ui_resource.h" |
| +#include "third_party/skia/include/core/SkBitmap.h" |
| +#include "ui/base/android/system_ui_resource_layer.h" |
| +#include "ui/base/android/ui_resource_client_android.h" |
| +#include "ui/base/android/ui_resource_provider.h" |
| +#include "ui/gfx/android/java_bitmap.h" |
| + |
| +namespace content { |
| + |
| +SystemUIResourceManagerImpl::SystemUIResourceManagerImpl( |
| + ui::UIResourceProvider* ui_resource_provider) |
| + : ui_resource_provider_(ui_resource_provider), weak_factory_(this) { |
| +} |
| + |
| +void SystemUIResourceManagerImpl::Subscribe( |
| + ui::SystemUIResourceManager::Type type, |
| + ui::SystemUIResourceLayer* layer) { |
| + DCHECK(layer); |
| + GetData(type)->Subscribe(layer); |
| +} |
| + |
| +void SystemUIResourceManagerImpl::Unsubscribe( |
| + ui::SystemUIResourceManager::Type type, |
| + ui::SystemUIResourceLayer* layer) { |
| + DCHECK(layer); |
| + GetData(type)->Unsubscribe(layer); |
| +} |
| + |
| +void SystemUIResourceManagerImpl::RefreshResourceOnSubscribers( |
| + ui::SystemUIResourceManager::Type type) { |
| + GetData(type)->RefreshResource(); |
| +} |
| + |
| +SystemUIResourceManagerImpl::Data* SystemUIResourceManagerImpl::GetData( |
| + ui::SystemUIResourceManager::Type type) { |
| + SystemUIResourceMap::iterator iter = resource_map_.find(type); |
| + if (iter == resource_map_.end()) { |
| + scoped_ptr<Data> resource_data = make_scoped_ptr(new Data()); |
| + resource_map_.set(type, resource_data.Pass()); |
| + |
| + // Lazily build the resource. |
| + BuildResource(type); |
| + } |
| + return resource_map_.get(type); |
| +} |
| + |
| +void SystemUIResourceManagerImpl::BuildResource( |
| + ui::SystemUIResourceManager::Type type) { |
| + if (GetData(type)->HasResource()) |
|
jdduke (slow)
2014/07/16 19:01:51
Should this be DCHECK(!GetData(type)->HasResource(
powei
2014/07/16 23:33:51
Done.
|
| + return; |
| + |
| + // Instead of blocking the main thread, we post a task to load the bitmap. |
| + SkBitmap* bitmap = new SkBitmap(); |
| + base::Closure load_bitmap = |
| + base::Bind(&SystemUIResourceManagerImpl::LoadBitmap, type, bitmap); |
| + base::Closure finished_load = |
| + base::Bind(&SystemUIResourceManagerImpl::OnFinishedLoadBitmap, |
| + weak_factory_.GetWeakPtr(), |
| + type, |
| + base::Owned(bitmap)); |
| + base::WorkerPool::PostTaskAndReply( |
| + FROM_HERE, load_bitmap, finished_load, true); |
| +} |
| + |
| +void SystemUIResourceManagerImpl::LoadBitmap( |
| + ui::SystemUIResourceManager::Type type, |
| + SkBitmap* bitmap_holder) { |
| + SkBitmap bitmap; |
| + switch (type) { |
| + case ui::SystemUIResourceManager::OVERSCROLL_EDGE: |
| + bitmap = gfx::CreateSkBitmapFromAndroidResource( |
| + "android:drawable/overscroll_edge", gfx::Size(128, 12)); |
| + break; |
| + case ui::SystemUIResourceManager::OVERSCROLL_GLOW: |
| + bitmap = gfx::CreateSkBitmapFromAndroidResource( |
| + "android:drawable/overscroll_glow", gfx::Size(128, 64)); |
| + break; |
| + } |
| + bitmap.setImmutable(); |
| + *bitmap_holder = bitmap; |
| +} |
| + |
| +void SystemUIResourceManagerImpl::OnFinishedLoadBitmap( |
| + ui::SystemUIResourceManager::Type type, |
| + SkBitmap* bitmap_holder) { |
| + scoped_ptr<SystemUIResource> resource = |
| + SystemUIResource::Create(*bitmap_holder, ui_resource_provider_); |
| + GetData(type)->SetResource(resource.Pass()); |
| +} |
| + |
| +SystemUIResourceManagerImpl::Data::Data() { |
| +} |
| + |
| +SystemUIResourceManagerImpl::Data::~Data() { |
| + if (resource_) |
| + resource_->SetClient(NULL); |
| +} |
| + |
| +void SystemUIResourceManagerImpl::Data::Subscribe( |
| + ui::SystemUIResourceLayer* layer) { |
| + DCHECK(layer); |
| + if (resource_) |
| + layer->SetUIResourceId(resource_->id()); |
| + |
| + if (!subscribers_.HasObserver(layer)) |
| + subscribers_.AddObserver(layer); |
| +} |
| + |
| +void SystemUIResourceManagerImpl::Data::Unsubscribe( |
| + ui::SystemUIResourceLayer* layer) { |
| + DCHECK(layer); |
| + layer->SetUIResourceId(0); |
| + subscribers_.RemoveObserver(layer); |
| +} |
| + |
| +void SystemUIResourceManagerImpl::Data::SetResource( |
| + scoped_ptr<SystemUIResource> resource) { |
| + DCHECK(resource); |
|
jdduke (slow)
2014/07/16 19:01:51
also DCHECK(!resource_)?
powei
2014/07/16 23:33:51
Done.
|
| + resource_ = resource.Pass(); |
| + resource_->SetClient(this); |
| + |
| + RefreshResource(); |
| +} |
| + |
| +void SystemUIResourceManagerImpl::Data::RefreshResource() { |
| + if (!resource_) |
| + return; |
| + |
| + resource_->Load(); |
| + FOR_EACH_OBSERVER(ui::SystemUIResourceLayer, |
|
jdduke (slow)
2014/07/16 19:01:51
Shouldn't the loading trigger a call to |OnUIResou
powei
2014/07/16 23:33:51
Done. Now this only happens when the LTH returns.
|
| + subscribers_, |
| + SetUIResourceId(resource_->id())); |
| +} |
| + |
| +void SystemUIResourceManagerImpl::Data::OnUIResourceIdChanged() { |
| + DCHECK(resource_); |
| + |
| + FOR_EACH_OBSERVER(ui::SystemUIResourceLayer, |
| + subscribers_, |
| + SetUIResourceId(resource_->id())); |
| +} |
| + |
| +} // namespace content |