Commit 66e8c39f authored by Tim Song's avatar Tim Song Committed by Commit Bot

Ash Tray: Add new view for redesigned managed device info UI.

A following CL will integrate this new view with the existing tray UI behind a
flag.

Old UI:
https://screenshot.googleplex.com/piFt6475aT4

New UI:
https://screenshot.googleplex.com/80T0oZeapqJ

TEST=unit test + verified manually
BUG=921267

Change-Id: Ie82e3e0144bfa1465088af06564aab3588a9e8a5
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1669441
Commit-Queue: Tim Song <tengs@chromium.org>
Reviewed-by: default avatarAchuith Bhandarkar <achuith@chromium.org>
Reviewed-by: default avatarTetsui Ohkubo <tetsui@chromium.org>
Cr-Commit-Position: refs/heads/master@{#672731}
parent ef91bbc8
......@@ -967,6 +967,8 @@ component("ash") {
"system/unified/top_shortcut_button.h",
"system/unified/top_shortcuts_view.cc",
"system/unified/top_shortcuts_view.h",
"system/unified/unified_managed_device_view.cc",
"system/unified/unified_managed_device_view.h",
"system/unified/unified_notifier_settings_controller.cc",
"system/unified/unified_notifier_settings_controller.h",
"system/unified/unified_slider_bubble_controller.cc",
......@@ -1780,6 +1782,7 @@ test("ash_unittests") {
"system/unified/page_indicator_view_unittest.cc",
"system/unified/quiet_mode_feature_pod_controller_unittest.cc",
"system/unified/top_shortcuts_view_unittest.cc",
"system/unified/unified_managed_device_view_unittest.cc",
"system/unified/unified_system_info_view_unittest.cc",
"system/unified/unified_system_tray_controller_unittest.cc",
"system/unified/unified_system_tray_unittest.cc",
......
......@@ -172,9 +172,12 @@ constexpr SkColor kUnifiedNotificationSeparatorColor =
constexpr SkColor kUnifiedFeaturePodHoverColor =
SkColorSetRGB(0xff, 0xff, 0xff);
constexpr SkColor kUnifiedRecordingIconColor = gfx::kGoogleRedDark600;
constexpr SkColor kUnifiedManagedDeviceIconColor =
SkColorSetRGB(0x9a, 0xa0, 0xa6);
constexpr gfx::Insets kUnifiedMenuItemPadding(0, 16, 16, 16);
constexpr gfx::Insets kUnifiedSystemInfoViewPadding(4, 16, 16, 16);
constexpr gfx::Insets kUnifiedManagedDeviceViewPadding(4, 19, 4, 16);
constexpr gfx::Insets kUnifiedSliderRowPadding(0, 12, 8, 16);
constexpr gfx::Insets kUnifiedSliderBubblePadding(12, 0, 4, 0);
constexpr gfx::Insets kUnifiedSliderPadding(0, 16);
......@@ -211,6 +214,7 @@ constexpr SkColor kStackingNotificationCounterLabelColor =
// A dark disc with |kTrayItemSize| diameter is drawn in the background.
constexpr int kTrayTopShortcutButtonIconSize = 20;
constexpr int kUnifiedManagedDeviceSpacing = 4;
constexpr int kUnifiedSystemInfoHeight = 16;
constexpr int kUnifiedSystemInfoSpacing = 8;
constexpr int kUnifiedSystemInfoSeparatorColor =
......
// Copyright 2019 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/unified/unified_managed_device_view.h"
#include "ash/resources/vector_icons/vector_icons.h"
#include "ash/session/session_controller_impl.h"
#include "ash/shell.h"
#include "ash/strings/grit/ash_strings.h"
#include "ash/system/enterprise/enterprise_domain_observer.h"
#include "ash/system/model/enterprise_domain_model.h"
#include "ash/system/model/system_tray_model.h"
#include "ash/system/supervised/supervised_icon_string.h"
#include "ash/system/tray/tray_constants.h"
#include "ash/system/tray/tray_utils.h"
#include "base/strings/utf_string_conversions.h"
#include "chromeos/strings/grit/chromeos_strings.h"
#include "ui/base/l10n/l10n_util.h"
#include "ui/gfx/paint_vector_icon.h"
#include "ui/views/controls/image_view.h"
#include "ui/views/controls/label.h"
#include "ui/views/layout/box_layout.h"
namespace ash {
UnifiedManagedDeviceView::UnifiedManagedDeviceView()
: icon_(new views::ImageView), label_(new views::Label) {
auto* layout = SetLayoutManager(std::make_unique<views::BoxLayout>(
views::BoxLayout::Orientation::kHorizontal,
kUnifiedManagedDeviceViewPadding, kUnifiedManagedDeviceSpacing));
layout->set_cross_axis_alignment(
views::BoxLayout::CrossAxisAlignment::kCenter);
icon_->SetPreferredSize(
gfx::Size(kUnifiedSystemInfoHeight, kUnifiedSystemInfoHeight));
AddChildView(icon_);
label_->SetAutoColorReadabilityEnabled(false);
label_->SetSubpixelRenderingEnabled(false);
label_->SetEnabledColor(kUnifiedMenuSecondaryTextColor);
AddChildView(label_);
Shell::Get()->session_controller()->AddObserver(this);
Shell::Get()->system_tray_model()->enterprise_domain()->AddObserver(this);
Update();
}
UnifiedManagedDeviceView::~UnifiedManagedDeviceView() {
Shell::Get()->system_tray_model()->enterprise_domain()->RemoveObserver(this);
Shell::Get()->session_controller()->RemoveObserver(this);
}
void UnifiedManagedDeviceView::OnLoginStatusChanged(LoginStatus status) {
Update();
}
void UnifiedManagedDeviceView::OnEnterpriseDomainChanged() {
Update();
}
const char* UnifiedManagedDeviceView::GetClassName() const {
return "UnifiedManagedDeviceView";
}
void UnifiedManagedDeviceView::Update() {
SessionControllerImpl* session = Shell::Get()->session_controller();
EnterpriseDomainModel* model =
Shell::Get()->system_tray_model()->enterprise_domain();
std::string enterprise_domain_name = model->enterprise_display_domain();
if (session->ShouldDisplayManagedUI() || model->active_directory_managed() ||
!enterprise_domain_name.empty()) {
// Show enterpised managed UI.
icon_->SetImage(gfx::CreateVectorIcon(kSystemTrayManagedIcon,
kUnifiedManagedDeviceIconColor));
if (!enterprise_domain_name.empty()) {
label_->SetText(l10n_util::GetStringFUTF16(
IDS_ASH_ENTERPRISE_DEVICE_MANAGED_BY,
base::UTF8ToUTF16(enterprise_domain_name)));
} else {
label_->SetText(
l10n_util::GetStringUTF16(IDS_ASH_ENTERPRISE_DEVICE_MANAGED));
}
SetVisible(true);
} else if (session->IsUserSupervised()) {
// Show supervised user UI (locally supervised or Family Link).
icon_->SetImage(gfx::CreateVectorIcon(GetSupervisedUserIcon(),
kUnifiedManagedDeviceIconColor));
label_->SetText(GetSupervisedUserMessage());
SetVisible(true);
} else {
SetVisible(false);
}
}
} // namespace ash
// Copyright 2019 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_UNIFIED_UNIFIED_MANAGED_DEVICE_VIEW_H_
#define ASH_SYSTEM_UNIFIED_UNIFIED_MANAGED_DEVICE_VIEW_H_
#include "ash/session/session_observer.h"
#include "ash/system/enterprise/enterprise_domain_observer.h"
#include "base/macros.h"
#include "ui/views/view.h"
namespace views {
class Label;
class ImageView;
} // namespace views
namespace ash {
// Row in the unified system tray bubble shown when the device is currently
// managed by an administrator (by a domain admin or FamilyLink).
class ASH_EXPORT UnifiedManagedDeviceView : public views::View,
public SessionObserver,
public EnterpriseDomainObserver {
public:
UnifiedManagedDeviceView();
~UnifiedManagedDeviceView() override;
// SessionObserver:
void OnLoginStatusChanged(LoginStatus status) override;
// EnterpriseDomainObserver:
void OnEnterpriseDomainChanged() override;
// views::TrayItemView:
const char* GetClassName() const override;
private:
void Update();
// Owned by views hierarchy.
views::ImageView* const icon_;
views::Label* const label_;
DISALLOW_COPY_AND_ASSIGN(UnifiedManagedDeviceView);
};
} // namespace ash
#endif // ASH_SYSTEM_UNIFIED_UNIFIED_MANAGED_DEVICE_VIEW_H_
// Copyright 2019 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/unified/unified_managed_device_view.h"
#include "ash/session/session_controller_impl.h"
#include "ash/session/test_session_controller_client.h"
#include "ash/shell.h"
#include "ash/system/model/enterprise_domain_model.h"
#include "ash/system/model/system_tray_model.h"
#include "ash/test/ash_test_base.h"
#include "ash/system/unified/unified_system_tray_view.h"
namespace ash {
class UnifiedManagedDeviceViewTest : public AshTestBase {
public:
UnifiedManagedDeviceViewTest() = default;
~UnifiedManagedDeviceViewTest() override = default;
void SetUp() override {
AshTestBase::SetUp();
managed_device_view_ = std::make_unique<UnifiedManagedDeviceView>();
}
void TearDown() override {
managed_device_view_.reset();
AshTestBase::TearDown();
}
protected:
std::unique_ptr<UnifiedManagedDeviceView> managed_device_view_;
private:
DISALLOW_COPY_AND_ASSIGN(UnifiedManagedDeviceViewTest);
};
TEST_F(UnifiedManagedDeviceViewTest, EnterpriseManagedDevice) {
// By default, UnifiedManagedDeviceView is not shown.
EXPECT_FALSE(managed_device_view_->GetVisible());
// Simulate enterprise information becoming available.
const bool active_directory = false;
Shell::Get()
->system_tray_model()
->enterprise_domain()
->SetEnterpriseDisplayDomain("example.com", active_directory);
EXPECT_TRUE(managed_device_view_->GetVisible());
}
TEST_F(UnifiedManagedDeviceViewTest, ActiveDirectoryManagedDevice) {
// Simulate active directory information becoming available.
const std::string empty_domain;
const bool active_directory = true;
Shell::Get()
->system_tray_model()
->enterprise_domain()
->SetEnterpriseDisplayDomain(empty_domain, active_directory);
EXPECT_TRUE(managed_device_view_->GetVisible());
}
using UnifiedManagedDeviceViewNoSessionTest = NoSessionAshTestBase;
TEST_F(UnifiedManagedDeviceViewNoSessionTest, SupervisedUserDevice) {
SessionControllerImpl* session = Shell::Get()->session_controller();
ASSERT_FALSE(session->IsActiveUserSessionStarted());
// Before login the UnifiedManagedDeviceView is invisible.
std::unique_ptr<UnifiedManagedDeviceView> managed_device_view =
std::make_unique<UnifiedManagedDeviceView>();
EXPECT_FALSE(managed_device_view->GetVisible());
managed_device_view.reset();
// Simulate a supervised user logging in.
TestSessionControllerClient* client = GetSessionControllerClient();
client->Reset();
client->AddUserSession("child@test.com", user_manager::USER_TYPE_SUPERVISED);
client->SetSessionState(session_manager::SessionState::ACTIVE);
UserSession user_session = *session->GetUserSession(0);
user_session.custodian_email = "parent@test.com";
session->UpdateUserSession(std::move(user_session));
// Now the UnifiedManagedDeviceView is visible.
managed_device_view = std::make_unique<UnifiedManagedDeviceView>();
ASSERT_TRUE(managed_device_view->GetVisible());
}
} // namespace ash
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