OLD | NEW |
| (Empty) |
1 // Copyright 2016 The Chromium Authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 #include "chrome/browser/android/compositor/scene_layer/reader_mode_scene_layer.
h" | |
6 | |
7 #include "base/android/jni_android.h" | |
8 #include "base/android/jni_array.h" | |
9 #include "cc/layers/solid_color_layer.h" | |
10 #include "chrome/browser/android/compositor/layer/reader_mode_layer.h" | |
11 #include "content/public/browser/android/compositor.h" | |
12 #include "content/public/browser/web_contents.h" | |
13 #include "jni/ReaderModeSceneLayer_jni.h" | |
14 #include "ui/android/resources/resource_manager_impl.h" | |
15 #include "ui/android/view_android.h" | |
16 #include "ui/gfx/android/java_bitmap.h" | |
17 | |
18 using base::android::JavaParamRef; | |
19 | |
20 namespace android { | |
21 | |
22 ReaderModeSceneLayer::ReaderModeSceneLayer(JNIEnv* env, jobject jobj) | |
23 : SceneLayer(env, jobj), | |
24 base_page_brightness_(1.0f), | |
25 content_container_(cc::Layer::Create()) { | |
26 // Responsible for moving the base page without modifying the layer itself. | |
27 content_container_->SetIsDrawable(true); | |
28 content_container_->SetPosition(gfx::PointF(0.0f, 0.0f)); | |
29 layer()->AddChild(content_container_); | |
30 } | |
31 | |
32 ReaderModeSceneLayer::~ReaderModeSceneLayer() { | |
33 } | |
34 | |
35 void ReaderModeSceneLayer::CreateReaderModeLayer( | |
36 JNIEnv* env, | |
37 const JavaParamRef<jobject>& object, | |
38 const JavaParamRef<jobject>& jresource_manager) { | |
39 ui::ResourceManager* resource_manager = | |
40 ui::ResourceManagerImpl::FromJavaObject(jresource_manager); | |
41 reader_mode_layer_ = ReaderModeLayer::Create(resource_manager); | |
42 | |
43 // The Reader Mode layer is initially invisible. | |
44 reader_mode_layer_->layer()->SetHideLayerAndSubtree(true); | |
45 | |
46 layer()->AddChild(reader_mode_layer_->layer()); | |
47 } | |
48 | |
49 void ReaderModeSceneLayer::SetResourceIds( | |
50 JNIEnv* env, | |
51 const JavaParamRef<jobject>& object, | |
52 jint text_resource_id, | |
53 jint bar_background_resource_id, | |
54 jint bar_shadow_resource_id, | |
55 jint panel_icon_resource_id, | |
56 jint close_icon_resource_id) { | |
57 reader_mode_layer_->SetResourceIds( | |
58 text_resource_id, bar_background_resource_id, bar_shadow_resource_id, | |
59 panel_icon_resource_id, close_icon_resource_id, 0); | |
60 } | |
61 | |
62 void ReaderModeSceneLayer::Update( | |
63 JNIEnv* env, | |
64 const JavaParamRef<jobject>& object, | |
65 jfloat dp_to_px, | |
66 jfloat base_page_brightness, | |
67 jfloat base_page_offset, | |
68 const JavaParamRef<jobject>& jweb_contents, | |
69 jfloat panel_X, | |
70 jfloat panel_y, | |
71 jfloat panel_width, | |
72 jfloat panel_height, | |
73 jfloat bar_margin_side, | |
74 jfloat bar_height, | |
75 jfloat text_opacity, | |
76 jboolean bar_border_visible, | |
77 jfloat bar_border_height, | |
78 jboolean bar_shadow_visible, | |
79 jfloat bar_shadow_opacity) { | |
80 // NOTE(mdjones): It is possible to render the panel before content has been | |
81 // created. If this is the case, do not attempt to access the WebContents | |
82 // and instead pass null. | |
83 content::WebContents* web_contents = | |
84 content::WebContents::FromJavaWebContents(jweb_contents); | |
85 | |
86 scoped_refptr<cc::Layer> content_layer = | |
87 web_contents ? web_contents->GetNativeView()->GetLayer() : nullptr; | |
88 | |
89 // Fade the base page out. | |
90 if (base_page_brightness_ != base_page_brightness) { | |
91 base_page_brightness_ = base_page_brightness; | |
92 cc::FilterOperations filters; | |
93 if (base_page_brightness < 1.f) { | |
94 filters.Append( | |
95 cc::FilterOperation::CreateBrightnessFilter(base_page_brightness)); | |
96 } | |
97 content_container_->SetFilters(filters); | |
98 } | |
99 | |
100 // Move the base page contents up. | |
101 content_container_->SetPosition(gfx::PointF(0.0f, base_page_offset)); | |
102 | |
103 reader_mode_layer_->SetProperties( | |
104 dp_to_px, | |
105 content_layer, | |
106 panel_X, | |
107 panel_y, | |
108 panel_width, | |
109 panel_height, | |
110 bar_margin_side, | |
111 bar_height, | |
112 text_opacity, | |
113 bar_border_visible, | |
114 bar_border_height, | |
115 bar_shadow_visible, | |
116 bar_shadow_opacity); | |
117 | |
118 // Make the layer visible if it is not already. | |
119 reader_mode_layer_->layer()->SetHideLayerAndSubtree(false); | |
120 } | |
121 | |
122 void ReaderModeSceneLayer::SetContentTree( | |
123 JNIEnv* env, | |
124 const JavaParamRef<jobject>& jobj, | |
125 const JavaParamRef<jobject>& jcontent_tree) { | |
126 SceneLayer* content_tree = FromJavaObject(env, jcontent_tree); | |
127 if (!content_tree || !content_tree->layer()) return; | |
128 | |
129 if (!content_tree->layer()->parent() | |
130 || (content_tree->layer()->parent()->id() != content_container_->id())) { | |
131 content_container_->AddChild(content_tree->layer()); | |
132 } | |
133 } | |
134 | |
135 void ReaderModeSceneLayer::HideTree(JNIEnv* env, | |
136 const JavaParamRef<jobject>& jobj) { | |
137 // TODO(mdjones): Create super class for this logic. | |
138 if (reader_mode_layer_) { | |
139 reader_mode_layer_->layer()->SetHideLayerAndSubtree(true); | |
140 } | |
141 // Reset base page brightness. | |
142 cc::FilterOperations filters; | |
143 filters.Append(cc::FilterOperation::CreateBrightnessFilter(1.0f)); | |
144 content_container_->SetFilters(filters); | |
145 // Reset base page offset. | |
146 content_container_->SetPosition(gfx::PointF(0.0f, 0.0f)); | |
147 } | |
148 | |
149 static jlong Init(JNIEnv* env, const JavaParamRef<jobject>& jobj) { | |
150 // This will automatically bind to the Java object and pass ownership there. | |
151 ReaderModeSceneLayer* reader_mode_scene_layer = | |
152 new ReaderModeSceneLayer(env, jobj); | |
153 return reinterpret_cast<intptr_t>(reader_mode_scene_layer); | |
154 } | |
155 | |
156 bool RegisterReaderModeSceneLayer(JNIEnv* env) { | |
157 return RegisterNativesImpl(env); | |
158 } | |
159 | |
160 } // namespace android | |
OLD | NEW |