Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(744)

Side by Side Diff: chrome/browser/android/vr_shell/ui_scene_manager.cc

Issue 2913633002: [vr] Clicking on the security icon should prompt the user to bail out of VR (Closed)
Patch Set: . Created 3 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2017 The Chromium Authors. All rights reserved. 1 // Copyright 2017 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/vr_shell/ui_scene_manager.h" 5 #include "chrome/browser/android/vr_shell/ui_scene_manager.h"
6 6
7 #include "base/callback.h" 7 #include "base/callback.h"
8 #include "base/memory/ptr_util.h" 8 #include "base/memory/ptr_util.h"
9 #include "chrome/browser/android/vr_shell/textures/close_button_texture.h" 9 #include "chrome/browser/android/vr_shell/textures/close_button_texture.h"
10 #include "chrome/browser/android/vr_shell/textures/ui_texture.h" 10 #include "chrome/browser/android/vr_shell/textures/ui_texture.h"
11 #include "chrome/browser/android/vr_shell/ui_elements/audio_capture_indicator.h" 11 #include "chrome/browser/android/vr_shell/ui_elements/audio_capture_indicator.h"
12 #include "chrome/browser/android/vr_shell/ui_elements/button.h" 12 #include "chrome/browser/android/vr_shell/ui_elements/button.h"
13 #include "chrome/browser/android/vr_shell/ui_elements/exit_prompt.h"
13 #include "chrome/browser/android/vr_shell/ui_elements/exit_warning.h" 14 #include "chrome/browser/android/vr_shell/ui_elements/exit_warning.h"
14 #include "chrome/browser/android/vr_shell/ui_elements/loading_indicator.h" 15 #include "chrome/browser/android/vr_shell/ui_elements/loading_indicator.h"
15 #include "chrome/browser/android/vr_shell/ui_elements/permanent_security_warning .h" 16 #include "chrome/browser/android/vr_shell/ui_elements/permanent_security_warning .h"
16 #include "chrome/browser/android/vr_shell/ui_elements/screen_capture_indicator.h " 17 #include "chrome/browser/android/vr_shell/ui_elements/screen_capture_indicator.h "
17 #include "chrome/browser/android/vr_shell/ui_elements/screen_dimmer.h" 18 #include "chrome/browser/android/vr_shell/ui_elements/screen_dimmer.h"
18 #include "chrome/browser/android/vr_shell/ui_elements/transient_security_warning .h" 19 #include "chrome/browser/android/vr_shell/ui_elements/transient_security_warning .h"
19 #include "chrome/browser/android/vr_shell/ui_elements/ui_element.h" 20 #include "chrome/browser/android/vr_shell/ui_elements/ui_element.h"
20 #include "chrome/browser/android/vr_shell/ui_elements/ui_element_debug_id.h" 21 #include "chrome/browser/android/vr_shell/ui_elements/ui_element_debug_id.h"
21 #include "chrome/browser/android/vr_shell/ui_elements/url_bar.h" 22 #include "chrome/browser/android/vr_shell/ui_elements/url_bar.h"
22 #include "chrome/browser/android/vr_shell/ui_elements/video_capture_indicator.h" 23 #include "chrome/browser/android/vr_shell/ui_elements/video_capture_indicator.h"
23 #include "chrome/browser/android/vr_shell/ui_scene.h" 24 #include "chrome/browser/android/vr_shell/ui_scene.h"
24 #include "chrome/browser/android/vr_shell/vr_browser_interface.h" 25 #include "chrome/browser/android/vr_shell/vr_browser_interface.h"
25 26
26 namespace vr_shell { 27 namespace vr_shell {
27 28
28 namespace { 29 namespace {
29 30
30 static constexpr int kWarningTimeoutSeconds = 30; 31 static constexpr int kWarningTimeoutSeconds = 30;
31 static constexpr float kWarningDistance = 0.7; 32 static constexpr float kWarningDistance = 0.7;
32 static constexpr float kWarningAngleRadians = 16.3 * M_PI / 180.0; 33 static constexpr float kWarningAngleRadians = 16.3 * M_PI / 180.0;
33 static constexpr float kPermanentWarningHeight = 0.070f; 34 static constexpr float kPermanentWarningHeight = 0.070f;
34 static constexpr float kPermanentWarningWidth = 0.224f; 35 static constexpr float kPermanentWarningWidth = 0.224f;
35 static constexpr float kTransientWarningHeight = 0.160; 36 static constexpr float kTransientWarningHeight = 0.160;
36 static constexpr float kTransientWarningWidth = 0.512; 37 static constexpr float kTransientWarningWidth = 0.512;
37 38
39 static constexpr float kExitPromptDistance = 2.5;
40 static constexpr float kExitPromptWidth = 0.672 * kExitPromptDistance;
41 static constexpr float kExitPromptHeight = 0.2 * kExitPromptDistance;
42 static constexpr float kExitPromptVerticalOffset = -0.1 * kExitPromptDistance;
43
38 static constexpr float kExitWarningDistance = 0.6; 44 static constexpr float kExitWarningDistance = 0.6;
39 static constexpr float kExitWarningHeight = 0.160; 45 static constexpr float kExitWarningHeight = 0.160;
40 static constexpr float kExitWarningWidth = 0.512; 46 static constexpr float kExitWarningWidth = 0.512;
41 47
42 static constexpr float kContentDistance = 2.5; 48 static constexpr float kContentDistance = 2.5;
43 static constexpr float kContentWidth = 0.96 * kContentDistance; 49 static constexpr float kContentWidth = 0.96 * kContentDistance;
44 static constexpr float kContentHeight = 0.64 * kContentDistance; 50 static constexpr float kContentHeight = 0.64 * kContentDistance;
45 static constexpr float kContentVerticalOffset = -0.1 * kContentDistance; 51 static constexpr float kContentVerticalOffset = -0.1 * kContentDistance;
46 static constexpr float kBackplaneSize = 1000.0; 52 static constexpr float kBackplaneSize = 1000.0;
47 static constexpr float kBackgroundDistanceMultiplier = 1.414; 53 static constexpr float kBackgroundDistanceMultiplier = 1.414;
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after
146 element->set_id(AllocateId()); 152 element->set_id(AllocateId());
147 element->set_fill(vr_shell::Fill::NONE); 153 element->set_fill(vr_shell::Fill::NONE);
148 element->set_size({kExitWarningWidth, kExitWarningHeight, 1}); 154 element->set_size({kExitWarningWidth, kExitWarningHeight, 1});
149 element->set_scale({kExitWarningDistance, kExitWarningDistance, 1}); 155 element->set_scale({kExitWarningDistance, kExitWarningDistance, 1});
150 element->set_translation({0, 0, -kExitWarningDistance}); 156 element->set_translation({0, 0, -kExitWarningDistance});
151 element->set_visible(false); 157 element->set_visible(false);
152 element->set_hit_testable(false); 158 element->set_hit_testable(false);
153 element->set_lock_to_fov(true); 159 element->set_lock_to_fov(true);
154 exit_warning_ = element.get(); 160 exit_warning_ = element.get();
155 scene_->AddUiElement(std::move(element)); 161 scene_->AddUiElement(std::move(element));
162
163 element = base::MakeUnique<ExitPrompt>(
164 512,
165 base::Bind(&UiSceneManager::OnExitPromptPrimaryButtonClicked,
166 base::Unretained(this)),
167 base::Bind(&UiSceneManager::OnExitPromptSecondaryButtonClicked,
168 base::Unretained(this)));
169 element->set_debug_id(kExitPrompt);
170 element->set_id(AllocateId());
171 element->set_fill(vr_shell::Fill::NONE);
172 element->set_size({kExitPromptWidth, kExitPromptHeight, 1});
173 element->set_translation(
174 {0, kExitPromptVerticalOffset, -kExitPromptDistance});
175 element->set_visible(false);
176 exit_prompt_ = element.get();
177 scene_->AddUiElement(std::move(element));
156 } 178 }
157 179
158 void UiSceneManager::CreateSystemIndicators() { 180 void UiSceneManager::CreateSystemIndicators() {
159 std::unique_ptr<UiElement> element; 181 std::unique_ptr<UiElement> element;
160 182
161 // TODO(acondor): Make constants for sizes and positions once the UX for the 183 // TODO(acondor): Make constants for sizes and positions once the UX for the
162 // indicators is defined. 184 // indicators is defined.
163 element = base::MakeUnique<AudioCaptureIndicator>(512); 185 element = base::MakeUnique<AudioCaptureIndicator>(512);
164 element->set_debug_id(kAudioCaptureIndicator); 186 element->set_debug_id(kAudioCaptureIndicator);
165 element->set_id(AllocateId()); 187 element->set_id(AllocateId());
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
204 226
205 // Place an invisible but hittable plane behind the content quad, to keep the 227 // Place an invisible but hittable plane behind the content quad, to keep the
206 // reticle roughly planar with the content if near content. 228 // reticle roughly planar with the content if near content.
207 element = base::MakeUnique<UiElement>(); 229 element = base::MakeUnique<UiElement>();
208 element->set_debug_id(kBackplane); 230 element->set_debug_id(kBackplane);
209 element->set_id(AllocateId()); 231 element->set_id(AllocateId());
210 element->set_fill(vr_shell::Fill::NONE); 232 element->set_fill(vr_shell::Fill::NONE);
211 element->set_size({kBackplaneSize, kBackplaneSize, 1.0}); 233 element->set_size({kBackplaneSize, kBackplaneSize, 1.0});
212 element->set_translation({0.0, 0.0, -kTextureOffset}); 234 element->set_translation({0.0, 0.0, -kTextureOffset});
213 element->set_parent_id(main_content_->id()); 235 element->set_parent_id(main_content_->id());
236 main_content_backplane_ = element.get();
214 content_elements_.push_back(element.get()); 237 content_elements_.push_back(element.get());
215 scene_->AddUiElement(std::move(element)); 238 scene_->AddUiElement(std::move(element));
216 239
217 // Limit reticle distance to a sphere based on content distance. 240 // Limit reticle distance to a sphere based on content distance.
218 scene_->SetBackgroundDistance(main_content_->translation().z() * 241 scene_->SetBackgroundDistance(main_content_->translation().z() *
219 -kBackgroundDistanceMultiplier); 242 -kBackgroundDistanceMultiplier);
220 } 243 }
221 244
222 void UiSceneManager::CreateBackground() { 245 void UiSceneManager::CreateBackground() {
223 std::unique_ptr<UiElement> element; 246 std::unique_ptr<UiElement> element;
224 247
225 // Floor. 248 // Floor.
226 element = base::MakeUnique<UiElement>(); 249 element = base::MakeUnique<UiElement>();
227 element->set_debug_id(kFloor); 250 element->set_debug_id(kFloor);
228 element->set_id(AllocateId()); 251 element->set_id(AllocateId());
229 element->set_size({kSceneSize, kSceneSize, 1.0}); 252 element->set_size({kSceneSize, kSceneSize, 1.0});
230 element->set_translation({0.0, -kSceneHeight / 2, 0.0}); 253 element->set_translation({0.0, -kSceneHeight / 2, 0.0});
231 element->set_rotation({1.0, 0.0, 0.0, -M_PI / 2.0}); 254 element->set_rotation({1.0, 0.0, 0.0, -M_PI / 2.0});
232 element->set_fill(vr_shell::Fill::GRID_GRADIENT); 255 element->set_fill(vr_shell::Fill::GRID_GRADIENT);
233 element->set_draw_phase(0); 256 element->set_draw_phase(0);
234 element->set_gridline_count(kFloorGridlineCount); 257 element->set_gridline_count(kFloorGridlineCount);
235 floor_ = element.get(); 258 floor_ = element.get();
236 content_elements_.push_back(element.get()); 259 background_elements_.push_back(element.get());
amp 2017/06/02 20:37:01 This is going to confuse the unit tests for transi
ymalik 2017/06/04 04:08:56 I ran all the vr unit tests and they seem to pass.
amp 2017/06/05 16:44:57 Sorry, ignore this. I was misremembering an older
237 scene_->AddUiElement(std::move(element)); 260 scene_->AddUiElement(std::move(element));
238 261
239 // Ceiling. 262 // Ceiling.
240 element = base::MakeUnique<UiElement>(); 263 element = base::MakeUnique<UiElement>();
241 element->set_debug_id(kCeiling); 264 element->set_debug_id(kCeiling);
242 element->set_id(AllocateId()); 265 element->set_id(AllocateId());
243 element->set_size({kSceneSize, kSceneSize, 1.0}); 266 element->set_size({kSceneSize, kSceneSize, 1.0});
244 element->set_translation({0.0, kSceneHeight / 2, 0.0}); 267 element->set_translation({0.0, kSceneHeight / 2, 0.0});
245 element->set_rotation({1.0, 0.0, 0.0, M_PI / 2}); 268 element->set_rotation({1.0, 0.0, 0.0, M_PI / 2});
246 element->set_fill(vr_shell::Fill::OPAQUE_GRADIENT); 269 element->set_fill(vr_shell::Fill::OPAQUE_GRADIENT);
247 element->set_draw_phase(0); 270 element->set_draw_phase(0);
248 ceiling_ = element.get(); 271 ceiling_ = element.get();
249 content_elements_.push_back(element.get()); 272 background_elements_.push_back(element.get());
250 scene_->AddUiElement(std::move(element)); 273 scene_->AddUiElement(std::move(element));
251 274
252 UpdateBackgroundColor(); 275 UpdateBackgroundColor();
253 } 276 }
254 277
255 void UiSceneManager::CreateUrlBar() { 278 void UiSceneManager::CreateUrlBar() {
256 // TODO(cjgrant): Incorporate final size and position. 279 // TODO(cjgrant): Incorporate final size and position.
257 auto url_bar = base::MakeUnique<UrlBar>( 280 auto url_bar = base::MakeUnique<UrlBar>(
258 512, 281 512,
282 base::Bind(&UiSceneManager::OnBackButtonClicked, base::Unretained(this)),
283 base::Bind(&UiSceneManager::OnSecurityIconClicked,
284 base::Unretained(this)),
259 base::Bind(&UiSceneManager::OnUnsupportedMode, base::Unretained(this))); 285 base::Bind(&UiSceneManager::OnUnsupportedMode, base::Unretained(this)));
260 url_bar->set_debug_id(kUrlBar); 286 url_bar->set_debug_id(kUrlBar);
261 url_bar->set_id(AllocateId()); 287 url_bar->set_id(AllocateId());
262 url_bar->set_translation({0, kUrlBarVerticalOffset, -kUrlBarDistance}); 288 url_bar->set_translation({0, kUrlBarVerticalOffset, -kUrlBarDistance});
263 url_bar->set_size({kUrlBarWidth, kUrlBarHeight, 1}); 289 url_bar->set_size({kUrlBarWidth, kUrlBarHeight, 1});
264 url_bar->SetBackButtonCallback(
265 base::Bind(&UiSceneManager::OnBackButtonClicked, base::Unretained(this)));
266 url_bar_ = url_bar.get(); 290 url_bar_ = url_bar.get();
267 control_elements_.push_back(url_bar.get()); 291 control_elements_.push_back(url_bar.get());
268 scene_->AddUiElement(std::move(url_bar)); 292 scene_->AddUiElement(std::move(url_bar));
269 293
270 auto indicator = base::MakeUnique<LoadingIndicator>(256); 294 auto indicator = base::MakeUnique<LoadingIndicator>(256);
271 indicator->set_debug_id(kLoadingIndicator); 295 indicator->set_debug_id(kLoadingIndicator);
272 indicator->set_id(AllocateId()); 296 indicator->set_id(AllocateId());
273 indicator->set_translation({0, 0, kLoadingIndicatorOffset}); 297 indicator->set_translation({0, 0, kLoadingIndicatorOffset});
274 indicator->set_size({kLoadingIndicatorWidth, kLoadingIndicatorHeight, 1}); 298 indicator->set_size({kLoadingIndicatorWidth, kLoadingIndicatorHeight, 1});
275 indicator->set_parent_id(url_bar_->id()); 299 indicator->set_parent_id(url_bar_->id());
(...skipping 28 matching lines...) Expand all
304 web_vr_mode_ = web_vr; 328 web_vr_mode_ = web_vr;
305 ConfigureScene(); 329 ConfigureScene();
306 ConfigureSecurityWarnings(); 330 ConfigureSecurityWarnings();
307 audio_capture_indicator_->set_visible(!web_vr && audio_capturing_); 331 audio_capture_indicator_->set_visible(!web_vr && audio_capturing_);
308 video_capture_indicator_->set_visible(!web_vr && video_capturing_); 332 video_capture_indicator_->set_visible(!web_vr && video_capturing_);
309 screen_capture_indicator_->set_visible(!web_vr && screen_capturing_); 333 screen_capture_indicator_->set_visible(!web_vr && screen_capturing_);
310 } 334 }
311 335
312 void UiSceneManager::ConfigureScene() { 336 void UiSceneManager::ConfigureScene() {
313 exit_warning_->SetEnabled(scene_->is_exiting()); 337 exit_warning_->SetEnabled(scene_->is_exiting());
338 exit_prompt_->SetEnabled(scene_->is_prompting_to_exit());
314 screen_dimmer_->SetEnabled(scene_->is_exiting()); 339 screen_dimmer_->SetEnabled(scene_->is_exiting());
315 340
316 // Controls (URL bar, loading progress, etc). 341 // Controls (URL bar, loading progress, etc).
317 bool controls_visible = !web_vr_mode_ && !fullscreen_; 342 bool controls_visible = !web_vr_mode_ && !fullscreen_;
318 for (UiElement* element : control_elements_) { 343 for (UiElement* element : control_elements_) {
319 element->SetEnabled(controls_visible); 344 element->SetEnabled(controls_visible && !scene_->is_prompting_to_exit());
320 } 345 }
321 346
322 // Content elements. 347 // Content elements.
323 for (UiElement* element : content_elements_) { 348 for (UiElement* element : content_elements_) {
349 // We don't want to show the content elements when the exit prompt is
350 // visible. The only content element visible in this case is the invisible
351 // backplane that we add right behind the content rect so that the rectile
cjgrant 2017/06/02 04:16:36 s/rectile/reticle/
ymalik 2017/06/02 21:14:31 Done.
352 // doesn't jump when it transitions between the content rect (and the exit
353 // prompt in this case) and the background.
354 bool disabled_for_exit_prompt =
355 element != main_content_backplane_ && scene_->is_prompting_to_exit();
356 element->SetEnabled(!web_vr_mode_ && !disabled_for_exit_prompt);
357 }
358
359 // Background elements.
360 for (UiElement* element : background_elements_) {
324 element->SetEnabled(!web_vr_mode_); 361 element->SetEnabled(!web_vr_mode_);
325 } 362 }
326 363
327 // Update content quad parameters depending on fullscreen. 364 // Update content quad parameters depending on fullscreen.
328 // TODO(http://crbug.com/642937): Animate fullscreen transitions. 365 // TODO(http://crbug.com/642937): Animate fullscreen transitions.
329 if (fullscreen_) { 366 if (fullscreen_) {
330 main_content_->set_translation( 367 main_content_->set_translation(
331 {0, kFullscreenVerticalOffset, -kFullscreenDistance}); 368 {0, kFullscreenVerticalOffset, -kFullscreenDistance});
332 main_content_->set_size({kFullscreenWidth, kFullscreenHeight, 1}); 369 main_content_->set_size({kFullscreenWidth, kFullscreenHeight, 1});
333 } else { 370 } else {
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
410 } 447 }
411 448
412 void UiSceneManager::OnSecurityWarningTimer() { 449 void UiSceneManager::OnSecurityWarningTimer() {
413 transient_security_warning_->set_visible(false); 450 transient_security_warning_->set_visible(false);
414 } 451 }
415 452
416 void UiSceneManager::OnBackButtonClicked() { 453 void UiSceneManager::OnBackButtonClicked() {
417 browser_->NavigateBack(); 454 browser_->NavigateBack();
418 } 455 }
419 456
457 void UiSceneManager::OnSecurityIconClicked() {
458 if (scene_->is_prompting_to_exit())
459 return;
460 scene_->set_is_prompting_to_exit(true);
cjgrant 2017/06/02 04:16:36 I need to look at this tomorrow, but I don't get w
ymalik 2017/06/04 04:08:56 The prompt is a part of the scene so it should kno
461 ConfigureScene();
462 }
463
464 void UiSceneManager::OnExitPromptPrimaryButtonClicked() {
465 if (!scene_->is_prompting_to_exit())
466 return;
467 scene_->set_is_prompting_to_exit(false);
468 ConfigureScene();
469 }
470
471 void UiSceneManager::OnExitPromptSecondaryButtonClicked() {
472 OnUnsupportedMode(UiUnsupportedMode::kUnhandledPageInfo);
473 }
474
420 void UiSceneManager::SetURL(const GURL& gurl) { 475 void UiSceneManager::SetURL(const GURL& gurl) {
421 url_bar_->SetURL(gurl); 476 url_bar_->SetURL(gurl);
422 } 477 }
423 478
424 void UiSceneManager::SetSecurityLevel(security_state::SecurityLevel level) { 479 void UiSceneManager::SetSecurityLevel(security_state::SecurityLevel level) {
425 url_bar_->SetSecurityLevel(level); 480 url_bar_->SetSecurityLevel(level);
426 } 481 }
427 482
428 void UiSceneManager::SetLoading(bool loading) { 483 void UiSceneManager::SetLoading(bool loading) {
429 loading_indicator_->SetLoading(loading); 484 loading_indicator_->SetLoading(loading);
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
463 if (fullscreen_) 518 if (fullscreen_)
464 return ColorScheme::kModeFullscreen; 519 return ColorScheme::kModeFullscreen;
465 return ColorScheme::kModeNormal; 520 return ColorScheme::kModeNormal;
466 } 521 }
467 522
468 const ColorScheme& UiSceneManager::color_scheme() const { 523 const ColorScheme& UiSceneManager::color_scheme() const {
469 return ColorScheme::GetColorScheme(mode()); 524 return ColorScheme::GetColorScheme(mode());
470 } 525 }
471 526
472 } // namespace vr_shell 527 } // namespace vr_shell
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698