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
3 // found in the LICENSE file.
4 
5 #include "chrome/browser/vr/model/model.h"
6 
7 namespace vr {
8 
9 namespace {
10 
IsOpaqueUiMode(UiMode mode)11 bool IsOpaqueUiMode(UiMode mode) {
12   switch (mode) {
13     case kModeBrowsing:
14     case kModeFullscreen:
15     case kModeWebVr:
16     case kModeVoiceSearch:
17     case kModeEditingOmnibox:
18       return true;
19     case kModeRepositionWindow:
20     case kModeModalPrompt:
21     case kModeVoiceSearchListening:
22       return false;
23   }
24   NOTREACHED();
25   return true;
26 }
27 
28 }  // namespace
29 
30 Model::Model() = default;
31 Model::~Model() = default;
32 
color_scheme() const33 const ColorScheme& Model::color_scheme() const {
34   ColorScheme::Mode mode = ColorScheme::kModeNormal;
35   if (incognito)
36     mode = ColorScheme::kModeIncognito;
37   if (fullscreen_enabled())
38     mode = ColorScheme::kModeFullscreen;
39   return ColorScheme::GetColorScheme(mode);
40 }
41 
push_mode(UiMode mode)42 void Model::push_mode(UiMode mode) {
43   if (!ui_modes.empty() && ui_modes.back() == mode)
44     return;
45   ui_modes.push_back(mode);
46 }
47 
pop_mode()48 void Model::pop_mode() {
49   pop_mode(ui_modes.back());
50 }
51 
pop_mode(UiMode mode)52 void Model::pop_mode(UiMode mode) {
53   if (ui_modes.empty() || ui_modes.back() != mode)
54     return;
55   // We should always have a mode to be in when we're clearing a mode.
56   DCHECK_GE(ui_modes.size(), 2u);
57   ui_modes.pop_back();
58 }
59 
toggle_mode(UiMode mode)60 void Model::toggle_mode(UiMode mode) {
61   if (!ui_modes.empty() && ui_modes.back() == mode) {
62     pop_mode(mode);
63     return;
64   }
65   push_mode(mode);
66 }
67 
get_mode() const68 UiMode Model::get_mode() const {
69   return ui_modes.back();
70 }
71 
get_last_opaque_mode() const72 UiMode Model::get_last_opaque_mode() const {
73   for (auto iter = ui_modes.rbegin(); iter != ui_modes.rend(); ++iter) {
74     if (IsOpaqueUiMode(*iter))
75       return *iter;
76   }
77   DCHECK(false) << "get_last_opaque_mode should only be called with at least "
78                    "one opaque mode.";
79   return kModeBrowsing;
80 }
81 
has_mode_in_stack(UiMode mode) const82 bool Model::has_mode_in_stack(UiMode mode) const {
83   for (auto stacked_mode : ui_modes) {
84     if (mode == stacked_mode)
85       return true;
86   }
87   return false;
88 }
89 
browsing_enabled() const90 bool Model::browsing_enabled() const {
91   return !web_vr_enabled();
92 }
93 
default_browsing_enabled() const94 bool Model::default_browsing_enabled() const {
95   return get_last_opaque_mode() == kModeBrowsing;
96 }
97 
voice_search_available() const98 bool Model::voice_search_available() const {
99   return speech.has_or_can_request_record_audio_permission && !incognito &&
100          !active_capturing.audio_capture_enabled;
101 }
102 
voice_search_active() const103 bool Model::voice_search_active() const {
104   return get_last_opaque_mode() == kModeVoiceSearch;
105 }
106 
omnibox_editing_enabled() const107 bool Model::omnibox_editing_enabled() const {
108   return get_last_opaque_mode() == kModeEditingOmnibox;
109 }
110 
editing_enabled() const111 bool Model::editing_enabled() const {
112   return editing_input || editing_web_input;
113 }
114 
fullscreen_enabled() const115 bool Model::fullscreen_enabled() const {
116   return get_last_opaque_mode() == kModeFullscreen;
117 }
118 
web_vr_enabled() const119 bool Model::web_vr_enabled() const {
120   return get_last_opaque_mode() == kModeWebVr;
121 }
122 
reposition_window_enabled() const123 bool Model::reposition_window_enabled() const {
124   return ui_modes.back() == kModeRepositionWindow;
125 }
126 
reposition_window_permitted() const127 bool Model::reposition_window_permitted() const {
128   return !editing_input && !editing_web_input &&
129          active_modal_prompt_type == kModalPromptTypeNone &&
130          !hosted_platform_ui.hosted_ui_enabled;
131 }
132 
primary_controller() const133 const ControllerModel& Model::primary_controller() const {
134   return controllers[0];
135 }
136 
mutable_primary_controller()137 ControllerModel& Model::mutable_primary_controller() {
138   return controllers[0];
139 }
140 
set_omnibox_text_field_info(EditedText text)141 void Model::set_omnibox_text_field_info(EditedText text) {
142   omnibox_text_field_info = std::move(text);
143   omnibox_text_field_touched = current_time;
144 }
145 
set_web_input_text_field_info(EditedText text)146 void Model::set_web_input_text_field_info(EditedText text) {
147   web_input_text_field_info = std::move(text);
148   web_input_text_field_touched = current_time;
149 }
150 
151 }  // namespace vr
152