| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/ui/tabs/tab_utils.h" | 5 #include "chrome/browser/ui/tabs/tab_utils.h" |
| 6 | 6 |
| 7 #include <utility> | 7 #include <utility> |
| 8 | 8 |
| 9 #include "base/command_line.h" | 9 #include "base/command_line.h" |
| 10 #include "base/strings/string16.h" | 10 #include "base/strings/string16.h" |
| 11 #include "build/build_config.h" | 11 #include "build/build_config.h" |
| 12 #include "chrome/browser/media/media_capture_devices_dispatcher.h" | 12 #include "chrome/browser/media/media_capture_devices_dispatcher.h" |
| 13 #include "chrome/browser/media/media_stream_capture_indicator.h" | 13 #include "chrome/browser/media/media_stream_capture_indicator.h" |
| 14 #include "chrome/browser/themes/theme_properties.h" | 14 #include "chrome/browser/themes/theme_properties.h" |
| 15 #include "chrome/browser/ui/tabs/tab_strip_model.h" | 15 #include "chrome/browser/ui/tabs/tab_strip_model.h" |
| 16 #include "chrome/browser/usb/usb_tab_helper.h" |
| 16 #include "chrome/common/chrome_switches.h" | 17 #include "chrome/common/chrome_switches.h" |
| 17 #include "chrome/grit/generated_resources.h" | 18 #include "chrome/grit/generated_resources.h" |
| 18 #include "content/public/browser/web_contents.h" | 19 #include "content/public/browser/web_contents.h" |
| 19 #include "ui/base/l10n/l10n_util.h" | 20 #include "ui/base/l10n/l10n_util.h" |
| 20 #include "ui/base/theme_provider.h" | 21 #include "ui/base/theme_provider.h" |
| 21 #include "ui/gfx/animation/multi_animation.h" | 22 #include "ui/gfx/animation/multi_animation.h" |
| 22 #include "ui/gfx/image/image.h" | 23 #include "ui/gfx/image/image.h" |
| 23 #include "ui/gfx/vector_icons_public.h" | 24 #include "ui/gfx/vector_icons_public.h" |
| 24 #include "ui/native_theme/common_theme.h" | 25 #include "ui/native_theme/common_theme.h" |
| 25 #include "ui/native_theme/native_theme.h" | 26 #include "ui/native_theme/native_theme.h" |
| (...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 155 if (indicator.get()) { | 156 if (indicator.get()) { |
| 156 if (indicator->IsBeingMirrored(contents)) | 157 if (indicator->IsBeingMirrored(contents)) |
| 157 return TabAlertState::TAB_CAPTURING; | 158 return TabAlertState::TAB_CAPTURING; |
| 158 if (indicator->IsCapturingUserMedia(contents)) | 159 if (indicator->IsCapturingUserMedia(contents)) |
| 159 return TabAlertState::MEDIA_RECORDING; | 160 return TabAlertState::MEDIA_RECORDING; |
| 160 } | 161 } |
| 161 | 162 |
| 162 if (contents->IsBluetoothDeviceConnected()) | 163 if (contents->IsBluetoothDeviceConnected()) |
| 163 return TabAlertState::BLUETOOTH_CONNECTED; | 164 return TabAlertState::BLUETOOTH_CONNECTED; |
| 164 | 165 |
| 166 UsbTabHelper* usb_tab_helper = UsbTabHelper::FromWebContents(contents); |
| 167 if (usb_tab_helper && usb_tab_helper->IsDeviceConnected()) |
| 168 return TabAlertState::USB_CONNECTED; |
| 169 |
| 165 if (contents->IsAudioMuted()) | 170 if (contents->IsAudioMuted()) |
| 166 return TabAlertState::AUDIO_MUTING; | 171 return TabAlertState::AUDIO_MUTING; |
| 167 if (contents->WasRecentlyAudible()) | 172 if (contents->WasRecentlyAudible()) |
| 168 return TabAlertState::AUDIO_PLAYING; | 173 return TabAlertState::AUDIO_PLAYING; |
| 169 | 174 |
| 170 return TabAlertState::NONE; | 175 return TabAlertState::NONE; |
| 171 } | 176 } |
| 172 | 177 |
| 173 gfx::Image GetTabAlertIndicatorImage(TabAlertState alert_state, | 178 gfx::Image GetTabAlertIndicatorImage(TabAlertState alert_state, |
| 174 SkColor button_color) { | 179 SkColor button_color) { |
| 175 #if defined(OS_MACOSX) | 180 #if defined(OS_MACOSX) |
| 176 ui::ResourceBundle* rb = &ui::ResourceBundle::GetSharedInstance(); | 181 ui::ResourceBundle* rb = &ui::ResourceBundle::GetSharedInstance(); |
| 177 switch (alert_state) { | 182 switch (alert_state) { |
| 178 case TabAlertState::AUDIO_PLAYING: | 183 case TabAlertState::AUDIO_PLAYING: |
| 179 return rb->GetNativeImageNamed(IDR_TAB_AUDIO_INDICATOR); | 184 return rb->GetNativeImageNamed(IDR_TAB_AUDIO_INDICATOR); |
| 180 case TabAlertState::AUDIO_MUTING: | 185 case TabAlertState::AUDIO_MUTING: |
| 181 return rb->GetNativeImageNamed(IDR_TAB_AUDIO_MUTING_INDICATOR); | 186 return rb->GetNativeImageNamed(IDR_TAB_AUDIO_MUTING_INDICATOR); |
| 182 case TabAlertState::MEDIA_RECORDING: | 187 case TabAlertState::MEDIA_RECORDING: |
| 183 return rb->GetNativeImageNamed(IDR_TAB_RECORDING_INDICATOR); | 188 return rb->GetNativeImageNamed(IDR_TAB_RECORDING_INDICATOR); |
| 184 case TabAlertState::TAB_CAPTURING: | 189 case TabAlertState::TAB_CAPTURING: |
| 185 return rb->GetNativeImageNamed(IDR_TAB_CAPTURE_INDICATOR); | 190 return rb->GetNativeImageNamed(IDR_TAB_CAPTURE_INDICATOR); |
| 186 case TabAlertState::BLUETOOTH_CONNECTED: | 191 case TabAlertState::BLUETOOTH_CONNECTED: |
| 187 return rb->GetNativeImageNamed(IDR_TAB_BLUETOOTH_INDICATOR); | 192 return rb->GetNativeImageNamed(IDR_TAB_BLUETOOTH_INDICATOR); |
| 193 case TabAlertState::USB_CONNECTED: |
| 194 return rb->GetNativeImageNamed(IDR_TAB_USB_INDICATOR); |
| 188 case TabAlertState::NONE: | 195 case TabAlertState::NONE: |
| 189 break; | 196 break; |
| 190 } | 197 } |
| 191 #else | 198 #else |
| 192 gfx::VectorIconId icon_id = gfx::VectorIconId::VECTOR_ICON_NONE; | 199 gfx::VectorIconId icon_id = gfx::VectorIconId::VECTOR_ICON_NONE; |
| 193 switch (alert_state) { | 200 switch (alert_state) { |
| 194 case TabAlertState::AUDIO_PLAYING: | 201 case TabAlertState::AUDIO_PLAYING: |
| 195 icon_id = gfx::VectorIconId::TAB_AUDIO; | 202 icon_id = gfx::VectorIconId::TAB_AUDIO; |
| 196 break; | 203 break; |
| 197 case TabAlertState::AUDIO_MUTING: | 204 case TabAlertState::AUDIO_MUTING: |
| 198 icon_id = gfx::VectorIconId::TAB_AUDIO_MUTING; | 205 icon_id = gfx::VectorIconId::TAB_AUDIO_MUTING; |
| 199 break; | 206 break; |
| 200 case TabAlertState::MEDIA_RECORDING: | 207 case TabAlertState::MEDIA_RECORDING: |
| 201 icon_id = gfx::VectorIconId::TAB_MEDIA_RECORDING; | 208 icon_id = gfx::VectorIconId::TAB_MEDIA_RECORDING; |
| 202 break; | 209 break; |
| 203 case TabAlertState::TAB_CAPTURING: | 210 case TabAlertState::TAB_CAPTURING: |
| 204 icon_id = gfx::VectorIconId::TAB_MEDIA_CAPTURING; | 211 icon_id = gfx::VectorIconId::TAB_MEDIA_CAPTURING; |
| 205 break; | 212 break; |
| 206 case TabAlertState::BLUETOOTH_CONNECTED: | 213 case TabAlertState::BLUETOOTH_CONNECTED: |
| 207 icon_id = gfx::VectorIconId::TAB_BLUETOOTH_CONNECTED; | 214 icon_id = gfx::VectorIconId::TAB_BLUETOOTH_CONNECTED; |
| 208 break; | 215 break; |
| 216 case TabAlertState::USB_CONNECTED: |
| 217 icon_id = gfx::VectorIconId::TAB_USB_CONNECTED; |
| 218 break; |
| 209 case TabAlertState::NONE: | 219 case TabAlertState::NONE: |
| 210 break; | 220 break; |
| 211 } | 221 } |
| 212 if (icon_id != gfx::VectorIconId::VECTOR_ICON_NONE) | 222 if (icon_id != gfx::VectorIconId::VECTOR_ICON_NONE) |
| 213 return gfx::Image(gfx::CreateVectorIcon(icon_id, 16, button_color)); | 223 return gfx::Image(gfx::CreateVectorIcon(icon_id, 16, button_color)); |
| 214 #endif | 224 #endif |
| 215 NOTREACHED(); | 225 NOTREACHED(); |
| 216 return gfx::Image(); | 226 return gfx::Image(); |
| 217 } | 227 } |
| 218 | 228 |
| 219 gfx::Image GetTabAlertIndicatorAffordanceImage(TabAlertState alert_state, | 229 gfx::Image GetTabAlertIndicatorAffordanceImage(TabAlertState alert_state, |
| 220 SkColor button_color) { | 230 SkColor button_color) { |
| 221 switch (alert_state) { | 231 switch (alert_state) { |
| 222 case TabAlertState::AUDIO_PLAYING: | 232 case TabAlertState::AUDIO_PLAYING: |
| 223 return GetTabAlertIndicatorImage(TabAlertState::AUDIO_MUTING, | 233 return GetTabAlertIndicatorImage(TabAlertState::AUDIO_MUTING, |
| 224 button_color); | 234 button_color); |
| 225 case TabAlertState::AUDIO_MUTING: | 235 case TabAlertState::AUDIO_MUTING: |
| 226 case TabAlertState::NONE: | 236 case TabAlertState::NONE: |
| 227 case TabAlertState::MEDIA_RECORDING: | 237 case TabAlertState::MEDIA_RECORDING: |
| 228 case TabAlertState::TAB_CAPTURING: | 238 case TabAlertState::TAB_CAPTURING: |
| 229 case TabAlertState::BLUETOOTH_CONNECTED: | 239 case TabAlertState::BLUETOOTH_CONNECTED: |
| 240 case TabAlertState::USB_CONNECTED: |
| 230 return GetTabAlertIndicatorImage(alert_state, button_color); | 241 return GetTabAlertIndicatorImage(alert_state, button_color); |
| 231 } | 242 } |
| 232 NOTREACHED(); | 243 NOTREACHED(); |
| 233 return GetTabAlertIndicatorImage(alert_state, button_color); | 244 return GetTabAlertIndicatorImage(alert_state, button_color); |
| 234 } | 245 } |
| 235 | 246 |
| 236 scoped_ptr<gfx::Animation> CreateTabAlertIndicatorFadeAnimation( | 247 scoped_ptr<gfx::Animation> CreateTabAlertIndicatorFadeAnimation( |
| 237 TabAlertState alert_state) { | 248 TabAlertState alert_state) { |
| 238 if (alert_state == TabAlertState::MEDIA_RECORDING || | 249 if (alert_state == TabAlertState::MEDIA_RECORDING || |
| 239 alert_state == TabAlertState::TAB_CAPTURING) { | 250 alert_state == TabAlertState::TAB_CAPTURING) { |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 277 IDS_TOOLTIP_TAB_ALERT_STATE_MEDIA_RECORDING)); | 288 IDS_TOOLTIP_TAB_ALERT_STATE_MEDIA_RECORDING)); |
| 278 break; | 289 break; |
| 279 case TabAlertState::TAB_CAPTURING: | 290 case TabAlertState::TAB_CAPTURING: |
| 280 result.append( | 291 result.append( |
| 281 l10n_util::GetStringUTF16(IDS_TOOLTIP_TAB_ALERT_STATE_TAB_CAPTURING)); | 292 l10n_util::GetStringUTF16(IDS_TOOLTIP_TAB_ALERT_STATE_TAB_CAPTURING)); |
| 282 break; | 293 break; |
| 283 case TabAlertState::BLUETOOTH_CONNECTED: | 294 case TabAlertState::BLUETOOTH_CONNECTED: |
| 284 result.append(l10n_util::GetStringUTF16( | 295 result.append(l10n_util::GetStringUTF16( |
| 285 IDS_TOOLTIP_TAB_ALERT_STATE_BLUETOOTH_CONNECTED)); | 296 IDS_TOOLTIP_TAB_ALERT_STATE_BLUETOOTH_CONNECTED)); |
| 286 break; | 297 break; |
| 298 case TabAlertState::USB_CONNECTED: |
| 299 result.append( |
| 300 l10n_util::GetStringUTF16(IDS_TOOLTIP_TAB_ALERT_STATE_USB_CONNECTED)); |
| 301 break; |
| 287 case TabAlertState::NONE: | 302 case TabAlertState::NONE: |
| 288 NOTREACHED(); | 303 NOTREACHED(); |
| 289 break; | 304 break; |
| 290 } | 305 } |
| 291 return result; | 306 return result; |
| 292 } | 307 } |
| 293 | 308 |
| 294 bool AreExperimentalMuteControlsEnabled() { | 309 bool AreExperimentalMuteControlsEnabled() { |
| 295 return base::CommandLine::ForCurrentProcess()->HasSwitch( | 310 return base::CommandLine::ForCurrentProcess()->HasSwitch( |
| 296 switches::kEnableTabAudioMuting); | 311 switches::kEnableTabAudioMuting); |
| 297 } | 312 } |
| 298 | 313 |
| 299 bool CanToggleAudioMute(content::WebContents* contents) { | 314 bool CanToggleAudioMute(content::WebContents* contents) { |
| 300 switch (GetTabAlertStateForContents(contents)) { | 315 switch (GetTabAlertStateForContents(contents)) { |
| 301 case TabAlertState::NONE: | 316 case TabAlertState::NONE: |
| 302 case TabAlertState::AUDIO_PLAYING: | 317 case TabAlertState::AUDIO_PLAYING: |
| 303 case TabAlertState::AUDIO_MUTING: | 318 case TabAlertState::AUDIO_MUTING: |
| 304 return true; | 319 return true; |
| 305 case TabAlertState::MEDIA_RECORDING: | 320 case TabAlertState::MEDIA_RECORDING: |
| 306 case TabAlertState::TAB_CAPTURING: | 321 case TabAlertState::TAB_CAPTURING: |
| 307 case TabAlertState::BLUETOOTH_CONNECTED: | 322 case TabAlertState::BLUETOOTH_CONNECTED: |
| 323 case TabAlertState::USB_CONNECTED: |
| 308 return false; | 324 return false; |
| 309 } | 325 } |
| 310 NOTREACHED(); | 326 NOTREACHED(); |
| 311 return false; | 327 return false; |
| 312 } | 328 } |
| 313 | 329 |
| 314 TabMutedReason GetTabAudioMutedReason(content::WebContents* contents) { | 330 TabMutedReason GetTabAudioMutedReason(content::WebContents* contents) { |
| 315 LastMuteMetadata::CreateForWebContents(contents); // Ensures metadata exists. | 331 LastMuteMetadata::CreateForWebContents(contents); // Ensures metadata exists. |
| 316 LastMuteMetadata* const metadata = | 332 LastMuteMetadata* const metadata = |
| 317 LastMuteMetadata::FromWebContents(contents); | 333 LastMuteMetadata::FromWebContents(contents); |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 375 const std::vector<int>& indices) { | 391 const std::vector<int>& indices) { |
| 376 for (std::vector<int>::const_iterator i = indices.begin(); i != indices.end(); | 392 for (std::vector<int>::const_iterator i = indices.begin(); i != indices.end(); |
| 377 ++i) { | 393 ++i) { |
| 378 if (!tab_strip.GetWebContentsAt(*i)->IsAudioMuted()) | 394 if (!tab_strip.GetWebContentsAt(*i)->IsAudioMuted()) |
| 379 return false; | 395 return false; |
| 380 } | 396 } |
| 381 return true; | 397 return true; |
| 382 } | 398 } |
| 383 | 399 |
| 384 } // namespace chrome | 400 } // namespace chrome |
| OLD | NEW |