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