OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/android/compositor/scene_layer/tab_strip_scene_layer.h" | 5 #include "chrome/browser/android/compositor/scene_layer/tab_strip_scene_layer.h" |
6 | 6 |
7 #include "base/android/jni_android.h" | 7 #include "base/android/jni_android.h" |
8 #include "cc/resources/scoped_ui_resource.h" | 8 #include "cc/resources/scoped_ui_resource.h" |
9 #include "chrome/browser/android/compositor/layer/tab_handle_layer.h" | 9 #include "chrome/browser/android/compositor/layer/tab_handle_layer.h" |
10 #include "chrome/browser/android/compositor/layer_title_cache.h" | 10 #include "chrome/browser/android/compositor/layer_title_cache.h" |
11 #include "content/public/browser/android/compositor.h" | 11 #include "content/public/browser/android/compositor.h" |
12 #include "jni/TabStripSceneLayer_jni.h" | 12 #include "jni/TabStripSceneLayer_jni.h" |
13 #include "ui/android/resources/resource_manager_impl.h" | 13 #include "ui/android/resources/resource_manager_impl.h" |
| 14 #include "ui/gfx/transform.h" |
14 | 15 |
15 namespace chrome { | 16 namespace chrome { |
16 namespace android { | 17 namespace android { |
17 | 18 |
18 TabStripSceneLayer::TabStripSceneLayer(JNIEnv* env, jobject jobj) | 19 TabStripSceneLayer::TabStripSceneLayer(JNIEnv* env, jobject jobj) |
19 : SceneLayer(env, jobj), | 20 : SceneLayer(env, jobj), |
20 tab_strip_layer_(cc::SolidColorLayer::Create()), | 21 tab_strip_layer_(cc::SolidColorLayer::Create()), |
| 22 scrollable_strip_layer_(cc::Layer::Create()), |
21 new_tab_button_(cc::UIResourceLayer::Create()), | 23 new_tab_button_(cc::UIResourceLayer::Create()), |
| 24 left_fade_(cc::UIResourceLayer::Create()), |
| 25 right_fade_(cc::UIResourceLayer::Create()), |
22 model_selector_button_(cc::UIResourceLayer::Create()), | 26 model_selector_button_(cc::UIResourceLayer::Create()), |
23 background_tab_brightness_(1.f), | 27 background_tab_brightness_(1.f), |
24 brightness_(1.f), | 28 brightness_(1.f), |
25 write_index_(0), | 29 write_index_(0), |
26 content_tree_(nullptr) { | 30 content_tree_(nullptr) { |
27 new_tab_button_->SetIsDrawable(true); | 31 new_tab_button_->SetIsDrawable(true); |
28 model_selector_button_->SetIsDrawable(true); | 32 model_selector_button_->SetIsDrawable(true); |
| 33 left_fade_->SetIsDrawable(true); |
| 34 right_fade_->SetIsDrawable(true); |
| 35 |
| 36 // When the ScrollingStripStacker is used, the new tab button and tabs scroll, |
| 37 // while the incognito button and left/ride fade stay fixed. Put the new tab |
| 38 // button and tabs in a separate layer placed visually below the others. |
| 39 scrollable_strip_layer_->SetIsDrawable(true); |
| 40 scrollable_strip_layer_->AddChild(new_tab_button_); |
| 41 |
29 tab_strip_layer_->SetBackgroundColor(SK_ColorBLACK); | 42 tab_strip_layer_->SetBackgroundColor(SK_ColorBLACK); |
30 tab_strip_layer_->SetIsDrawable(true); | 43 tab_strip_layer_->SetIsDrawable(true); |
31 tab_strip_layer_->AddChild(new_tab_button_); | 44 tab_strip_layer_->AddChild(scrollable_strip_layer_); |
| 45 tab_strip_layer_->AddChild(left_fade_); |
| 46 tab_strip_layer_->AddChild(right_fade_); |
32 tab_strip_layer_->AddChild(model_selector_button_); | 47 tab_strip_layer_->AddChild(model_selector_button_); |
33 layer()->AddChild(tab_strip_layer_); | 48 layer()->AddChild(tab_strip_layer_); |
34 } | 49 } |
35 | 50 |
36 TabStripSceneLayer::~TabStripSceneLayer() { | 51 TabStripSceneLayer::~TabStripSceneLayer() { |
37 } | 52 } |
38 | 53 |
39 void TabStripSceneLayer::SetContentTree( | 54 void TabStripSceneLayer::SetContentTree( |
40 JNIEnv* env, | 55 JNIEnv* env, |
41 const JavaParamRef<jobject>& jobj, | 56 const JavaParamRef<jobject>& jobj, |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
83 jfloat width, | 98 jfloat width, |
84 jfloat height, | 99 jfloat height, |
85 jfloat y_offset, | 100 jfloat y_offset, |
86 jfloat background_tab_brightness, | 101 jfloat background_tab_brightness, |
87 jfloat brightness, | 102 jfloat brightness, |
88 jboolean should_readd_background) { | 103 jboolean should_readd_background) { |
89 background_tab_brightness_ = background_tab_brightness; | 104 background_tab_brightness_ = background_tab_brightness; |
90 gfx::RectF content(0, y_offset, width, height); | 105 gfx::RectF content(0, y_offset, width, height); |
91 layer()->SetPosition(gfx::PointF(0, y_offset)); | 106 layer()->SetPosition(gfx::PointF(0, y_offset)); |
92 tab_strip_layer_->SetBounds(gfx::Size(width, height)); | 107 tab_strip_layer_->SetBounds(gfx::Size(width, height)); |
| 108 scrollable_strip_layer_->SetBounds(gfx::Size(width, height)); |
93 | 109 |
94 if (brightness != brightness_) { | 110 if (brightness != brightness_) { |
95 brightness_ = brightness; | 111 brightness_ = brightness; |
96 cc::FilterOperations filters; | 112 cc::FilterOperations filters; |
97 if (brightness_ < 1.f) | 113 if (brightness_ < 1.f) |
98 filters.Append(cc::FilterOperation::CreateBrightnessFilter(brightness_)); | 114 filters.Append(cc::FilterOperation::CreateBrightnessFilter(brightness_)); |
99 tab_strip_layer_->SetFilters(filters); | 115 tab_strip_layer_->SetFilters(filters); |
100 } | 116 } |
101 | 117 |
102 // Content tree should not be affected by tab strip scene layer visibility. | 118 // Content tree should not be affected by tab strip scene layer visibility. |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
161 | 177 |
162 model_selector_button_->SetUIResourceId(button_resource->ui_resource->id()); | 178 model_selector_button_->SetUIResourceId(button_resource->ui_resource->id()); |
163 float left_offset = (width - button_resource->size.width()) / 2; | 179 float left_offset = (width - button_resource->size.width()) / 2; |
164 float top_offset = (height - button_resource->size.height()) / 2; | 180 float top_offset = (height - button_resource->size.height()) / 2; |
165 model_selector_button_->SetPosition( | 181 model_selector_button_->SetPosition( |
166 gfx::PointF(x + left_offset, y + top_offset)); | 182 gfx::PointF(x + left_offset, y + top_offset)); |
167 model_selector_button_->SetBounds(button_resource->size); | 183 model_selector_button_->SetBounds(button_resource->size); |
168 model_selector_button_->SetHideLayerAndSubtree(!visible); | 184 model_selector_button_->SetHideLayerAndSubtree(!visible); |
169 } | 185 } |
170 | 186 |
| 187 void TabStripSceneLayer::UpdateTabStripLeftFade( |
| 188 JNIEnv* env, |
| 189 const JavaParamRef<jobject>& jobj, |
| 190 jint resource_id, |
| 191 jfloat opacity, |
| 192 const JavaParamRef<jobject>& jresource_manager) { |
| 193 |
| 194 // Hide layer if it's not visible. |
| 195 if (opacity == 0.f) { |
| 196 left_fade_->SetHideLayerAndSubtree(true); |
| 197 return; |
| 198 } |
| 199 |
| 200 // Set UI resource. |
| 201 ui::ResourceManager* resource_manager = |
| 202 ui::ResourceManagerImpl::FromJavaObject(jresource_manager); |
| 203 ui::ResourceManager::Resource* fade_resource = |
| 204 resource_manager->GetResource(ui::ANDROID_RESOURCE_TYPE_STATIC, |
| 205 resource_id); |
| 206 left_fade_->SetUIResourceId(fade_resource->ui_resource->id()); |
| 207 |
| 208 // The same resource is used for both left and right fade, so the |
| 209 // resource must be rotated for the left fade. |
| 210 gfx::Transform fade_transform; |
| 211 fade_transform.RotateAboutYAxis(180.0); |
| 212 left_fade_->SetTransform(fade_transform); |
| 213 |
| 214 // Set opacity. |
| 215 left_fade_->SetOpacity(opacity); |
| 216 |
| 217 // Set bounds. Use the parent layer height so the 1px fade resource is |
| 218 // stretched vertically. |
| 219 left_fade_->SetBounds(gfx::Size(fade_resource->size.width(), |
| 220 scrollable_strip_layer_->bounds().height())); |
| 221 |
| 222 // Set position. The rotation set above requires the layer to be offset |
| 223 // by its width in order to display on the left edge. |
| 224 left_fade_->SetPosition(gfx::PointF(fade_resource->size.width(), 0)); |
| 225 |
| 226 // Ensure layer is visible. |
| 227 left_fade_->SetHideLayerAndSubtree(false); |
| 228 } |
| 229 |
| 230 void TabStripSceneLayer::UpdateTabStripRightFade( |
| 231 JNIEnv* env, |
| 232 const JavaParamRef<jobject>& jobj, |
| 233 jint resource_id, |
| 234 jfloat opacity, |
| 235 const JavaParamRef<jobject>& jresource_manager) { |
| 236 |
| 237 // Hide layer if it's not visible. |
| 238 if (opacity == 0.f) { |
| 239 right_fade_->SetHideLayerAndSubtree(true); |
| 240 return; |
| 241 } |
| 242 |
| 243 // Set UI resource. |
| 244 ui::ResourceManager* resource_manager = |
| 245 ui::ResourceManagerImpl::FromJavaObject(jresource_manager); |
| 246 ui::ResourceManager::Resource* fade_resource = |
| 247 resource_manager->GetResource(ui::ANDROID_RESOURCE_TYPE_STATIC, |
| 248 resource_id); |
| 249 right_fade_->SetUIResourceId(fade_resource->ui_resource->id()); |
| 250 |
| 251 // Set opacity. |
| 252 right_fade_->SetOpacity(opacity); |
| 253 |
| 254 // Set bounds. Use the parent layer height so the 1px fade resource is |
| 255 // stretched vertically. |
| 256 right_fade_->SetBounds(gfx::Size( |
| 257 fade_resource->size.width(), |
| 258 scrollable_strip_layer_->bounds().height())); |
| 259 |
| 260 // Set position. The right fade is positioned at the end of the tab strip. |
| 261 float x = |
| 262 scrollable_strip_layer_->bounds().width() - fade_resource->size.width(); |
| 263 right_fade_->SetPosition(gfx::PointF(x, 0)); |
| 264 |
| 265 // Ensure layer is visible. |
| 266 right_fade_->SetHideLayerAndSubtree(false); |
| 267 } |
| 268 |
171 void TabStripSceneLayer::PutStripTabLayer( | 269 void TabStripSceneLayer::PutStripTabLayer( |
172 JNIEnv* env, | 270 JNIEnv* env, |
173 const JavaParamRef<jobject>& jobj, | 271 const JavaParamRef<jobject>& jobj, |
174 jint id, | 272 jint id, |
175 jint close_resource_id, | 273 jint close_resource_id, |
176 jint handle_resource_id, | 274 jint handle_resource_id, |
177 jboolean foreground, | 275 jboolean foreground, |
178 jboolean close_pressed, | 276 jboolean close_pressed, |
179 jfloat toolbar_width, | 277 jfloat toolbar_width, |
180 jfloat x, | 278 jfloat x, |
(...skipping 26 matching lines...) Expand all Loading... |
207 } | 305 } |
208 | 306 |
209 scoped_refptr<TabHandleLayer> TabStripSceneLayer::GetNextLayer( | 307 scoped_refptr<TabHandleLayer> TabStripSceneLayer::GetNextLayer( |
210 LayerTitleCache* layer_title_cache) { | 308 LayerTitleCache* layer_title_cache) { |
211 if (write_index_ < tab_handle_layers_.size()) | 309 if (write_index_ < tab_handle_layers_.size()) |
212 return tab_handle_layers_[write_index_++]; | 310 return tab_handle_layers_[write_index_++]; |
213 | 311 |
214 scoped_refptr<TabHandleLayer> layer_tree = | 312 scoped_refptr<TabHandleLayer> layer_tree = |
215 TabHandleLayer::Create(layer_title_cache); | 313 TabHandleLayer::Create(layer_title_cache); |
216 tab_handle_layers_.push_back(layer_tree); | 314 tab_handle_layers_.push_back(layer_tree); |
217 tab_strip_layer_->AddChild(layer_tree->layer()); | 315 scrollable_strip_layer_->AddChild(layer_tree->layer()); |
218 write_index_++; | 316 write_index_++; |
219 return layer_tree; | 317 return layer_tree; |
220 } | 318 } |
221 | 319 |
222 static jlong Init(JNIEnv* env, const JavaParamRef<jobject>& jobj) { | 320 static jlong Init(JNIEnv* env, const JavaParamRef<jobject>& jobj) { |
223 // This will automatically bind to the Java object and pass ownership there. | 321 // This will automatically bind to the Java object and pass ownership there. |
224 TabStripSceneLayer* scene_layer = new TabStripSceneLayer(env, jobj); | 322 TabStripSceneLayer* scene_layer = new TabStripSceneLayer(env, jobj); |
225 return reinterpret_cast<intptr_t>(scene_layer); | 323 return reinterpret_cast<intptr_t>(scene_layer); |
226 } | 324 } |
227 | 325 |
228 bool RegisterTabStripSceneLayer(JNIEnv* env) { | 326 bool RegisterTabStripSceneLayer(JNIEnv* env) { |
229 return RegisterNativesImpl(env); | 327 return RegisterNativesImpl(env); |
230 } | 328 } |
231 | 329 |
232 } // namespace android | 330 } // namespace android |
233 } // namespace chrome | 331 } // namespace chrome |
OLD | NEW |