// Copyright 2013 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 CHROME_BROWSER_CHROMEOS_POLICY_RECOMMENDATION_RESTORER_H_
#define CHROME_BROWSER_CHROMEOS_POLICY_RECOMMENDATION_RESTORER_H_

#include <string>

#include "ash/wm/user_activity_observer.h"
#include "base/basictypes.h"
#include "base/compiler_specific.h"
#include "base/prefs/pref_change_registrar.h"
#include "base/timer/timer.h"
#include "components/browser_context_keyed_service/browser_context_keyed_service.h"
#include "content/public/browser/notification_observer.h"
#include "content/public/browser/notification_registrar.h"

class Profile;

namespace policy {

// Observes a set of prefs in the login profile. If any of the prefs has a
// recommended value, its user setting is cleared so that the recommendation can
// take effect. This happens immediately when the login screen is shown, when
// a session is being started and whenever recommended values change during a
// user session. On the login screen, user settings are cleared when the user
// becomes idle for one minute.
class RecommendationRestorer : public BrowserContextKeyedService,
                               public content::NotificationObserver,
                               public ash::UserActivityObserver {
 public:
  explicit RecommendationRestorer(Profile* profile);
  virtual ~RecommendationRestorer();

  // BrowserContextKeyedService:
  virtual void Shutdown() OVERRIDE;

  // content::NotificationObserver:
  virtual void Observe(int type,
                       const content::NotificationSource& source,
                       const content::NotificationDetails& details) OVERRIDE;

  // ash::UserActivityObserver:
  virtual void OnUserActivity(const ui::Event* event) OVERRIDE;

  // 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 the login screen is being shown, 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);

 private:
  friend class RecommendationRestorerTest;

  void RestoreAll();

  void StartTimer();
  void StopTimer();

  PrefChangeRegistrar pref_change_registrar_;
  content::NotificationRegistrar notification_registrar_;

  bool logged_in_;

  base::OneShotTimer<RecommendationRestorer> restore_timer_;

  DISALLOW_COPY_AND_ASSIGN(RecommendationRestorer);
};

}  // namespace policy

#endif  // CHROME_BROWSER_CHROMEOS_POLICY_RECOMMENDATION_RESTORER_H_
