Index: chrome/browser/android/compositor/scene_layer/reader_mode_scene_layer.cc |
diff --git a/chrome/browser/android/compositor/scene_layer/reader_mode_scene_layer.cc b/chrome/browser/android/compositor/scene_layer/reader_mode_scene_layer.cc |
index c4165671d201e49851263746e4f518f152f574fe..16e41d87fe21bc25004ea97e0616d2d87bd9f6f4 100644 |
--- a/chrome/browser/android/compositor/scene_layer/reader_mode_scene_layer.cc |
+++ b/chrome/browser/android/compositor/scene_layer/reader_mode_scene_layer.cc |
@@ -6,7 +6,9 @@ |
#include "base/android/jni_android.h" |
#include "base/android/jni_array.h" |
+#include "cc/layers/solid_color_layer.h" |
#include "chrome/browser/android/compositor/layer/reader_mode_layer.h" |
+#include "content/public/browser/android/compositor.h" |
#include "content/public/browser/android/content_view_core.h" |
#include "jni/ReaderModeSceneLayer_jni.h" |
#include "ui/android/resources/resource_manager_impl.h" |
@@ -16,7 +18,13 @@ namespace chrome { |
namespace android { |
ReaderModeSceneLayer::ReaderModeSceneLayer(JNIEnv* env, jobject jobj) |
- : SceneLayer(env, jobj) { |
+ : SceneLayer(env, jobj), |
+ base_page_brightness_(1.0f), |
+ content_container_(cc::Layer::Create()) { |
+ // Responsible for moving the base page without modifying the layer itself. |
+ content_container_->SetIsDrawable(true); |
+ content_container_->SetPosition(gfx::PointF(0.0f, 0.0f)); |
+ layer()->AddChild(content_container_); |
} |
ReaderModeSceneLayer::~ReaderModeSceneLayer() { |
@@ -29,7 +37,11 @@ void ReaderModeSceneLayer::CreateReaderModeLayer( |
ui::ResourceManager* resource_manager = |
ui::ResourceManagerImpl::FromJavaObject(jresource_manager); |
reader_mode_layer_ = ReaderModeLayer::Create(resource_manager); |
- layer_->AddChild(reader_mode_layer_->layer()); |
+ |
+ // The Reader Mode layer is initially invisible. |
+ reader_mode_layer_->layer()->SetHideLayerAndSubtree(true); |
+ |
+ layer()->AddChild(reader_mode_layer_->layer()); |
} |
void ReaderModeSceneLayer::SetResourceIds( |
@@ -53,6 +65,8 @@ void ReaderModeSceneLayer::Update( |
JNIEnv* env, |
const JavaParamRef<jobject>& object, |
jfloat dp_to_px, |
+ jfloat base_page_brightness, |
+ jfloat base_page_offset, |
const JavaParamRef<jobject>& jcontent_view_core, |
jfloat panel_X, |
jfloat panel_y, |
@@ -73,6 +87,20 @@ void ReaderModeSceneLayer::Update( |
: content::ContentViewCore::GetNativeContentViewCore( |
env, jcontent_view_core); |
+ // Fade the base page out. |
+ if (base_page_brightness_ != base_page_brightness) { |
+ base_page_brightness_ = base_page_brightness; |
+ cc::FilterOperations filters; |
+ if (base_page_brightness < 1.f) { |
+ filters.Append( |
+ cc::FilterOperation::CreateBrightnessFilter(base_page_brightness)); |
+ } |
+ content_container_->SetFilters(filters); |
+ } |
+ |
+ // Move the base page contents up. |
+ content_container_->SetPosition(gfx::PointF(0.0f, base_page_offset)); |
+ |
reader_mode_layer_->SetProperties( |
dp_to_px, |
content_view_core, |
@@ -87,6 +115,36 @@ void ReaderModeSceneLayer::Update( |
bar_border_height, |
bar_shadow_visible, |
bar_shadow_opacity); |
+ |
+ // Make the layer visible if it is not already. |
+ reader_mode_layer_->layer()->SetHideLayerAndSubtree(false); |
+} |
+ |
+void ReaderModeSceneLayer::SetContentTree( |
+ JNIEnv* env, |
+ const JavaParamRef<jobject>& jobj, |
+ const JavaParamRef<jobject>& jcontent_tree) { |
+ SceneLayer* content_tree = FromJavaObject(env, jcontent_tree); |
+ if (!content_tree || !content_tree->layer()) return; |
+ |
+ if (!content_tree->layer()->parent() |
+ || (content_tree->layer()->parent()->id() != content_container_->id())) { |
+ content_container_->AddChild(content_tree->layer()); |
+ } |
+} |
+ |
+void ReaderModeSceneLayer::HideTree(JNIEnv* env, |
+ const JavaParamRef<jobject>& jobj) { |
+ // TODO(mdjones): Create super class for this logic. |
+ if (reader_mode_layer_) { |
+ reader_mode_layer_->layer()->SetHideLayerAndSubtree(true); |
+ } |
+ // Reset base page brightness. |
+ cc::FilterOperations filters; |
+ filters.Append(cc::FilterOperation::CreateBrightnessFilter(1.0f)); |
+ content_container_->SetFilters(filters); |
+ // Reset base page offset. |
+ content_container_->SetPosition(gfx::PointF(0.0f, 0.0f)); |
} |
static jlong Init(JNIEnv* env, const JavaParamRef<jobject>& jobj) { |