Index: ash/common/system/chromeos/ime_menu/ime_menu_tray.cc |
diff --git a/ash/common/system/chromeos/ime_menu/ime_menu_tray.cc b/ash/common/system/chromeos/ime_menu/ime_menu_tray.cc |
index 6defd83cdc7e06b58e5413e14f2ea3480baf0199..18640cbc58be42a61014872e896b0fbae80094be 100644 |
--- a/ash/common/system/chromeos/ime_menu/ime_menu_tray.cc |
+++ b/ash/common/system/chromeos/ime_menu/ime_menu_tray.cc |
@@ -4,6 +4,7 @@ |
#include "ash/common/system/chromeos/ime_menu/ime_menu_tray.h" |
+#include "ash/common/accessibility_delegate.h" |
#include "ash/common/material_design/material_design_controller.h" |
#include "ash/common/session/session_state_delegate.h" |
#include "ash/common/shelf/wm_shelf_util.h" |
@@ -23,15 +24,23 @@ |
#include "base/strings/utf_string_conversions.h" |
#include "grit/ash_resources.h" |
#include "grit/ash_strings.h" |
+#include "ui/base/ime/chromeos/input_method_manager.h" |
#include "ui/base/l10n/l10n_util.h" |
#include "ui/base/resource/resource_bundle.h" |
+#include "ui/keyboard/keyboard_controller.h" |
+#include "ui/keyboard/keyboard_util.h" |
#include "ui/views/controls/label.h" |
#include "ui/views/layout/box_layout.h" |
+using chromeos::input_method::InputMethodManager; |
+ |
namespace ash { |
namespace { |
+// The border width between buttons. |
+const int kButtonRightBorder = 1; |
+ |
// Returns the max height of ImeListView. |
int GetImeListViewMaxHeight() { |
const int max_items = 7; |
@@ -83,10 +92,14 @@ class ImeButtonsView : public views::View, |
public views::ButtonListener, |
public ViewClickListener { |
public: |
- ImeButtonsView(bool show_emoji_button, |
+ ImeButtonsView(ImeMenuTray* ime_menu_tray, |
+ bool show_emoji_button, |
bool show_voice_button, |
bool show_handwriting_button, |
- bool show_settings_button) { |
+ bool show_settings_button) |
+ : ime_menu_tray_(ime_menu_tray) { |
+ DCHECK(ime_menu_tray_); |
+ |
SetBorder( |
views::Border::CreateSolidSidedBorder(1, 0, 0, 0, kBorderDarkColor)); |
@@ -116,20 +129,32 @@ class ImeButtonsView : public views::View, |
// views::ButtonListener: |
void ButtonPressed(views::Button* sender, const ui::Event& event) override { |
- if (emoji_button_ && sender == emoji_button_) { |
- // TODO(azurewei): Opens emoji palette. |
- } else if (voice_button_ && sender == voice_button_) { |
- // TODO(azurewei): Brings virtual keyboard for emoji input. |
- } else if (handwriting_button_ && sender == handwriting_button_) { |
- // TODO(azurewei): Brings virtual keyboard for handwriting input. |
- } else if (settings_button_ && sender == settings_button_) { |
+ if (sender == settings_button_) { |
+ ime_menu_tray_->HideImeMenuBubble(); |
ShowIMESettings(); |
+ return; |
} |
+ |
+ // The |keyset| will be used for drawing input view keyset in IME |
+ // extensions. InputMethodManager::ShowKeyboardWithKeyset() will deal with |
+ // the |keyset| string to generate the right input view url. |
+ std::string keyset; |
+ if (sender == emoji_button_) |
+ keyset = "emoji"; |
+ else if (sender == voice_button_) |
+ keyset = "voice"; |
+ else if (sender == handwriting_button_) |
+ keyset = "hwt"; |
+ else |
+ NOTREACHED(); |
+ |
+ ime_menu_tray_->ShowKeyboardWithKeyset(keyset); |
} |
// ViewClickListener: |
void OnViewClicked(views::View* sender) override { |
if (one_settings_button_view_ && sender == one_settings_button_view_) { |
+ ime_menu_tray_->HideImeMenuBubble(); |
ShowIMESettings(); |
} |
} |
@@ -164,14 +189,32 @@ class ImeButtonsView : public views::View, |
if (show_emoji_button) { |
// TODO(azurewei): Creates the proper button with icons. |
+ emoji_button_ = CreateImeMenuButton( |
+ this, IDR_AURA_UBER_TRAY_SETTINGS, IDR_AURA_UBER_TRAY_SETTINGS, |
+ IDR_AURA_UBER_TRAY_SETTINGS, IDR_AURA_UBER_TRAY_SETTINGS, |
+ IDS_ASH_STATUS_TRAY_SETTINGS, IDS_ASH_STATUS_TRAY_SETTINGS, |
+ kButtonRightBorder); |
+ AddChildView(emoji_button_); |
} |
if (show_voice_button) { |
// TODO(azurewei): Creates the proper button with icons. |
+ voice_button_ = CreateImeMenuButton( |
+ this, IDR_AURA_UBER_TRAY_SETTINGS, IDR_AURA_UBER_TRAY_SETTINGS, |
+ IDR_AURA_UBER_TRAY_SETTINGS, IDR_AURA_UBER_TRAY_SETTINGS, |
+ IDS_ASH_STATUS_TRAY_SETTINGS, IDS_ASH_STATUS_TRAY_SETTINGS, |
+ kButtonRightBorder); |
+ AddChildView(voice_button_); |
} |
if (show_handwriting_button) { |
// TODO(azurewei): Creates the proper button with icons. |
+ handwriting_button_ = CreateImeMenuButton( |
+ this, IDR_AURA_UBER_TRAY_SETTINGS, IDR_AURA_UBER_TRAY_SETTINGS, |
+ IDR_AURA_UBER_TRAY_SETTINGS, IDR_AURA_UBER_TRAY_SETTINGS, |
+ IDS_ASH_STATUS_TRAY_SETTINGS, IDS_ASH_STATUS_TRAY_SETTINGS, |
+ kButtonRightBorder); |
+ AddChildView(handwriting_button_); |
} |
if (show_settings_button) { |
@@ -183,6 +226,7 @@ class ImeButtonsView : public views::View, |
} |
} |
+ ImeMenuTray* ime_menu_tray_; |
TrayPopupHeaderButton* emoji_button_; |
TrayPopupHeaderButton* voice_button_; |
TrayPopupHeaderButton* handwriting_button_; |
@@ -195,7 +239,10 @@ class ImeButtonsView : public views::View, |
} // namespace |
ImeMenuTray::ImeMenuTray(WmShelf* wm_shelf) |
- : TrayBackgroundView(wm_shelf), label_(new ImeMenuLabel()) { |
+ : TrayBackgroundView(wm_shelf), |
+ label_(new ImeMenuLabel()), |
+ show_keyboard_(false), |
+ force_show_keyboard_(false) { |
SetupLabelForTray(label_); |
tray_container()->AddChildView(label_); |
SetContentsBackground(); |
@@ -234,17 +281,66 @@ void ImeMenuTray::ShowImeMenuBubble() { |
LoginStatus login = |
WmShell::Get()->system_tray_delegate()->GetUserLoginStatus(); |
if (login != LoginStatus::NOT_LOGGED_IN && login != LoginStatus::LOCKED && |
- !WmShell::Get()->GetSessionStateDelegate()->IsInSecondaryLoginScreen()) |
- bubble_view->AddChildView(new ImeButtonsView(false, false, false, true)); |
+ !WmShell::Get()->GetSessionStateDelegate()->IsInSecondaryLoginScreen()) { |
+ if (InputMethodManager::Get() && |
+ InputMethodManager::Get()->IsEmojiHandwritingVoiceOnImeMenuEnabled() && |
+ !current_ime_.third_party) { |
+ bubble_view->AddChildView( |
+ new ImeButtonsView(this, true, true, true, true)); |
+ } else { |
+ bubble_view->AddChildView( |
+ new ImeButtonsView(this, false, false, false, true)); |
+ } |
+ } |
bubble_.reset(new TrayBubbleWrapper(this, bubble_view)); |
SetDrawBackgroundAsActive(true); |
} |
+void ImeMenuTray::HideImeMenuBubble() { |
+ bubble_.reset(); |
+ ime_list_view_ = nullptr; |
+ SetDrawBackgroundAsActive(false); |
+} |
+ |
bool ImeMenuTray::IsImeMenuBubbleShown() { |
return !!bubble_; |
} |
+void ImeMenuTray::ShowKeyboardWithKeyset(const std::string& keyset) { |
+ HideImeMenuBubble(); |
+ |
+ // Overrides the keyboard url ref to make it shown with the given keyset. |
+ if (InputMethodManager::Get()) |
+ InputMethodManager::Get()->OverrideKeyboardUrlRef(keyset); |
+ |
+ // If onscreen keyboard has been enabled, shows the keyboard directly. |
+ keyboard::KeyboardController* keyboard_controller = |
+ keyboard::KeyboardController::GetInstance(); |
+ show_keyboard_ = true; |
+ if (keyboard_controller) { |
+ keyboard_controller->AddObserver(this); |
+ keyboard_controller->ShowKeyboard(false); |
+ return; |
+ } |
+ |
+ AccessibilityDelegate* accessibility_delegate = |
+ WmShell::Get()->accessibility_delegate(); |
+ // Fails to show the keyboard. |
+ if (accessibility_delegate->IsVirtualKeyboardEnabled()) |
+ return; |
+ |
+ // Onscreen keyboard has not been enabled yet, forces to bring out the |
+ // keyboard for one time. |
+ force_show_keyboard_ = true; |
+ accessibility_delegate->SetVirtualKeyboardEnabled(true); |
+ keyboard_controller = keyboard::KeyboardController::GetInstance(); |
+ if (keyboard_controller) { |
+ keyboard_controller->AddObserver(this); |
+ keyboard_controller->ShowKeyboard(false); |
+ } |
+} |
+ |
void ImeMenuTray::SetShelfAlignment(ShelfAlignment alignment) { |
TrayBackgroundView::SetShelfAlignment(alignment); |
if (!MaterialDesignController::IsShelfMaterial()) |
@@ -340,6 +436,39 @@ void ImeMenuTray::HideBubble(const views::TrayBubbleView* bubble_view) { |
HideBubbleWithView(bubble_view); |
} |
+void ImeMenuTray::OnKeyboardBoundsChanging(const gfx::Rect& new_bounds) {} |
+ |
+void ImeMenuTray::OnKeyboardClosed() { |
+ if (InputMethodManager::Get()) |
+ InputMethodManager::Get()->OverrideKeyboardUrlRef(std::string()); |
+ show_keyboard_ = false; |
+ force_show_keyboard_ = false; |
+} |
+ |
+void ImeMenuTray::OnKeyboardHidden() { |
+ if (!show_keyboard_) |
+ return; |
+ |
+ // If the the IME menu has overriding the input view url, we should write it |
+ // back to normal keyboard when hiding the input view. |
+ if (InputMethodManager::Get()) |
+ InputMethodManager::Get()->OverrideKeyboardUrlRef(std::string()); |
+ show_keyboard_ = false; |
+ |
+ // If the keyboard is forced to be shown by IME menu for once, we need to |
+ // disable the keyboard when it's hidden. |
+ keyboard::KeyboardController* keyboard_controller = |
+ keyboard::KeyboardController::GetInstance(); |
+ if (keyboard_controller) |
+ keyboard_controller->RemoveObserver(this); |
+ |
+ if (!force_show_keyboard_) |
+ return; |
+ |
+ WmShell::Get()->accessibility_delegate()->SetVirtualKeyboardEnabled(false); |
+ force_show_keyboard_ = false; |
+} |
+ |
void ImeMenuTray::UpdateTrayLabel() { |
WmShell::Get()->system_tray_delegate()->GetCurrentIME(¤t_ime_); |
@@ -350,10 +479,4 @@ void ImeMenuTray::UpdateTrayLabel() { |
label_->SetText(current_ime_.short_name); |
} |
-void ImeMenuTray::HideImeMenuBubble() { |
- bubble_.reset(); |
- ime_list_view_ = nullptr; |
- SetDrawBackgroundAsActive(false); |
-} |
- |
} // namespace ash |