Commit 0669d105 authored by Tetsui Ohkubo's avatar Tetsui Ohkubo Committed by Commit Bot

Replace SystemTrayItem by DetailedViewDelegate in TrayDetailedView

Previously TrayDetailedView directly depended on SystemTrayItem. It did
not work with UnifiedSystemTray.

In this CL, bubble related actions from TrayDetailedView will be
delegated to DetailedViewDelegate.
This CL also includes SystemTrayDetailedViewDelegate, which implements
the default behavior for old SystemTray.

In upcoming CLs DetailedViewDelegate implementation for
UnifiedSystemTray will be added.

Design doc: go/cros-qs-restyling (See "detailed view" section)

TEST=ash_unittests
BUG=835733

Change-Id: I54074335f982ab4e1d07abdb88c5347e6c1d7ff1
Reviewed-on: https://chromium-review.googlesource.com/1068560Reviewed-by: default avatarSteven Bennetts <stevenjb@chromium.org>
Commit-Queue: Tetsui Ohkubo <tetsui@chromium.org>
Cr-Commit-Position: refs/heads/master@{#561713}
parent 0037cefc
......@@ -814,6 +814,7 @@ component("ash") {
"system/tracing_notification_controller.h",
"system/tray/actionable_view.cc",
"system/tray/actionable_view.h",
"system/tray/detailed_view_delegate.h",
"system/tray/hover_highlight_view.cc",
"system/tray/hover_highlight_view.h",
"system/tray/interacted_by_tap_recorder.cc",
......@@ -832,6 +833,8 @@ component("ash") {
"system/tray/system_tray_controller.h",
"system/tray/system_tray_item.cc",
"system/tray/system_tray_item.h",
"system/tray/system_tray_item_detailed_view_delegate.cc",
"system/tray/system_tray_item_detailed_view_delegate.h",
"system/tray/system_tray_notifier.cc",
"system/tray/system_tray_notifier.h",
"system/tray/system_tray_view.cc",
......
......@@ -57,8 +57,8 @@ using chromeos::CrasAudioHandler;
namespace ash {
namespace tray {
AudioDetailedView::AudioDetailedView(SystemTrayItem* owner)
: TrayDetailedView(owner) {
AudioDetailedView::AudioDetailedView(DetailedViewDelegate* delegate)
: TrayDetailedView(delegate) {
CreateItems();
Update();
}
......
......@@ -20,7 +20,7 @@ namespace tray {
class AudioDetailedView : public TrayDetailedView {
public:
explicit AudioDetailedView(SystemTrayItem* owner);
explicit AudioDetailedView(DetailedViewDelegate* delegate);
~AudioDetailedView() override;
......
......@@ -11,6 +11,7 @@
#include "ash/system/audio/audio_detailed_view.h"
#include "ash/system/audio/volume_view.h"
#include "ash/system/tray/system_tray.h"
#include "ash/system/tray/system_tray_item_detailed_view_delegate.h"
#include "ash/system/tray/tray_constants.h"
#include "chromeos/dbus/dbus_thread_manager.h"
#include "ui/display/display.h"
......@@ -28,7 +29,9 @@ TrayAudio::TrayAudio(SystemTray* system_tray)
: TrayImageItem(system_tray, kSystemTrayVolumeMuteIcon, UMA_AUDIO),
volume_view_(nullptr),
pop_up_volume_view_(false),
audio_detail_view_(nullptr) {
audio_detail_view_(nullptr),
detailed_view_delegate_(
std::make_unique<SystemTrayItemDetailedViewDelegate>(this)) {
if (CrasAudioHandler::IsInitialized())
CrasAudioHandler::Get()->AddAudioObserver(this);
display::Screen::GetScreen()->AddObserver(this);
......@@ -71,7 +74,8 @@ views::View* TrayAudio::CreateDetailedView(LoginStatus status) {
} else {
Shell::Get()->metrics()->RecordUserMetricsAction(
UMA_STATUS_AREA_DETAILED_AUDIO_VIEW);
audio_detail_view_ = new tray::AudioDetailedView(this);
audio_detail_view_ =
new tray::AudioDetailedView(detailed_view_delegate_.get());
return audio_detail_view_;
}
}
......
......@@ -21,6 +21,8 @@ class AudioDetailedView;
class VolumeView;
}
class DetailedViewDelegate;
// The system tray item for audio input and output.
class ASH_EXPORT TrayAudio : public TrayImageItem,
public chromeos::CrasAudioHandler::AudioObserver,
......@@ -79,6 +81,8 @@ class ASH_EXPORT TrayAudio : public TrayImageItem,
tray::AudioDetailedView* audio_detail_view_;
const std::unique_ptr<DetailedViewDelegate> detailed_view_delegate_;
DISALLOW_COPY_AND_ASSIGN(TrayAudio);
};
......
......@@ -19,6 +19,7 @@
#include "ash/system/tray/hover_highlight_view.h"
#include "ash/system/tray/system_tray.h"
#include "ash/system/tray/system_tray_controller.h"
#include "ash/system/tray/system_tray_item_detailed_view_delegate.h"
#include "ash/system/tray/system_tray_notifier.h"
#include "ash/system/tray/tray_constants.h"
#include "ash/system/tray/tray_detailed_view.h"
......@@ -185,8 +186,8 @@ class BluetoothDefaultView : public TrayItemMore {
class BluetoothDetailedView : public TrayDetailedView {
public:
BluetoothDetailedView(SystemTrayItem* owner, LoginStatus login)
: TrayDetailedView(owner),
BluetoothDetailedView(DetailedViewDelegate* delegate, LoginStatus login)
: TrayDetailedView(delegate),
login_(login),
toggle_(nullptr),
settings_(nullptr),
......@@ -430,7 +431,7 @@ class BluetoothDetailedView : public TrayDetailedView {
void ShowSettings() {
if (TrayPopupUtils::CanOpenWebUISettings()) {
Shell::Get()->system_tray_controller()->ShowBluetoothSettings();
owner()->system_tray()->CloseBubble();
CloseBubble();
}
}
......@@ -550,7 +551,9 @@ class BluetoothDetailedView : public TrayDetailedView {
TrayBluetooth::TrayBluetooth(SystemTray* system_tray)
: SystemTrayItem(system_tray, UMA_BLUETOOTH),
default_(nullptr),
detailed_(nullptr) {
detailed_(nullptr),
detailed_view_delegate_(
std::make_unique<SystemTrayItemDetailedViewDelegate>(this)) {
Shell::Get()->system_tray_notifier()->AddBluetoothObserver(this);
}
......@@ -584,7 +587,8 @@ views::View* TrayBluetooth::CreateDetailedView(LoginStatus status) {
Shell::Get()->metrics()->RecordUserMetricsAction(
UMA_STATUS_AREA_DETAILED_BLUETOOTH_VIEW);
CHECK(detailed_ == nullptr);
detailed_ = new tray::BluetoothDetailedView(this, status);
detailed_ =
new tray::BluetoothDetailedView(detailed_view_delegate_.get(), status);
detailed_->Update();
return detailed_;
}
......
......@@ -15,6 +15,8 @@ class BluetoothDefaultView;
class BluetoothDetailedView;
}
class DetailedViewDelegate;
// Bluetooth section in the main system tray menu. Contains:
// * Toggle to turn Bluetooth on and off
// * Gear icon that takes the user to the web ui settings
......@@ -40,6 +42,8 @@ class TrayBluetooth : public SystemTrayItem, public BluetoothObserver {
tray::BluetoothDefaultView* default_;
tray::BluetoothDetailedView* detailed_;
const std::unique_ptr<DetailedViewDelegate> detailed_view_delegate_;
DISALLOW_COPY_AND_ASSIGN(TrayBluetooth);
};
......
......@@ -17,6 +17,7 @@
#include "ash/system/screen_security/screen_tray_item.h"
#include "ash/system/tray/hover_highlight_view.h"
#include "ash/system/tray/system_tray.h"
#include "ash/system/tray/system_tray_item_detailed_view_delegate.h"
#include "ash/system/tray/tray_constants.h"
#include "ash/system/tray/tray_detailed_view.h"
#include "ash/system/tray/tray_item_more.h"
......@@ -336,7 +337,7 @@ CastTrayView::~CastTrayView() = default;
// |CastSelectDefaultView|.
class CastDetailedView : public TrayDetailedView {
public:
CastDetailedView(SystemTrayItem* owner,
CastDetailedView(DetailedViewDelegate* delegate,
const std::vector<mojom::SinkAndRoutePtr>& sinks_and_routes);
~CastDetailedView() override;
......@@ -365,9 +366,9 @@ class CastDetailedView : public TrayDetailedView {
};
CastDetailedView::CastDetailedView(
SystemTrayItem* owner,
DetailedViewDelegate* delegate,
const std::vector<mojom::SinkAndRoutePtr>& sinks_routes)
: TrayDetailedView(owner) {
: TrayDetailedView(delegate) {
CreateItems();
UpdateReceiverList(sinks_routes);
}
......@@ -447,7 +448,9 @@ void CastDetailedView::HandleViewClicked(views::View* view) {
} // namespace tray
TrayCast::TrayCast(SystemTray* system_tray)
: SystemTrayItem(system_tray, UMA_CAST) {
: SystemTrayItem(system_tray, UMA_CAST),
detailed_view_delegate_(
std::make_unique<SystemTrayItemDetailedViewDelegate>(this)) {
Shell::Get()->AddShellObserver(this);
Shell::Get()->cast_config()->AddObserver(this);
Shell::Get()->cast_config()->RequestDeviceRefresh();
......@@ -499,7 +502,8 @@ views::View* TrayCast::CreateDetailedView(LoginStatus status) {
Shell::Get()->metrics()->RecordUserMetricsAction(
UMA_STATUS_AREA_DETAILED_CAST_VIEW);
CHECK(detailed_ == nullptr);
detailed_ = new tray::CastDetailedView(this, sinks_and_routes_);
detailed_ = new tray::CastDetailedView(detailed_view_delegate_.get(),
sinks_and_routes_);
return detailed_;
}
......
......@@ -20,6 +20,8 @@ class CastDetailedView;
class CastDuplexView;
} // namespace tray
class DetailedViewDelegate;
class ASH_EXPORT TrayCast : public SystemTrayItem,
public ShellObserver,
public CastConfigControllerObserver {
......@@ -70,6 +72,8 @@ class ASH_EXPORT TrayCast : public SystemTrayItem,
tray::CastDuplexView* default_ = nullptr;
tray::CastDetailedView* detailed_ = nullptr;
const std::unique_ptr<DetailedViewDelegate> detailed_view_delegate_;
DISALLOW_COPY_AND_ASSIGN(TrayCast);
};
......
......@@ -31,8 +31,8 @@ bool IsSameScaleFactor(double new_value) {
} // namespace
ScaleDetailedView::ScaleDetailedView(SystemTrayItem* owner)
: TrayDetailedView(owner) {
ScaleDetailedView::ScaleDetailedView(DetailedViewDelegate* delegate)
: TrayDetailedView(delegate) {
CreateScrollableList();
CreateTitleRow(IDS_ASH_STATUS_TRAY_SCALE);
UpdateScrollableList();
......
......@@ -19,7 +19,7 @@ namespace tray {
class ScaleDetailedView : public TrayDetailedView {
public:
explicit ScaleDetailedView(SystemTrayItem* owner);
explicit ScaleDetailedView(DetailedViewDelegate* delegate);
~ScaleDetailedView() override;
......
......@@ -10,6 +10,7 @@
#include "ash/system/display_scale/scale_detailed_view.h"
#include "ash/system/display_scale/scale_view.h"
#include "ash/system/tray/system_tray.h"
#include "ash/system/tray/system_tray_item_detailed_view_delegate.h"
#include "ash/system/tray/tray_constants.h"
#include "base/command_line.h"
#include "ui/views/view.h"
......@@ -25,7 +26,9 @@ bool IsDisplayScaleTrayEnabled() {
} // namespace
TrayScale::TrayScale(SystemTray* system_tray)
: SystemTrayItem(system_tray, UMA_NOT_RECORDED) {}
: SystemTrayItem(system_tray, UMA_NOT_RECORDED),
detailed_view_delegate_(
std::make_unique<SystemTrayItemDetailedViewDelegate>(this)) {}
TrayScale::~TrayScale() = default;
......@@ -39,7 +42,8 @@ views::View* TrayScale::CreateDefaultView(LoginStatus status) {
views::View* TrayScale::CreateDetailedView(LoginStatus status) {
if (!IsDisplayScaleTrayEnabled())
return nullptr;
scale_detail_view_ = new tray::ScaleDetailedView(this);
scale_detail_view_ =
new tray::ScaleDetailedView(detailed_view_delegate_.get());
return scale_detail_view_;
}
......
......@@ -17,6 +17,8 @@ class ScaleView;
class ScaleDetailedView;
} // namespace tray
class DetailedViewDelegate;
// The system tray item for display scale.
class ASH_EXPORT TrayScale : public SystemTrayItem {
public:
......@@ -35,6 +37,8 @@ class ASH_EXPORT TrayScale : public SystemTrayItem {
tray::ScaleDetailedView* scale_detail_view_;
const std::unique_ptr<DetailedViewDelegate> detailed_view_delegate_;
DISALLOW_COPY_AND_ASSIGN(TrayScale);
};
......
......@@ -14,6 +14,7 @@
#include "ash/strings/grit/ash_strings.h"
#include "ash/system/tray/system_tray.h"
#include "ash/system/tray/system_tray_controller.h"
#include "ash/system/tray/system_tray_item_detailed_view_delegate.h"
#include "ash/system/tray/system_tray_notifier.h"
#include "ash/system/tray/tray_constants.h"
#include "ash/system/tray/tray_detailed_view.h"
......@@ -76,8 +77,8 @@ class IMEDefaultView : public TrayItemMore {
// enterprise-controlled icon).
class IMEDetailedView : public ImeListView {
public:
IMEDetailedView(SystemTrayItem* owner, ImeController* ime_controller)
: ImeListView(owner), ime_controller_(ime_controller) {
IMEDetailedView(DetailedViewDelegate* delegate, ImeController* ime_controller)
: ImeListView(delegate), ime_controller_(ime_controller) {
DCHECK(ime_controller_);
}
......@@ -131,8 +132,7 @@ class IMEDetailedView : public ImeListView {
void ShowSettings() {
base::RecordAction(base::UserMetricsAction("StatusArea_IME_Detailed"));
Shell::Get()->system_tray_controller()->ShowIMESettings();
if (owner()->system_tray())
owner()->system_tray()->CloseBubble();
CloseBubble();
}
ImeController* const ime_controller_;
......@@ -155,7 +155,9 @@ TrayIME::TrayIME(SystemTray* system_tray)
default_(nullptr),
detailed_(nullptr),
keyboard_suppressed_(false),
is_visible_(true) {
is_visible_(true),
detailed_view_delegate_(
std::make_unique<SystemTrayItemDetailedViewDelegate>(this)) {
DCHECK(ime_controller_);
SystemTrayNotifier* tray_notifier = Shell::Get()->system_tray_notifier();
tray_notifier->AddVirtualKeyboardObserver(this);
......@@ -250,7 +252,8 @@ views::View* TrayIME::CreateDefaultView(LoginStatus status) {
views::View* TrayIME::CreateDetailedView(LoginStatus status) {
CHECK(detailed_ == nullptr);
detailed_ = new tray::IMEDetailedView(this, ime_controller_);
detailed_ =
new tray::IMEDetailedView(detailed_view_delegate_.get(), ime_controller_);
detailed_->Init(ShouldShowKeyboardToggle(), GetSingleImeBehavior());
return detailed_;
}
......
......@@ -24,6 +24,7 @@ class IMEDetailedView;
class ImeController;
class TrayItemView;
class DetailedViewDelegate;
// Controller for IME options in the system menu. Note this is separate from
// the "opt-in" IME menu which can appear as a button in the system tray
......@@ -93,6 +94,8 @@ class ASH_EXPORT TrayIME : public SystemTrayItem,
// Whether the IME label and tray items should be visible.
bool is_visible_;
const std::unique_ptr<DetailedViewDelegate> detailed_view_delegate_;
DISALLOW_COPY_AND_ASSIGN(TrayIME);
};
......
......@@ -45,13 +45,12 @@ const int kMinFontSizeDelta = -10;
// an IME property. A checkmark icon is shown in the row if selected.
class ImeListItemView : public ActionableView {
public:
ImeListItemView(SystemTrayItem* owner,
ImeListView* list_view,
ImeListItemView(ImeListView* list_view,
const base::string16& id,
const base::string16& label,
bool selected,
const SkColor button_color)
: ActionableView(owner, TrayPopupInkDropStyle::FILL_BOUNDS),
: ActionableView(nullptr, TrayPopupInkDropStyle::FILL_BOUNDS),
ime_list_view_(list_view),
selected_(selected) {
SetInkDropMode(InkDropHostView::InkDropMode::ON);
......@@ -181,8 +180,8 @@ class KeyboardStatusRow : public views::View {
DISALLOW_COPY_AND_ASSIGN(KeyboardStatusRow);
};
ImeListView::ImeListView(SystemTrayItem* owner)
: TrayDetailedView(owner),
ImeListView::ImeListView(DetailedViewDelegate* delegate)
: TrayDetailedView(delegate),
last_item_selected_with_keyboard_(false),
should_focus_ime_after_selection_with_keyboard_(false),
current_ime_view_(nullptr) {}
......@@ -250,9 +249,8 @@ void ImeListView::AppendImeListAndProperties(
DCHECK(ime_map_.empty());
for (size_t i = 0; i < list.size(); i++) {
const bool selected = current_ime_id == list[i].id;
views::View* ime_view =
new ImeListItemView(owner(), this, list[i].short_name, list[i].name,
selected, gfx::kGoogleGreen700);
views::View* ime_view = new ImeListItemView(
this, list[i].short_name, list[i].name, selected, gfx::kGoogleGreen700);
scroll_content()->AddChildView(ime_view);
ime_map_[ime_view] = list[i].id;
......@@ -267,9 +265,9 @@ void ImeListView::AppendImeListAndProperties(
// Adds the property items.
for (size_t i = 0; i < property_list.size(); i++) {
ImeListItemView* property_view = new ImeListItemView(
owner(), this, base::string16(), property_list[i].label,
property_list[i].checked, kMenuIconColor);
ImeListItemView* property_view =
new ImeListItemView(this, base::string16(), property_list[i].label,
property_list[i].checked, kMenuIconColor);
scroll_content()->AddChildView(property_view);
property_map_[property_view] = property_list[i].key;
}
......
......@@ -32,7 +32,7 @@ class ImeListView : public TrayDetailedView {
HIDE_SINGLE_IME
};
explicit ImeListView(SystemTrayItem* owner);
explicit ImeListView(DetailedViewDelegate* delegate);
~ImeListView() override;
......
......@@ -253,7 +253,7 @@ class ImeButtonsView : public views::View, public views::ButtonListener {
// height depending on the number of IMEs in the list.
class ImeMenuListView : public ImeListView {
public:
ImeMenuListView(SystemTrayItem* owner) : ImeListView(owner) {
ImeMenuListView(DetailedViewDelegate* delegate) : ImeListView(delegate) {
set_should_focus_ime_after_selection_with_keyboard(true);
}
......
......@@ -501,8 +501,9 @@ class WifiHeaderRowView : public NetworkListView::SectionHeaderRowView {
// NetworkListView:
NetworkListView::NetworkListView(SystemTrayItem* owner, LoginStatus login)
: NetworkStateListDetailedView(owner, LIST_TYPE_NETWORK, login),
NetworkListView::NetworkListView(DetailedViewDelegate* delegate,
LoginStatus login)
: NetworkStateListDetailedView(delegate, LIST_TYPE_NETWORK, login),
needs_relayout_(false),
no_wifi_networks_view_(nullptr),
mobile_header_view_(nullptr),
......
......@@ -37,7 +37,7 @@ class NetworkListView : public NetworkStateListDetailedView,
public:
class SectionHeaderRowView;
NetworkListView(SystemTrayItem* owner, LoginStatus login);
NetworkListView(DetailedViewDelegate* delegate, LoginStatus login);
~NetworkListView() override;
// NetworkStateListDetailedView:
......
......@@ -170,10 +170,10 @@ class InfoThrobberLayout : public views::LayoutManager {
// NetworkStateListDetailedView
NetworkStateListDetailedView::NetworkStateListDetailedView(
SystemTrayItem* owner,
DetailedViewDelegate* delegate,
ListType list_type,
LoginStatus login)
: TrayDetailedView(owner),
: TrayDetailedView(delegate),
list_type_(list_type),
login_(login),
info_button_(nullptr),
......@@ -218,8 +218,7 @@ void NetworkStateListDetailedView::HandleButtonPressed(views::Button* sender,
if (sender == settings_button_)
ShowSettings();
if (owner()->system_tray())
owner()->system_tray()->CloseBubble();
CloseBubble();
}
void NetworkStateListDetailedView::HandleViewClicked(views::View* view) {
......
......@@ -17,7 +17,6 @@ class Button;
}
namespace ash {
class SystemTrayItem;
namespace tray {
......@@ -39,7 +38,7 @@ class ASH_EXPORT NetworkStateListDetailedView
protected:
enum ListType { LIST_TYPE_NETWORK, LIST_TYPE_VPN };
NetworkStateListDetailedView(SystemTrayItem* owner,
NetworkStateListDetailedView(DetailedViewDelegate* delegate,
ListType list_type,
LoginStatus login);
......
......@@ -14,6 +14,7 @@
#include "ash/system/network/network_tray_view.h"
#include "ash/system/network/tray_network_state_observer.h"
#include "ash/system/tray/system_tray.h"
#include "ash/system/tray/system_tray_item_detailed_view_delegate.h"
#include "ash/system/tray/system_tray_notifier.h"
#include "ash/system/tray/tray_constants.h"
#include "ash/system/tray/tray_item_more.h"
......@@ -103,7 +104,9 @@ TrayNetwork::TrayNetwork(SystemTray* system_tray)
: SystemTrayItem(system_tray, UMA_NETWORK),
tray_(nullptr),
default_(nullptr),
detailed_(nullptr) {
detailed_(nullptr),
detailed_view_delegate_(
std::make_unique<SystemTrayItemDetailedViewDelegate>(this)) {
network_state_observer_.reset(new TrayNetworkStateObserver(this));
}
......@@ -133,7 +136,7 @@ views::View* TrayNetwork::CreateDetailedView(LoginStatus status) {
UMA_STATUS_AREA_DETAILED_NETWORK_VIEW);
if (!chromeos::NetworkHandler::IsInitialized())
return nullptr;
detailed_ = new tray::NetworkListView(this, status);
detailed_ = new tray::NetworkListView(detailed_view_delegate_.get(), status);
detailed_->Init();
return detailed_;
}
......
......@@ -20,6 +20,8 @@ class NetworkListView;
class NetworkTrayView;
}
class DetailedViewDelegate;
class TrayNetwork : public SystemTrayItem,
public TrayNetworkStateObserver::Delegate {
public:
......@@ -45,6 +47,8 @@ class TrayNetwork : public SystemTrayItem,
tray::NetworkListView* detailed_;
std::unique_ptr<TrayNetworkStateObserver> network_state_observer_;
const std::unique_ptr<DetailedViewDelegate> detailed_view_delegate_;
DISALLOW_COPY_AND_ASSIGN(TrayNetwork);
};
......
......@@ -15,6 +15,7 @@
#include "ash/system/network/vpn_list.h"
#include "ash/system/network/vpn_list_view.h"
#include "ash/system/tray/system_tray.h"
#include "ash/system/tray/system_tray_item_detailed_view_delegate.h"
#include "ash/system/tray/tray_constants.h"
#include "ash/system/tray/tray_item_more.h"
#include "ash/system/tray/tray_popup_item_style.h"
......@@ -143,7 +144,9 @@ class VpnDefaultView : public TrayItemMore,
TrayVPN::TrayVPN(SystemTray* system_tray)
: SystemTrayItem(system_tray, UMA_VPN),
default_(nullptr),
detailed_(nullptr) {
detailed_(nullptr),
detailed_view_delegate_(
std::make_unique<SystemTrayItemDetailedViewDelegate>(this)) {
network_state_observer_.reset(new TrayNetworkStateObserver(this));
}
......@@ -173,7 +176,7 @@ views::View* TrayVPN::CreateDetailedView(LoginStatus status) {
Shell::Get()->metrics()->RecordUserMetricsAction(
UMA_STATUS_AREA_DETAILED_VPN_VIEW);
detailed_ = new tray::VPNListView(this, status);
detailed_ = new tray::VPNListView(detailed_view_delegate_.get(), status);
detailed_->Init();
return detailed_;
}
......
......@@ -13,6 +13,7 @@
namespace ash {
class TrayNetworkStateObserver;
class DetailedViewDelegate;
namespace tray {
class VPNListView;
......@@ -44,6 +45,8 @@ class TrayVPN : public SystemTrayItem,
tray::VPNListView* detailed_;
std::unique_ptr<TrayNetworkStateObserver> network_state_observer_;
const std::unique_ptr<DetailedViewDelegate> detailed_view_delegate_;
DISALLOW_COPY_AND_ASSIGN(TrayVPN);
};
......
......@@ -220,8 +220,8 @@ void VPNListNetworkEntry::UpdateFromNetworkState(
} // namespace
VPNListView::VPNListView(SystemTrayItem* owner, LoginStatus login)
: NetworkStateListDetailedView(owner, LIST_TYPE_VPN, login) {
VPNListView::VPNListView(DetailedViewDelegate* delegate, LoginStatus login)
: NetworkStateListDetailedView(delegate, LIST_TYPE_VPN, login) {
Shell::Get()->vpn_list()->AddObserver(this);
}
......
......@@ -40,7 +40,7 @@ namespace tray {
class VPNListView : public NetworkStateListDetailedView,
public VpnList::Observer {
public:
VPNListView(SystemTrayItem* owner, LoginStatus login);
VPNListView(DetailedViewDelegate* delegate, LoginStatus login);
~VPNListView() override;
// Make following functions publicly accessible for VPNListNetworkEntry.
......
// Copyright 2018 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef ASH_SYSTEM_TRAY_DETAILED_VIEW_DELEGATE_H_
#define ASH_SYSTEM_TRAY_DETAILED_VIEW_DELEGATE_H_
namespace ash {
// A delegate of TrayDetailedView that handles bubble related actions e.g.
// transition to the main view, closing the bubble, etc.
class DetailedViewDelegate {
public:
virtual ~DetailedViewDelegate() {}
// Transition to the main view from the detailed view. |restore_focus| is true
// if the title row has keyboard focus before transition. If so, the main view
// should focus on the corresponding element of the detailed view.
virtual void TransitionToMainView(bool restore_focus) = 0;
// Close the bubble that contains the detailed view.
virtual void CloseBubble() = 0;
};
} // namespace ash
#endif // ASH_SYSTEM_TRAY_DETAILED_VIEW_DELEGATE_H_
// Copyright 2018 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "ash/system/tray/system_tray_item_detailed_view_delegate.h"
#include "ash/system/tray/system_tray.h"
#include "ash/system/tray/system_tray_item.h"
#include "ash/system/tray/tray_constants.h"
namespace ash {
SystemTrayItemDetailedViewDelegate::SystemTrayItemDetailedViewDelegate(
SystemTrayItem* owner)
: owner_(owner) {}
SystemTrayItemDetailedViewDelegate::~SystemTrayItemDetailedViewDelegate() =
default;
void SystemTrayItemDetailedViewDelegate::TransitionToMainView(
bool restore_focus) {
if (restore_focus)
owner_->set_restore_focus(true);
transition_delay_timer_.Start(
FROM_HERE,
base::TimeDelta::FromMilliseconds(kTrayDetailedViewTransitionDelayMs),
this, &SystemTrayItemDetailedViewDelegate::DoTransitionToMainView);
}
void SystemTrayItemDetailedViewDelegate::CloseBubble() {
if (owner_->system_tray())
owner_->system_tray()->CloseBubble();
}
void SystemTrayItemDetailedViewDelegate::DoTransitionToMainView() {
if (!owner_->system_tray())
return;
owner_->system_tray()->ShowDefaultView(BUBBLE_USE_EXISTING,
false /* show_by_click */);
owner_->set_restore_focus(false);
}
} // namespace ash
// Copyright 2018 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef ASH_SYSTEM_TRAY_SYSTEM_TRAY_ITEM_DETAILED_VIEW_DELEGATE_H_
#define ASH_SYSTEM_TRAY_SYSTEM_TRAY_ITEM_DETAILED_VIEW_DELEGATE_H_
#include "ash/ash_export.h"
#include "ash/system/tray/detailed_view_delegate.h"
#include "base/timer/timer.h"
namespace ash {
class SystemTrayItem;
// Default implementation of DetailedViewDelegate for old SystemTray with
// SystemTrayItem.
class ASH_EXPORT SystemTrayItemDetailedViewDelegate
: public DetailedViewDelegate {
public:
explicit SystemTrayItemDetailedViewDelegate(SystemTrayItem* owner);
~SystemTrayItemDetailedViewDelegate() override;
// TrayDetailedViewDelegate:
void TransitionToMainView(bool restore_focus) override;
void CloseBubble() override;
private:
// Actually transitions to the main view. The actual transition is
// intentionally delayed to allow the user to perceive the ink drop animation
// on the clicked target.
void DoTransitionToMainView();
SystemTrayItem* const owner_;
// Used to delay the transition to the main view.
base::OneShotTimer transition_delay_timer_;
DISALLOW_COPY_AND_ASSIGN(SystemTrayItemDetailedViewDelegate);
};
} // namespace ash
#endif // ASH_SYSTEM_TRAY_SYSTEM_TRAY_ITEM_DETAILED_VIEW_DELEGATE_H_
......@@ -7,6 +7,7 @@
#include "ash/ash_view_ids.h"
#include "ash/public/cpp/ash_features.h"
#include "ash/strings/grit/ash_strings.h"
#include "ash/system/tray/detailed_view_delegate.h"
#include "ash/system/tray/hover_highlight_view.h"
#include "ash/system/tray/system_menu_button.h"
#include "ash/system/tray/system_tray.h"
......@@ -241,8 +242,8 @@ const int kTitleRowPaddingBottom =
////////////////////////////////////////////////////////////////////////////////
// TrayDetailedView:
TrayDetailedView::TrayDetailedView(SystemTrayItem* owner)
: owner_(owner),
TrayDetailedView::TrayDetailedView(DetailedViewDelegate* delegate)
: delegate_(delegate),
box_layout_(nullptr),
scroller_(nullptr),
scroll_content_(nullptr),
......@@ -266,7 +267,7 @@ void TrayDetailedView::OnViewClicked(views::View* sender) {
void TrayDetailedView::ButtonPressed(views::Button* sender,
const ui::Event& event) {
if (sender == back_button_) {
TransitionToDefaultView();
TransitionToMainView();
return;
}
......@@ -444,23 +445,12 @@ void TrayDetailedView::HandleButtonPressed(views::Button* sender,
void TrayDetailedView::CreateExtraTitleRowButtons() {}
void TrayDetailedView::TransitionToDefaultView() {
if (back_button_ && back_button_->HasFocus())
owner_->set_restore_focus(true);
transition_delay_timer_.Start(
FROM_HERE,
base::TimeDelta::FromMilliseconds(kTrayDetailedViewTransitionDelayMs),
this, &TrayDetailedView::DoTransitionToDefaultView);
void TrayDetailedView::TransitionToMainView() {
delegate_->TransitionToMainView(back_button_ && back_button_->HasFocus());
}
void TrayDetailedView::DoTransitionToDefaultView() {
// Cache pointer to owner in this function scope. TrayDetailedView will be
// deleted after called ShowDefaultView.
SystemTrayItem* owner = owner_;
owner->system_tray()->ShowDefaultView(BUBBLE_USE_EXISTING,
false /* show_by_click */);
owner->set_restore_focus(false);
void TrayDetailedView::CloseBubble() {
delegate_->CloseBubble();
}
views::Button* TrayDetailedView::CreateBackButton() {
......
......@@ -11,7 +11,6 @@
#include "ash/system/tray/tray_constants.h"
#include "ash/system/tray/view_click_listener.h"
#include "base/macros.h"
#include "base/timer/timer.h"
#include "ui/views/controls/button/button.h"
#include "ui/views/view.h"
......@@ -28,16 +27,16 @@ class ScrollView;
namespace ash {
class DetailedViewDelegate;
class HoverHighlightView;
class ScrollBorder;
class SystemTrayItem;
class TriView;
class ASH_EXPORT TrayDetailedView : public views::View,
public ViewClickListener,
public views::ButtonListener {
public:
explicit TrayDetailedView(SystemTrayItem* owner);
explicit TrayDetailedView(DetailedViewDelegate* delegate);
~TrayDetailedView() override;
// ViewClickListener:
......@@ -48,8 +47,6 @@ class ASH_EXPORT TrayDetailedView : public views::View,
// Don't override this --- override HandleButtonPressed.
void ButtonPressed(views::Button* sender, const ui::Event& event) final;
SystemTrayItem* owner() { return owner_; }
protected:
// views::View:
void Layout() override;
......@@ -110,6 +107,9 @@ class ASH_EXPORT TrayDetailedView : public views::View,
views::Button* CreateSettingsButton(int setting_accessible_name_id);
views::Button* CreateHelpButton();
// Closes the bubble that contains the detailed view.
void CloseBubble();
TriView* tri_view() { return tri_view_; }
views::ScrollView* scroller() const { return scroller_; }
views::View* scroll_content() const { return scroll_content_; }
......@@ -127,23 +127,15 @@ class ASH_EXPORT TrayDetailedView : public views::View,
// Creates and adds subclass-specific buttons to the title row.
virtual void CreateExtraTitleRowButtons();
// Transition to default view from details view. If |title_row_| has focus
// before transition, the default view should focus on the owner of this
// details view.
//
// In Material Design the actual transition is intentionally delayed to allow
// the user to perceive the ink drop animation on the clicked target.
void TransitionToDefaultView();
// Actually transitions to the default view.
void DoTransitionToDefaultView();
// Transition to main view from detailed view.
void TransitionToMainView();
// Helper function which creates and returns the back button used in the
// material design top-most header row. The caller assumes ownership of the
// returned button.
views::Button* CreateBackButton();
SystemTrayItem* owner_;
DetailedViewDelegate* const delegate_;
views::BoxLayout* box_layout_;
views::ScrollView* scroller_;
views::View* scroll_content_;
......@@ -157,9 +149,6 @@ class ASH_EXPORT TrayDetailedView : public views::View,
// The back button that appears in the material design title row. Not owned.
views::Button* back_button_;
// Used to delay the transition to the default view.
base::OneShotTimer transition_delay_timer_;
DISALLOW_COPY_AND_ASSIGN(TrayDetailedView);
};
......
......@@ -9,6 +9,7 @@
#include "ash/system/tray/system_tray.h"
#include "ash/system/tray/system_tray_bubble.h"
#include "ash/system/tray/system_tray_item.h"
#include "ash/system/tray/system_tray_item_detailed_view_delegate.h"
#include "ash/system/tray/tray_constants.h"
#include "ash/system/tray/view_click_listener.h"
#include "ash/test/ash_test_base.h"
......@@ -27,7 +28,8 @@ namespace {
class TestDetailsView : public TrayDetailedView {
public:
explicit TestDetailsView(SystemTrayItem* owner) : TrayDetailedView(owner) {
explicit TestDetailsView(DetailedViewDelegate* delegate)
: TrayDetailedView(delegate) {
// Uses bluetooth label for testing purpose. It can be changed to any
// string_id.
CreateTitleRow(IDS_ASH_STATUS_TRAY_BLUETOOTH);
......@@ -52,7 +54,9 @@ class TestItem : public SystemTrayItem {
: SystemTrayItem(AshTestBase::GetPrimarySystemTray(), UMA_TEST),
tray_view_(nullptr),
default_view_(nullptr),
detailed_view_(nullptr) {}
detailed_view_(nullptr),
detailed_view_delegate_(
std::make_unique<SystemTrayItemDetailedViewDelegate>(this)) {}
// Overridden from SystemTrayItem:
views::View* CreateTrayView(LoginStatus status) override {
......@@ -65,7 +69,7 @@ class TestItem : public SystemTrayItem {
return default_view_;
}
views::View* CreateDetailedView(LoginStatus status) override {
detailed_view_ = new TestDetailsView(this);
detailed_view_ = new TestDetailsView(detailed_view_delegate_.get());
return detailed_view_;
}
void OnTrayViewDestroyed() override { tray_view_ = NULL; }
......@@ -80,6 +84,7 @@ class TestItem : public SystemTrayItem {
views::View* tray_view_;
views::View* default_view_;
TestDetailsView* detailed_view_;
const std::unique_ptr<DetailedViewDelegate> detailed_view_delegate_;
DISALLOW_COPY_AND_ASSIGN(TestItem);
};
......@@ -92,7 +97,7 @@ class TrayDetailedViewTest : public AshTestBase {
~TrayDetailedViewTest() override = default;
void TransitionFromDetailedToDefaultView(TestDetailsView* detailed) {
detailed->TransitionToDefaultView();
detailed->TransitionToMainView();
(*scoped_task_runner_)
->FastForwardBy(base::TimeDelta::FromMilliseconds(
kTrayDetailedViewTransitionDelayMs));
......
......@@ -19,6 +19,7 @@
#include "ash/system/tray/hover_highlight_view.h"
#include "ash/system/tray/system_tray.h"
#include "ash/system/tray/system_tray_controller.h"
#include "ash/system/tray/system_tray_item_detailed_view_delegate.h"
#include "ash/system/tray/tray_detailed_view.h"
#include "ash/system/tray/tray_item_more.h"
#include "ash/system/tray/tray_popup_utils.h"
......@@ -130,8 +131,9 @@ class DefaultAccessibilityView : public TrayItemMore {
////////////////////////////////////////////////////////////////////////////////
// ash::tray::AccessibilityDetailedView
AccessibilityDetailedView::AccessibilityDetailedView(SystemTrayItem* owner)
: TrayDetailedView(owner) {
AccessibilityDetailedView::AccessibilityDetailedView(
DetailedViewDelegate* delegate)
: TrayDetailedView(delegate) {
Reset();
AppendAccessibilityList();
CreateTitleRow(IDS_ASH_STATUS_TRAY_ACCESSIBILITY_TITLE);
......@@ -437,14 +439,14 @@ void AccessibilityDetailedView::CreateExtraTitleRowButtons() {
void AccessibilityDetailedView::ShowSettings() {
if (TrayPopupUtils::CanOpenWebUISettings()) {
Shell::Get()->system_tray_controller()->ShowAccessibilitySettings();
owner()->system_tray()->CloseBubble();
CloseBubble();
}
}
void AccessibilityDetailedView::ShowHelp() {
if (TrayPopupUtils::CanOpenWebUISettings()) {
Shell::Get()->system_tray_controller()->ShowAccessibilityHelp();
owner()->system_tray()->CloseBubble();
CloseBubble();
}
}
......@@ -461,7 +463,9 @@ TrayAccessibility::TrayAccessibility(SystemTray* system_tray)
detailed_menu_(nullptr),
tray_icon_visible_(false),
login_(GetCurrentLoginStatus()),
show_a11y_menu_on_lock_screen_(true) {
show_a11y_menu_on_lock_screen_(true),
detailed_view_delegate_(
std::make_unique<SystemTrayItemDetailedViewDelegate>(this)) {
DCHECK(system_tray);
Shell::Get()->accessibility_controller()->AddObserver(this);
}
......@@ -477,7 +481,7 @@ void TrayAccessibility::SetTrayIconVisible(bool visible) {
}
tray::AccessibilityDetailedView* TrayAccessibility::CreateDetailedMenu() {
return new tray::AccessibilityDetailedView(this);
return new tray::AccessibilityDetailedView(detailed_view_delegate_.get());
}
bool TrayAccessibility::GetInitialVisibility() {
......
......@@ -28,7 +28,7 @@ class View;
namespace ash {
class HoverHighlightView;
class SystemTrayItem;
class DetailedViewDelegate;
class TrayAccessibilityLoginScreenTest;
class TrayAccessibilityTest;
......@@ -37,7 +37,7 @@ namespace tray {
// Create the detailed view of accessibility tray.
class AccessibilityDetailedView : public TrayDetailedView {
public:
explicit AccessibilityDetailedView(SystemTrayItem* owner);
explicit AccessibilityDetailedView(DetailedViewDelegate* delegate);
~AccessibilityDetailedView() override {}
void OnAccessibilityStatusChanged();
......@@ -135,6 +135,8 @@ class TrayAccessibility : public TrayImageItem, public AccessibilityObserver {
// A11y feature status on just entering the lock screen.
bool show_a11y_menu_on_lock_screen_;
const std::unique_ptr<DetailedViewDelegate> detailed_view_delegate_;
DISALLOW_COPY_AND_ASSIGN(TrayAccessibility);
};
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment