1a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
2a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// found in the LICENSE file.
4a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
5a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ash/system/chromeos/virtual_keyboard/virtual_keyboard_tray.h"
6a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
75f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "ash/shelf/shelf.h"
8a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "ash/shelf/shelf_constants.h"
9a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ash/shell.h"
10a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ash/system/status_area_widget.h"
11a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ash/system/tray/system_tray_notifier.h"
12a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ash/system/tray/tray_constants.h"
13a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ash/system/tray/tray_utils.h"
14a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "grit/ash_resources.h"
15a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "grit/ash_strings.h"
16a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h"
17a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/base/resource/resource_bundle.h"
18a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/events/event.h"
19a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/gfx/image/image_skia.h"
20a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/keyboard/keyboard_controller.h"
21a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/views/controls/button/image_button.h"
22a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
23a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)namespace ash {
24a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
25a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)VirtualKeyboardTray::VirtualKeyboardTray(StatusAreaWidget* status_area_widget)
26a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    : TrayBackgroundView(status_area_widget),
27a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      button_(NULL) {
285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  button_ = new views::ImageButton(this);
29a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  button_->SetImage(views::CustomButton::STATE_NORMAL,
30a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                    ui::ResourceBundle::GetSharedInstance().GetImageSkiaNamed(
31a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                        IDR_AURA_UBER_TRAY_VIRTUAL_KEYBOARD));
32a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  button_->SetImageAlignment(views::ImageButton::ALIGN_CENTER,
33a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                             views::ImageButton::ALIGN_MIDDLE);
34a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
35a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  tray_container()->AddChildView(button_);
36a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SetContentsBackground();
37a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // The Shell may not exist in some unit tests.
38a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (Shell::HasInstance()) {
39a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    Shell::GetInstance()->system_tray_notifier()->
40a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        AddAccessibilityObserver(this);
41a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
42a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
43a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
44a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)VirtualKeyboardTray::~VirtualKeyboardTray() {
45a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // The Shell may not exist in some unit tests.
46a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (Shell::HasInstance()) {
47a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    Shell::GetInstance()->system_tray_notifier()->
48a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        RemoveAccessibilityObserver(this);
49a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
50a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
51a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
52a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void VirtualKeyboardTray::SetShelfAlignment(ShelfAlignment alignment) {
53a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  TrayBackgroundView::SetShelfAlignment(alignment);
54a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  tray_container()->SetBorder(views::Border::NullBorder());
555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Pad button size to align with other controls in the system tray.
575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  const gfx::ImageSkia image = button_->GetImage(
585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      views::CustomButton::STATE_NORMAL);
595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  int top_padding = (kTrayBarButtonWidth - image.height()) / 2;
605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  int left_padding = (kTrayBarButtonWidth - image.width()) / 2;
615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  int bottom_padding = kTrayBarButtonWidth - image.height() - top_padding;
625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  int right_padding = kTrayBarButtonWidth - image.width() - left_padding;
635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Square up the padding if horizontally aligned. Avoid extra padding when
655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // vertically aligned as the button would violate the width constraint on the
665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // shelf.
675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (alignment == SHELF_ALIGNMENT_BOTTOM || alignment == SHELF_ALIGNMENT_TOP) {
685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    gfx::Insets insets = button_->GetInsets();
695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    int additional_padding = std::max(0, top_padding - left_padding);
705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    left_padding += additional_padding;
715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    right_padding += additional_padding;
725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  button_->SetBorder(views::Border::CreateEmptyBorder(
755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      top_padding,
765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      left_padding,
775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      bottom_padding,
785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      right_padding));
79a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
80a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
81a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)base::string16 VirtualKeyboardTray::GetAccessibleNameForTray() {
82a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return l10n_util::GetStringUTF16(
83a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      IDS_ASH_VIRTUAL_KEYBOARD_TRAY_ACCESSIBLE_NAME);
84a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
85a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
86a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void VirtualKeyboardTray::HideBubbleWithView(
87a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    const views::TrayBubbleView* bubble_view) {
88a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
89a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
90a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)bool VirtualKeyboardTray::ClickedOutsideBubble() {
91a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return false;
92a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
93a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
94a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)bool VirtualKeyboardTray::PerformAction(const ui::Event& event) {
950529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  keyboard::KeyboardController::GetInstance()->ShowKeyboard(true);
96a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return true;
97a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
98a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
99a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void VirtualKeyboardTray::ButtonPressed(views::Button* sender,
100a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                        const ui::Event& event) {
101a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  DCHECK_EQ(button_, sender);
102a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PerformAction(event);
103a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
104a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
105a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void VirtualKeyboardTray::OnAccessibilityModeChanged(
106a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    AccessibilityNotificationVisibility notify) {
107a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SetVisible(Shell::GetInstance()->accessibility_delegate()->
108a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      IsVirtualKeyboardEnabled());
109a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
110a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
111a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}  // namespace ash
112