| // 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_POLICY_POLICY_RECOMMENDATION_RESTORER_H_ |
| #define ASH_POLICY_POLICY_RECOMMENDATION_RESTORER_H_ |
| |
| #include <memory> |
| #include <set> |
| #include <string> |
| |
| #include "ash/session/session_observer.h" |
| #include "base/macros.h" |
| #include "base/timer/timer.h" |
| #include "ui/base/user_activity/user_activity_observer.h" |
| |
| class PrefChangeRegistrar; |
| class PrefService; |
| |
| namespace ash { |
| |
| // Manages observing a set of prefs on signin screen. If any of the prefs has a |
| // recommended value on observing, or changed to have recommended value or |
| // active user session started, its user settings is cleared so that the |
| // recommendation can take effect. On signin screen prefs, user settings are |
| // cleared when the user becomes idle for one minute. |
| // |
| // The above efforts are made to ensure that the observed prefs are *policy* |
| // overridden and can be restored properly. For example, a demo device on a |
| // store shelf. One customer walks up to device and enables some a11y features, |
| // leaving the device in a "funny" state (high contrast, screen magnifier, |
| // spoken feedback enabled). After some time, another customer won't feel the |
| // device looks "broken". |
| class PolicyRecommendationRestorer : public SessionObserver, |
| public ui::UserActivityObserver { |
| public: |
| PolicyRecommendationRestorer(); |
| ~PolicyRecommendationRestorer() override; |
| |
| // Caller calls to start observing recommended value for |pref_name|. It |
| // should be called when signin pref service is connected but before |
| // observing/loading user settings for |pref_name|. |
| void ObservePref(const std::string& pref_name); |
| |
| // SessionObserver: |
| void OnActiveUserPrefServiceChanged(PrefService* pref_service) override; |
| |
| // ui::UserActivityObserver: |
| void OnUserActivity(const ui::Event* event) override; |
| |
| base::OneShotTimer* restore_timer_for_test() { return &restore_timer_; } |
| |
| private: |
| // If a recommended value and a user setting exist for |pref_name|, clears the |
| // user setting so that the recommended value can take effect. If |
| // |allow_delay| is |true| and user prefs not started yet, a timer is started |
| // that will clear the setting when the user becomes idle for one minute. |
| // Otherwise, the setting is cleared immediately. |
| void Restore(bool allow_delay, const std::string& pref_name); |
| |
| void RestoreAll(); |
| |
| void StartTimer(); |
| void StopTimer(); |
| |
| std::set<std::string> pref_names_; |
| |
| std::unique_ptr<PrefChangeRegistrar> pref_change_registrar_; |
| |
| bool active_user_pref_connected_ = false; |
| |
| base::OneShotTimer restore_timer_; |
| |
| DISALLOW_COPY_AND_ASSIGN(PolicyRecommendationRestorer); |
| }; |
| |
| } // namespace ash |
| |
| #endif // ASH_POLICY_POLICY_RECOMMENDATION_RESTORER_H_ |