Upstream version 9.37.197.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / chromeos / app_mode / kiosk_app_manager.h
1 // Copyright 2013 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_APP_MODE_KIOSK_APP_MANAGER_H_
6 #define CHROME_BROWSER_CHROMEOS_APP_MODE_KIOSK_APP_MANAGER_H_
7
8 #include <string>
9 #include <vector>
10
11 #include "base/basictypes.h"
12 #include "base/callback_forward.h"
13 #include "base/lazy_instance.h"
14 #include "base/memory/scoped_ptr.h"
15 #include "base/memory/scoped_vector.h"
16 #include "base/observer_list.h"
17 #include "chrome/browser/chromeos/app_mode/kiosk_app_data_delegate.h"
18 #include "chrome/browser/chromeos/extensions/external_cache.h"
19 #include "chrome/browser/chromeos/policy/enterprise_install_attributes.h"
20 #include "chrome/browser/chromeos/settings/cros_settings.h"
21 #include "ui/gfx/image/image_skia.h"
22
23 class PrefRegistrySimple;
24 class Profile;
25
26 namespace base {
27 class RefCountedString;
28 }
29
30 namespace extensions {
31 class Extension;
32 }
33
34 namespace chromeos {
35
36 class KioskAppData;
37 class KioskAppManagerObserver;
38
39 // KioskAppManager manages cached app data.
40 class KioskAppManager : public KioskAppDataDelegate,
41                         public ExternalCache::Delegate {
42  public:
43   enum ConsumerKioskAutoLaunchStatus {
44     // Consumer kiosk mode auto-launch feature can be enabled on this machine.
45     CONSUMER_KIOSK_AUTO_LAUNCH_CONFIGURABLE,
46     // Consumer kiosk auto-launch feature is enabled on this machine.
47     CONSUMER_KIOSK_AUTO_LAUNCH_ENABLED,
48     // Consumer kiosk mode auto-launch feature is disabled and cannot any longer
49     // be enabled on this machine.
50     CONSUMER_KIOSK_AUTO_LAUNCH_DISABLED,
51   };
52
53   typedef base::Callback<void(bool success)> EnableKioskAutoLaunchCallback;
54   typedef base::Callback<void(ConsumerKioskAutoLaunchStatus status)>
55       GetConsumerKioskAutoLaunchStatusCallback;
56
57   // Struct to hold app info returned from GetApps() call.
58   struct App {
59     App(const KioskAppData& data, bool is_extension_pending);
60     App();
61     ~App();
62
63     std::string app_id;
64     std::string user_id;
65     std::string name;
66     gfx::ImageSkia icon;
67     bool is_loading;
68   };
69   typedef std::vector<App> Apps;
70
71   // Name of a dictionary that holds kiosk app info in Local State.
72   // Sample layout:
73   //   "kiosk": {
74   //     "auto_login_enabled": true  //
75   //   }
76   static const char kKioskDictionaryName[];
77   static const char kKeyApps[];
78   static const char kKeyAutoLoginState[];
79
80   // Sub directory under DIR_USER_DATA to store cached icon files.
81   static const char kIconCacheDir[];
82
83   // Sub directory under DIR_USER_DATA to store cached crx files.
84   static const char kCrxCacheDir[];
85
86   // Gets the KioskAppManager instance, which is lazily created on first call..
87   static KioskAppManager* Get();
88
89   // Prepares for shutdown and calls CleanUp() if needed.
90   static void Shutdown();
91
92   // Registers kiosk app entries in local state.
93   static void RegisterPrefs(PrefRegistrySimple* registry);
94
95   // Initiates reading of consumer kiosk mode auto-launch status.
96   void GetConsumerKioskAutoLaunchStatus(
97       const GetConsumerKioskAutoLaunchStatusCallback& callback);
98
99   // Enables consumer kiosk mode app auto-launch feature. Upon completion,
100   // |callback| will be invoked with outcome of this operation.
101   void EnableConsumerKioskAutoLaunch(
102       const EnableKioskAutoLaunchCallback& callback);
103
104   // Returns true if this device is consumer kiosk auto launch enabled.
105   bool IsConsumerKioskDeviceWithAutoLaunch();
106
107   // Returns auto launcher app id or an empty string if there is none.
108   std::string GetAutoLaunchApp() const;
109
110   // Sets |app_id| as the app to auto launch at start up.
111   void SetAutoLaunchApp(const std::string& app_id);
112
113   // Returns true if there is a pending auto-launch request.
114   bool IsAutoLaunchRequested() const;
115
116   // Returns true if owner/policy enabled auto launch.
117   bool IsAutoLaunchEnabled() const;
118
119   // Enable auto launch setter.
120   void SetEnableAutoLaunch(bool value);
121
122   // Adds/removes a kiosk app by id. When removed, all locally cached data
123   // will be removed as well.
124   void AddApp(const std::string& app_id);
125   void RemoveApp(const std::string& app_id);
126
127   // Gets info of all apps that have no meta data load error.
128   void GetApps(Apps* apps) const;
129
130   // Gets app data for the given app id. Returns true if |app_id| is known and
131   // |app| is populated. Otherwise, return false.
132   bool GetApp(const std::string& app_id, App* app) const;
133
134   // Gets the raw icon data for the given app id. Returns NULL if |app_id|
135   // is unknown.
136   const base::RefCountedString* GetAppRawIcon(const std::string& app_id) const;
137
138   // Gets whether the bailout shortcut is disabled.
139   bool GetDisableBailoutShortcut() const;
140
141   // Clears locally cached app data.
142   void ClearAppData(const std::string& app_id);
143
144   // Updates app data from the |app| in |profile|. |app| is provided to cover
145   // the case of app update case where |app| is the new version and is not
146   // finished installing (e.g. because old version is still running). Otherwise,
147   // |app| could be NULL and the current installed app in |profile| will be
148   // used.
149   void UpdateAppDataFromProfile(const std::string& app_id,
150                                 Profile* profile,
151                                 const extensions::Extension* app);
152
153   void RetryFailedAppDataFetch();
154
155   void AddObserver(KioskAppManagerObserver* observer);
156   void RemoveObserver(KioskAppManagerObserver* observer);
157
158  private:
159   friend struct base::DefaultLazyInstanceTraits<KioskAppManager>;
160   friend struct base::DefaultDeleter<KioskAppManager>;
161   friend class KioskAppManagerTest;
162   friend class KioskTest;
163
164   enum AutoLoginState {
165     AUTOLOGIN_NONE      = 0,
166     AUTOLOGIN_REQUESTED = 1,
167     AUTOLOGIN_APPROVED  = 2,
168     AUTOLOGIN_REJECTED  = 3,
169   };
170
171   KioskAppManager();
172   virtual ~KioskAppManager();
173
174   // Stop all data loading and remove its dependency on CrosSettings.
175   void CleanUp();
176
177   // Gets KioskAppData for the given app id.
178   const KioskAppData* GetAppData(const std::string& app_id) const;
179   KioskAppData* GetAppDataMutable(const std::string& app_id);
180
181   // Update app data |apps_| based on CrosSettings.
182   void UpdateAppData();
183
184   // KioskAppDataDelegate overrides:
185   virtual void GetKioskAppIconCacheDir(base::FilePath* cache_dir) OVERRIDE;
186   virtual void OnKioskAppDataChanged(const std::string& app_id) OVERRIDE;
187   virtual void OnKioskAppDataLoadFailure(const std::string& app_id) OVERRIDE;
188
189   // ExternalCache::Delegate:
190   virtual void OnExtensionListsUpdated(
191       const base::DictionaryValue* prefs) OVERRIDE;
192   virtual void OnExtensionLoadedInCache(const std::string& id) OVERRIDE;
193   virtual void OnExtensionDownloadFailed(
194       const std::string& id,
195       extensions::ExtensionDownloaderDelegate::Error error) OVERRIDE;
196
197   // Callback for EnterpriseInstallAttributes::LockDevice() during
198   // EnableConsumerModeKiosk() call.
199   void OnLockDevice(
200       const EnableKioskAutoLaunchCallback& callback,
201       policy::EnterpriseInstallAttributes::LockResult result);
202
203   // Callback for EnterpriseInstallAttributes::ReadImmutableAttributes() during
204   // GetConsumerKioskModeStatus() call.
205   void OnReadImmutableAttributes(
206       const GetConsumerKioskAutoLaunchStatusCallback& callback);
207
208   // Callback for reading handling checks of the owner public.
209   void OnOwnerFileChecked(
210       const GetConsumerKioskAutoLaunchStatusCallback& callback,
211       bool* owner_present);
212
213   // Reads/writes auto login state from/to local state.
214   AutoLoginState GetAutoLoginState() const;
215   void SetAutoLoginState(AutoLoginState state);
216
217   void GetCrxCacheDir(base::FilePath* cache_dir);
218
219   bool GetCachedCrx(const std::string& app_id,
220                     base::FilePath* file_path,
221                     std::string* version);
222
223   // True if machine ownership is already established.
224   bool ownership_established_;
225   ScopedVector<KioskAppData> apps_;
226   std::string auto_launch_app_id_;
227   ObserverList<KioskAppManagerObserver, true> observers_;
228
229   scoped_ptr<CrosSettings::ObserverSubscription>
230       local_accounts_subscription_;
231   scoped_ptr<CrosSettings::ObserverSubscription>
232       local_account_auto_login_id_subscription_;
233
234   scoped_ptr<ExternalCache> external_cache_;
235
236   DISALLOW_COPY_AND_ASSIGN(KioskAppManager);
237 };
238
239 }  // namespace chromeos
240
241 #endif  // CHROME_BROWSER_CHROMEOS_APP_MODE_KIOSK_APP_MANAGER_H_