Index: ui/base/android/system_ui_resource_manager.cc |
diff --git a/ui/base/android/system_ui_resource_manager.cc b/ui/base/android/system_ui_resource_manager.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..f890d5263118efd7ad9ae666a4d0f1c8043baac5 |
--- /dev/null |
+++ b/ui/base/android/system_ui_resource_manager.cc |
@@ -0,0 +1,97 @@ |
+// 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/base/android/system_ui_resource_manager.h" |
+ |
+#include "ui/base/android/system_ui_resource_layer.h" |
+ |
+namespace ui { |
+ |
+SystemUIResourceManager::SystemUIResourceManager() |
+ : ui_resource_provider_(NULL) { |
+} |
+ |
+void SystemUIResourceManager::Subscribe(SystemUIResource::Type type, |
+ SystemUIResourceLayer* layer) { |
+ DCHECK(layer); |
+ GetData(type)->Subscribe(layer); |
+} |
+ |
+void SystemUIResourceManager::Unsubscribe(SystemUIResource::Type type, |
+ SystemUIResourceLayer* layer) { |
+ DCHECK(layer); |
+ GetData(type)->Unsubscribe(layer); |
+} |
+ |
+void SystemUIResourceManager::RefreshResourceOnSubscribers( |
+ SystemUIResource::Type type) { |
+ GetData(type)->RefreshResource(); |
+} |
+ |
+SystemUIResourceManager::Data* SystemUIResourceManager::GetData( |
+ SystemUIResource::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); |
+} |
+ |
+UIResourceProvider* SystemUIResourceManager::GetUIResourceProvider() { |
+ return ui_resource_provider_; |
+} |
+ |
+SystemUIResourceManager::Data::Data() { |
+} |
+ |
+SystemUIResourceManager::Data::~Data() { |
+ if (resource_) |
+ resource_->SetClient(NULL); |
+} |
+ |
+void SystemUIResourceManager::Data::Subscribe(SystemUIResourceLayer* layer) { |
+ DCHECK(layer); |
+ if (resource_) |
+ layer->SetUIResourceId(resource_->id()); |
+ |
+ if (!subscribers_.HasObserver(layer)) |
+ subscribers_.AddObserver(layer); |
+} |
+ |
+void SystemUIResourceManager::Data::Unsubscribe(SystemUIResourceLayer* layer) { |
+ DCHECK(layer); |
+ layer->SetUIResourceId(0); |
+ subscribers_.RemoveObserver(layer); |
+} |
+ |
+void SystemUIResourceManager::Data::SetResource( |
+ scoped_ptr<SystemUIResource> resource) { |
+ DCHECK(resource); |
+ resource_ = resource.Pass(); |
+ resource_->SetClient(this); |
+ |
+ RefreshResource(); |
+} |
+ |
+void SystemUIResourceManager::Data::RefreshResource() { |
+ if(!resource_) |
+ return; |
+ |
+ resource_->Load(); |
+ FOR_EACH_OBSERVER( |
+ SystemUIResourceLayer, subscribers_, SetUIResourceId(resource_->id())); |
+} |
+ |
+void SystemUIResourceManager::Data::OnUIResourceIdChanged() { |
+ DCHECK(resource_); |
+ |
+ FOR_EACH_OBSERVER( |
+ SystemUIResourceLayer, subscribers_, SetUIResourceId(resource_->id())); |
+} |
+ |
+} // namespace ui |