Index: chrome/browser/ui/views/location_bar/location_bar_view.cc |
diff --git a/chrome/browser/ui/views/location_bar/location_bar_view.cc b/chrome/browser/ui/views/location_bar/location_bar_view.cc |
index 083b8fdf0ebdea27e6ed8715cf1d882a47a046a2..0bb09b5fa3357201b1aaf4375a9e357087aa5864 100644 |
--- a/chrome/browser/ui/views/location_bar/location_bar_view.cc |
+++ b/chrome/browser/ui/views/location_bar/location_bar_view.cc |
@@ -35,6 +35,7 @@ |
#include "chrome/browser/ui/content_settings/content_setting_bubble_model.h" |
#include "chrome/browser/ui/passwords/manage_passwords_ui_controller.h" |
#include "chrome/browser/ui/tabs/tab_strip_model.h" |
+#include "chrome/browser/ui/view_ids.h" |
#include "chrome/browser/ui/views/autofill/save_card_icon_view.h" |
#include "chrome/browser/ui/views/browser_dialogs.h" |
#include "chrome/browser/ui/views/layout_constants.h" |
@@ -73,6 +74,7 @@ |
#include "grit/theme_resources.h" |
#include "ui/accessibility/ax_view_state.h" |
#include "ui/base/dragdrop/drag_drop_types.h" |
+#include "ui/base/l10n/l10n_util.h" |
#include "ui/base/resource/material_design/material_design_controller.h" |
#include "ui/base/resource/resource_bundle.h" |
#include "ui/base/theme_provider.h" |
@@ -91,6 +93,7 @@ |
#include "ui/views/background.h" |
#include "ui/views/border.h" |
#include "ui/views/button_drag_utils.h" |
+#include "ui/views/controls/button/image_button.h" |
#include "ui/views/controls/label.h" |
#include "ui/views/widget/widget.h" |
@@ -136,6 +139,7 @@ |
selected_keyword_view_(NULL), |
suggested_text_view_(NULL), |
keyword_hint_view_(NULL), |
+ mic_search_view_(NULL), |
zoom_view_(NULL), |
open_pdf_in_reader_view_(NULL), |
manage_passwords_icon_view_(NULL), |
@@ -153,6 +157,9 @@ |
base::Bind(&LocationBarView::UpdateWithoutTabRestore, |
base::Unretained(this))); |
+ if (browser_) |
+ browser_->search_model()->AddObserver(this); |
+ |
ui_zoom::ZoomEventManager::GetForBrowserContext(profile) |
->AddZoomEventManagerObserver(this); |
@@ -166,6 +173,8 @@ |
LocationBarView::~LocationBarView() { |
if (template_url_service_) |
template_url_service_->RemoveObserver(this); |
+ if (browser_) |
+ browser_->search_model()->RemoveObserver(this); |
ui_zoom::ZoomEventManager::GetForBrowserContext(profile()) |
->RemoveZoomEventManagerObserver(this); |
@@ -270,6 +279,20 @@ |
background_color); |
AddChildView(keyword_hint_view_); |
+ mic_search_view_ = new views::ImageButton(this); |
+ mic_search_view_->set_id(VIEW_ID_MIC_SEARCH_BUTTON); |
+ mic_search_view_->SetAccessibilityFocusable(true); |
+ mic_search_view_->SetTooltipText( |
+ l10n_util::GetStringUTF16(IDS_TOOLTIP_MIC_SEARCH)); |
+ mic_search_view_->SetImage( |
+ views::Button::STATE_NORMAL, |
+ ui::ResourceBundle::GetSharedInstance().GetImageSkiaNamed( |
+ IDR_OMNIBOX_MIC_SEARCH)); |
+ mic_search_view_->SetImageAlignment(views::ImageButton::ALIGN_CENTER, |
+ views::ImageButton::ALIGN_MIDDLE); |
+ mic_search_view_->SetVisible(false); |
+ AddChildView(mic_search_view_); |
+ |
const SkColor text_color = GetColor(SecurityStateModel::NONE, TEXT); |
for (ContentSettingsType type : |
ContentSettingBubbleModel::GetSupportedBubbleTypes()) { |
@@ -555,11 +578,12 @@ |
// Compute width of omnibox-trailing content. |
int trailing_width = horizontal_edge_thickness; |
trailing_width += IncrementalMinimumWidth(star_view_) + |
- IncrementalMinimumWidth(translate_icon_view_) + |
- IncrementalMinimumWidth(open_pdf_in_reader_view_) + |
- IncrementalMinimumWidth(save_credit_card_icon_view_) + |
- IncrementalMinimumWidth(manage_passwords_icon_view_) + |
- IncrementalMinimumWidth(zoom_view_); |
+ IncrementalMinimumWidth(translate_icon_view_) + |
+ IncrementalMinimumWidth(open_pdf_in_reader_view_) + |
+ IncrementalMinimumWidth(save_credit_card_icon_view_) + |
+ IncrementalMinimumWidth(manage_passwords_icon_view_) + |
+ IncrementalMinimumWidth(zoom_view_) + |
+ IncrementalMinimumWidth(mic_search_view_); |
for (PageActionViews::const_iterator i(page_action_views_.begin()); |
i != page_action_views_.end(); ++i) |
trailing_width += IncrementalMinimumWidth((*i)); |
@@ -682,6 +706,10 @@ |
*i); |
} |
} |
+ if (mic_search_view_->visible()) { |
+ trailing_decorations.AddDecoration(vertical_padding, location_height, |
+ mic_search_view_); |
+ } |
// Because IMEs may eat the tab key, we don't show "press tab to search" while |
// IME composition is in progress. |
if (!keyword.empty() && omnibox_view_->model()->is_keyword_hint() && |
@@ -792,6 +820,9 @@ |
} |
void LocationBarView::Update(const WebContents* contents) { |
+ mic_search_view_->SetVisible( |
+ !GetToolbarModel()->input_in_progress() && browser_ && |
+ browser_->search_model()->voice_search_supported()); |
RefreshContentSettingViews(); |
RefreshZoomView(); |
RefreshPageActionViews(); |
@@ -1304,6 +1335,15 @@ |
} |
//////////////////////////////////////////////////////////////////////////////// |
+// LocationBarView, private views::ButtonListener implementation: |
+ |
+void LocationBarView::ButtonPressed(views::Button* sender, |
+ const ui::Event& event) { |
+ DCHECK_EQ(mic_search_view_, sender); |
+ command_updater()->ExecuteCommand(IDC_TOGGLE_SPEECH_INPUT); |
+} |
+ |
+//////////////////////////////////////////////////////////////////////////////// |
// LocationBarView, private views::DragController implementation: |
void LocationBarView::WriteDragDataForView(views::View* sender, |
@@ -1392,3 +1432,16 @@ |
if (omnibox_view_ && omnibox_view_->GetWidget()->IsActive()) |
ShowFirstRunBubble(); |
} |
+ |
+//////////////////////////////////////////////////////////////////////////////// |
+// LocationBarView, private SearchModelObserver implementation: |
+ |
+void LocationBarView::ModelChanged(const SearchModel::State& old_state, |
+ const SearchModel::State& new_state) { |
+ const bool visible = !GetToolbarModel()->input_in_progress() && |
+ new_state.voice_search_supported; |
+ if (mic_search_view_->visible() != visible) { |
+ mic_search_view_->SetVisible(visible); |
+ Layout(); |
+ } |
+} |