1// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef CHROME_BROWSER_CHROMEOS_LOCALE_CHANGE_GUARD_H_
6#define CHROME_BROWSER_CHROMEOS_LOCALE_CHANGE_GUARD_H_
7
8#include <string>
9
10#include "ash/system/locale/locale_observer.h"
11#include "base/compiler_specific.h"
12#include "base/lazy_instance.h"
13#include "base/memory/scoped_ptr.h"
14#include "base/memory/weak_ptr.h"
15#include "base/strings/string16.h"
16#include "content/public/browser/notification_observer.h"
17#include "content/public/browser/notification_registrar.h"
18#include "content/public/browser/notification_types.h"
19
20class Profile;
21
22namespace base {
23class ListValue;
24}
25
26namespace chromeos {
27
28// Performs check whether locale has been changed automatically recently
29// (based on synchronized user preference).  If so: shows notification that
30// allows user to revert change.
31class LocaleChangeGuard : public content::NotificationObserver,
32                          public ash::LocaleObserver::Delegate,
33                          public base::SupportsWeakPtr<LocaleChangeGuard> {
34 public:
35  explicit LocaleChangeGuard(Profile* profile);
36  virtual ~LocaleChangeGuard();
37
38  // ash::LocaleChangeDelegate implementation.
39  virtual void AcceptLocaleChange() OVERRIDE;
40  virtual void RevertLocaleChange() OVERRIDE;
41
42  // Called just before changing locale.
43  void PrepareChangingLocale(
44      const std::string& from_locale, const std::string& to_locale);
45
46  // Called after login.
47  void OnLogin();
48
49 private:
50  class Delegate;
51
52  void RevertLocaleChangeCallback(const base::ListValue* list);
53  void Check();
54
55  // content::NotificationObserver implementation.
56  virtual void Observe(int type,
57                       const content::NotificationSource& source,
58                       const content::NotificationDetails& details) OVERRIDE;
59
60  std::string from_locale_;
61  std::string to_locale_;
62  Profile* profile_;
63  bool reverted_;
64  bool session_started_;
65  bool main_frame_loaded_;
66  content::NotificationRegistrar registrar_;
67
68  // We want to show locale change notification in previous language however
69  // we cannot directly load strings for non-current locale.  So we cache
70  // messages before locale change.
71  base::string16 title_text_;
72  base::string16 message_text_;
73  base::string16 revert_link_text_;
74};
75
76}  // namespace chromeos
77
78#endif  // CHROME_BROWSER_CHROMEOS_LOCALE_CHANGE_GUARD_H_
79