Commit 5c44a2b5 authored by minch's avatar minch Committed by Commit Bot

dark_mode: Set color mode themed through system tray.

Bug: 1106012
Change-Id: I56a91c30a9743570c0377a8e57e8b341c8698743
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2388707Reviewed-by: default avatarAhmed Fakhry <afakhry@chromium.org>
Commit-Queue: Min Chen <minch@chromium.org>
Cr-Commit-Position: refs/heads/master@{#804043}
parent b3fcdfa7
......@@ -75,6 +75,9 @@ constexpr bool kDefaultKeyAutoRepeatEnabled = true;
// Whether dark mode is enabled by default.
constexpr bool kDefaultDarkModeEnabled = true;
// Whether color mode is themed by default.
constexpr bool kDefaultColorModeThemed = true;
// The default delay before a held keypress will start to auto repeat.
constexpr base::TimeDelta kDefaultKeyAutoRepeatDelay =
base::TimeDelta::FromMilliseconds(500);
......
......@@ -579,6 +579,9 @@ const char kMultipasteNudges[] = "ash.clipboard.multipaste_nudges";
// A boolean pref that indicates whether dark mode is enabled.
const char kDarkModeEnabled[] = "cros.system.dark_mode_enabled";
// A boolean pref that indicates whether the color mode is themed. If true, the
// background color will be calculated based on extracted wallpaper color.
const char kColorModeThemed[] = "cros.system.color_mode_themed";
// NOTE: New prefs should start with the "ash." prefix. Existing prefs moved
// into this file should not be renamed, since they may be synced.
......
......@@ -208,6 +208,7 @@ ASH_PUBLIC_EXPORT extern const char kMouseReverseScroll[];
ASH_PUBLIC_EXPORT extern const char kMultipasteNudges[];
ASH_PUBLIC_EXPORT extern const char kDarkModeEnabled[];
ASH_PUBLIC_EXPORT extern const char kColorModeThemed[];
} // namespace prefs
......
......@@ -101,6 +101,9 @@ void AshColorProvider::RegisterProfilePrefs(PrefRegistrySimple* registry) {
registry->RegisterBooleanPref(
prefs::kDarkModeEnabled, kDefaultDarkModeEnabled,
user_prefs::PrefRegistrySyncable::SYNCABLE_OS_PREF);
registry->RegisterBooleanPref(
prefs::kColorModeThemed, kDefaultColorModeThemed,
user_prefs::PrefRegistrySyncable::SYNCABLE_OS_PREF);
}
void AshColorProvider::OnActiveUserPrefServiceChanged(PrefService* prefs) {
......@@ -112,9 +115,14 @@ void AshColorProvider::OnActiveUserPrefServiceChanged(PrefService* prefs) {
prefs::kDarkModeEnabled,
base::BindRepeating(&AshColorProvider::NotifyDarkModeEnabledPrefChange,
base::Unretained(this)));
pref_change_registrar_->Add(
prefs::kColorModeThemed,
base::BindRepeating(&AshColorProvider::NotifyColorModeThemedPrefChange,
base::Unretained(this)));
// Immediately tell all the observers to load this user's saved preferences.
NotifyDarkModeEnabledPrefChange();
NotifyColorModeThemedPrefChange();
}
SkColor AshColorProvider::GetLoginBackgroundBaseColor() const {
......@@ -206,7 +214,7 @@ AshColorProvider::RippleAttributes AshColorProvider::GetRippleAttributes(
SkColor AshColorProvider::GetBackgroundColor(AshColorMode color_mode) const {
DCHECK(color_mode == AshColorProvider::AshColorMode::kLight ||
color_mode == AshColorProvider::AshColorMode::kDark);
return is_themed_ ? GetBackgroundThemedColor(color_mode)
return IsThemed() ? GetBackgroundThemedColor(color_mode)
: GetBackgroundDefaultColor(color_mode);
}
......@@ -286,13 +294,28 @@ bool AshColorProvider::IsDarkModeEnabled() const {
return active_user_pref_service_->GetBoolean(prefs::kDarkModeEnabled);
}
void AshColorProvider::Toggle() {
bool AshColorProvider::IsThemed() const {
if (!active_user_pref_service_)
return kDefaultColorModeThemed;
return active_user_pref_service_->GetBoolean(prefs::kColorModeThemed);
}
void AshColorProvider::ToggleColorMode() {
DCHECK(active_user_pref_service_);
active_user_pref_service_->SetBoolean(prefs::kDarkModeEnabled,
!IsDarkModeEnabled());
active_user_pref_service_->CommitPendingWrite();
}
void AshColorProvider::UpdateColorModeThemed(bool is_themed) {
if (is_themed == IsThemed())
return;
DCHECK(active_user_pref_service_);
active_user_pref_service_->SetBoolean(prefs::kColorModeThemed, is_themed);
active_user_pref_service_->CommitPendingWrite();
}
SkColor AshColorProvider::GetShieldLayerColorImpl(
ShieldLayerType type,
AshColorMode color_mode) const {
......@@ -475,4 +498,10 @@ void AshColorProvider::NotifyDarkModeEnabledPrefChange() {
observer.OnColorModeChanged(is_enabled);
}
void AshColorProvider::NotifyColorModeThemedPrefChange() {
const bool is_themed = IsThemed();
for (auto& observer : observers_)
observer.OnColorModeThemed(is_themed);
}
} // namespace ash
......@@ -239,14 +239,19 @@ class ASH_EXPORT AshColorProvider : public SessionObserver {
// is dark.
bool IsDarkModeEnabled() const;
// Whether the system color mode is themed, by default is true. If true, the
// background color will be calculated based on extracted wallpaper color.
bool IsThemed() const;
// Toggles pref |kDarkModeEnabled|.
void Toggle();
void ToggleColorMode();
// Updates pref |kColorModeThemed| to |is_themed|.
void UpdateColorModeThemed(bool is_themed);
// Gets the background base color for login screen.
SkColor GetLoginBackgroundBaseColor() const;
bool is_themed() const { return is_themed_; }
private:
// Gets Shield layer color on |type| and |color_mode|. This function will be
// merged into GetShieldLayerColor after DeprecatedGetShieldLayerColor got be
......@@ -284,13 +289,12 @@ class ASH_EXPORT AshColorProvider : public SessionObserver {
// Notifies all the observers on |kDarkModeEnabled|'s change.
void NotifyDarkModeEnabledPrefChange();
// Notifies all the observers on |kColorModeThemed|'s change.
void NotifyColorModeThemedPrefChange();
// Current color mode of system UI.
AshColorMode color_mode_ = AshColorMode::kDefault;
// Whether the system color mode is themed, by default is true. If true, the
// background color will be calculated based on extracted wallpaper color.
bool is_themed_ = true;
base::ObserverList<ColorModeObserver> observers_;
std::unique_ptr<PrefChangeRegistrar> pref_change_registrar_;
PrefService* active_user_pref_service_ = nullptr; // Not owned.
......
......@@ -13,7 +13,10 @@ namespace ash {
class ASH_EXPORT ColorModeObserver : public base::CheckedObserver {
public:
// Called when the color mode changes.
virtual void OnColorModeChanged(bool dark_mode_enabled) = 0;
virtual void OnColorModeChanged(bool dark_mode_enabled) {}
// Called when the themed state of the color mode is changed.
virtual void OnColorModeThemed(bool is_themed) {}
protected:
~ColorModeObserver() override = default;
......
......@@ -43,10 +43,13 @@ class TrayRadioButton : public views::RadioButton {
DarkModeDetailedView::DarkModeDetailedView(DetailedViewDelegate* delegate)
: TrayDetailedView(delegate) {
AshColorProvider::Get()->AddObserver(this);
CreateItems();
}
DarkModeDetailedView::~DarkModeDetailedView() = default;
DarkModeDetailedView::~DarkModeDetailedView() {
AshColorProvider::Get()->RemoveObserver(this);
}
void DarkModeDetailedView::CreateItems() {
CreateTitleRow(IDS_ASH_STATUS_TRAY_DARK_THEME_TITLE);
......@@ -54,9 +57,10 @@ void DarkModeDetailedView::CreateItems() {
// Add toggle button.
tri_view()->SetContainerVisible(TriView::Container::END, true);
auto* ash_color_provider = AshColorProvider::Get();
toggle_ =
TrayPopupUtils::CreateToggleButton(this, IDS_ASH_STATUS_TRAY_BLUETOOTH);
toggle_->SetIsOn(AshColorProvider::Get()->IsDarkModeEnabled());
toggle_->SetIsOn(ash_color_provider->IsDarkModeEnabled());
tri_view()->AddView(TriView::Container::END, toggle_);
// Add color mode options.
......@@ -80,10 +84,7 @@ void DarkModeDetailedView::CreateItems() {
std::make_unique<views::Label>(l10n_util::GetStringUTF16(
IDS_ASH_STATUS_TRAY_DARK_THEME_MODE_NEUTRAL_DESCRIPTION))));
// Set the relevant radio button to be checked.
AshColorProvider::Get()->is_themed() ? themed_mode_button_->SetChecked(true)
: neutral_mode_button_->SetChecked(true);
OnColorModeThemed(ash_color_provider->IsThemed());
scroll_content()->SizeToPreferredSize();
Layout();
}
......@@ -94,13 +95,18 @@ const char* DarkModeDetailedView::GetClassName() const {
void DarkModeDetailedView::HandleButtonPressed(views::Button* sender,
const ui::Event& event) {
if (sender == toggle_) {
// TODO(amehfooz): Toggle Dark / Light mode here.
} else if (sender == themed_mode_button_) {
// TODO(amehfooz): Switch to themed mode here.
} else if (sender == neutral_mode_button_) {
// TODO(amehfooz): Switch to neutral mode here.
}
auto* ash_color_provider = AshColorProvider::Get();
if (sender == toggle_)
ash_color_provider->ToggleColorMode();
else if (sender == themed_mode_button_)
ash_color_provider->UpdateColorModeThemed(/*is_themed=*/true);
else if (sender == neutral_mode_button_)
ash_color_provider->UpdateColorModeThemed(/*is_themed=*/false);
}
void DarkModeDetailedView::OnColorModeThemed(bool is_themed) {
is_themed ? themed_mode_button_->SetChecked(true)
: neutral_mode_button_->SetChecked(true);
}
} // namespace ash
......@@ -5,6 +5,7 @@
#ifndef ASH_SYSTEM_DARK_MODE_DARK_MODE_DETAILED_VIEW_H_
#define ASH_SYSTEM_DARK_MODE_DARK_MODE_DETAILED_VIEW_H_
#include "ash/system/dark_mode/color_mode_observer.h"
#include "ash/system/tray/tray_detailed_view.h"
namespace views {
......@@ -17,7 +18,7 @@ namespace ash {
// This view displays options to switch between themed and neutral
// color mode for the system. Accessed by clicking on the dark mode
// feature pod label button.
class DarkModeDetailedView : public TrayDetailedView {
class DarkModeDetailedView : public TrayDetailedView, public ColorModeObserver {
public:
explicit DarkModeDetailedView(DetailedViewDelegate* delegate);
DarkModeDetailedView(const DarkModeDetailedView& other) = delete;
......@@ -34,6 +35,9 @@ class DarkModeDetailedView : public TrayDetailedView {
void HandleButtonPressed(views::Button* sender,
const ui::Event& event) override;
// ColorModeObserver:
void OnColorModeThemed(bool is_themed) override;
views::ToggleButton* toggle_ = nullptr;
views::RadioButton* themed_mode_button_ = nullptr;
views::RadioButton* neutral_mode_button_ = nullptr;
......
......@@ -43,8 +43,7 @@ FeaturePodButton* DarkModeFeaturePodController::CreateButton() {
}
void DarkModeFeaturePodController::OnIconPressed() {
// TODO: Switch dark mode here.
AshColorProvider::Get()->Toggle();
AshColorProvider::Get()->ToggleColorMode();
// TODO(amehfooz): Add metrics recording here.
}
......
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