1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115
|
// Copyright 2015 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_ASH_SYSTEM_SYSTEM_CLOCK_H_
#define CHROME_BROWSER_ASH_SYSTEM_SYSTEM_CLOCK_H_
#include <memory>
#include "base/callback_list.h"
#include "base/i18n/time_formatting.h"
#include "base/memory/raw_ptr.h"
#include "base/memory/weak_ptr.h"
#include "base/scoped_observation.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/profiles/profile_observer.h"
#include "components/user_manager/user_manager.h"
class PrefChangeRegistrar;
namespace user_manager {
class User;
}
namespace ash {
namespace system {
class SystemClockObserver;
// This is a global singleton (actually a member of BrowserProcessPlatformPart)
// that is responsible for correct time formatting. It listens to events that
// modify on-screen time representation (like ActiveUserChanged) and notifies
// observers.
class SystemClock : public ProfileObserver,
public user_manager::UserManager::UserSessionStateObserver {
public:
SystemClock();
SystemClock(const SystemClock&) = delete;
SystemClock& operator=(const SystemClock&) = delete;
~SystemClock() override;
// Could be used to temporary set the required clock type. At most one should
// exist at the time.
class ScopedHourClockType {
public:
explicit ScopedHourClockType(base::WeakPtr<SystemClock> system_clock);
~ScopedHourClockType();
ScopedHourClockType(const ScopedHourClockType&) = delete;
ScopedHourClockType& operator=(const ScopedHourClockType&) = delete;
ScopedHourClockType(ScopedHourClockType&&);
ScopedHourClockType& operator=(ScopedHourClockType&&);
void UpdateClockType(base::HourClockType clock_type);
private:
base::WeakPtr<SystemClock> system_clock_;
};
ScopedHourClockType CreateScopedHourClockType(
base::HourClockType hour_clock_type);
void AddObserver(SystemClockObserver* observer);
void RemoveObserver(SystemClockObserver* observer);
// Whether the given user should use 24-hour clock type.
bool ShouldUse24HourClockForUser(const AccountId& user_id) const;
// Whether the active user should use 24-hour clock type.
bool ShouldUse24HourClock() const;
// ProfileObserver:
void OnProfileWillBeDestroyed(Profile* profile) override;
// user_manager::UserManager::UserSessionStateObserver:
void ActiveUserChanged(user_manager::User* active_user) override;
private:
void SetProfileByUser(const user_manager::User* user);
void SetProfile(Profile* profile);
// Callback invoked when the clock type in policy or owner settings changes.
void OnSystemPrefChanged();
// Callback invoked when the clock type in user prefs changes.
void OnUserPrefChanged();
// Callback after owner check to copy clock type of the updating user to owner
// settings if the updating user is the owner.
void MaybeCopyToOwnerSettings(const AccountId& updating_user_id,
const AccountId& owner_id);
// Notifies observes about the clock type change. Currently system tray is
// an observer and this Updates clock type in system UI.
void NotifySystemClockTypeChanged();
std::optional<base::HourClockType> scoped_hour_clock_type_;
base::ScopedObservation<Profile, ProfileObserver> profile_observation_{this};
std::unique_ptr<PrefChangeRegistrar> user_pref_registrar_;
base::ObserverList<SystemClockObserver>::Unchecked observer_list_;
base::CallbackListSubscription device_settings_observer_;
base::WeakPtrFactory<SystemClock> weak_ptr_factory_{this};
};
} // namespace system
} // namespace ash
#endif // CHROME_BROWSER_ASH_SYSTEM_SYSTEM_CLOCK_H_
|