1 // Copyright (c) 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.
5 #ifndef CHROME_BROWSER_CHROMEOS_LOGIN_WALLPAPER_MANAGER_H_
6 #define CHROME_BROWSER_CHROMEOS_LOGIN_WALLPAPER_MANAGER_H_
12 #include "ash/desktop_background/desktop_background_controller.h"
13 #include "base/files/file_path.h"
14 #include "base/memory/ref_counted_memory.h"
15 #include "base/memory/scoped_ptr.h"
16 #include "base/memory/weak_ptr.h"
17 #include "base/observer_list.h"
18 #include "base/threading/sequenced_worker_pool.h"
19 #include "base/time/time.h"
20 #include "chrome/browser/chromeos/login/user.h"
21 #include "chrome/browser/chromeos/login/user_image.h"
22 #include "chrome/browser/chromeos/login/user_image_loader.h"
23 #include "chrome/browser/chromeos/settings/cros_settings.h"
24 #include "content/public/browser/notification_observer.h"
25 #include "content/public/browser/notification_registrar.h"
26 #include "third_party/icu/source/i18n/unicode/timezone.h"
27 #include "ui/gfx/image/image_skia.h"
29 class PrefRegistrySimple
;
33 class SequencedTaskRunner
;
38 struct WallpaperInfo
{
39 // Online wallpaper URL or file name of migrated wallpaper.
41 ash::WallpaperLayout layout
;
42 User::WallpaperType type
;
44 bool operator==(const WallpaperInfo
& other
) {
45 return (file
== other
.file
) && (layout
== other
.layout
) &&
50 class MovableOnDestroyCallback
;
51 typedef scoped_ptr
<MovableOnDestroyCallback
> MovableOnDestroyCallbackHolder
;
53 class WallpaperManagerBrowserTest
;
56 // Name of wallpaper sequence token.
57 extern const char kWallpaperSequenceTokenName
[];
59 // File path suffices of resized small or large wallpaper.
60 // TODO(bshe): Use the same sub folder system as custom wallpapers use.
62 extern const char kSmallWallpaperSuffix
[];
63 extern const char kLargeWallpaperSuffix
[];
65 // Directory names of custom wallpapers.
66 extern const char kSmallWallpaperSubDir
[];
67 extern const char kLargeWallpaperSubDir
[];
68 extern const char kOriginalWallpaperSubDir
[];
69 extern const char kThumbnailWallpaperSubDir
[];
71 // The width and height of small/large resolution wallpaper. When screen size is
72 // smaller than |kSmallWallpaperMaxWidth| and |kSmallWallpaperMaxHeight|, the
73 // small resolution wallpaper should be used. Otherwise, use the large
74 // resolution wallpaper.
75 extern const int kSmallWallpaperMaxWidth
;
76 extern const int kSmallWallpaperMaxHeight
;
77 extern const int kLargeWallpaperMaxWidth
;
78 extern const int kLargeWallpaperMaxHeight
;
80 // The width and height of wallpaper thumbnails.
81 extern const int kWallpaperThumbnailWidth
;
82 extern const int kWallpaperThumbnailHeight
;
84 // This singleton class maintains wallpapers for users who have logged into this
86 class WallpaperManager
: public content::NotificationObserver
{
88 enum WallpaperResolution
{
89 WALLPAPER_RESOLUTION_LARGE
,
90 WALLPAPER_RESOLUTION_SMALL
96 explicit TestApi(WallpaperManager
* wallpaper_manager
);
99 base::FilePath
current_wallpaper_path();
101 bool GetWallpaperFromCache(const std::string
& user_id
,
102 gfx::ImageSkia
* image
);
104 void SetWallpaperCache(const std::string
& user_id
,
105 const gfx::ImageSkia
& image
);
107 void ClearDisposableWallpaperCache();
110 WallpaperManager
* wallpaper_manager_
; // not owned
112 DISALLOW_COPY_AND_ASSIGN(TestApi
);
115 // This should be public to allow access from functions in anonymous
117 class CustomizedWallpaperRescaledFiles
;
121 virtual ~Observer() {}
122 virtual void OnWallpaperAnimationFinished(const std::string
& user_id
) = 0;
123 virtual void OnUpdateWallpaperForTesting() {}
126 // This is "wallpaper either scheduled to load, or loading right now".
128 // While enqueued, it defines moment in the future, when it will be loaded.
129 // Enqueued but not started request might be updated by subsequent load
130 // request. Therefore it's created empty, and updated being enqueued.
132 // PendingWallpaper is owned by WallpaperManager, but reference to this object
133 // is passed to other threads by PostTask() calls, therefore it is
134 // RefCountedThreadSafe.
135 class PendingWallpaper
: public base::RefCountedThreadSafe
<PendingWallpaper
> {
137 // Do LoadWallpaper() - image not found in cache.
138 PendingWallpaper(const base::TimeDelta delay
, const std::string
& user_id
);
140 // There are 4 cases in SetUserWallpaper:
141 // 1) gfx::ImageSkia is found in cache.
142 // - Schedule task to (probably) resize it and install:
143 // call ash::Shell::GetInstance()->desktop_background_controller()->
144 // SetCustomWallpaper(user_wallpaper, layout);
145 // 2) WallpaperInfo is found in cache
146 // - need to LoadWallpaper(), resize and install.
147 // 3) wallpaper path is not NULL, load image URL, then resize, etc...
148 // 4) SetDefaultWallpaper (either on some error, or when user is new).
149 void ResetSetWallpaperImage(const gfx::ImageSkia
& image
,
150 const WallpaperInfo
& info
);
151 void ResetLoadWallpaper(const WallpaperInfo
& info
);
152 void ResetSetCustomWallpaper(const WallpaperInfo
& info
,
153 const base::FilePath
& wallpaper_path
);
154 void ResetSetDefaultWallpaper();
157 friend class base::RefCountedThreadSafe
<PendingWallpaper
>;
161 // All Reset*() methods use SetMode() to set object to new state.
162 void SetMode(const gfx::ImageSkia
& image
,
163 const WallpaperInfo
& info
,
164 const base::FilePath
& wallpaper_path
,
165 const bool is_default
);
167 // This method is usually triggered by timer to actually load request.
168 void ProcessRequest();
170 // This method is called by callback, when load request is finished.
171 void OnWallpaperSet();
173 std::string user_id_
;
175 gfx::ImageSkia user_wallpaper_
;
176 base::FilePath wallpaper_path_
;
178 // Load default wallpaper instead of user image.
181 // This is "on destroy" callback that will call OnWallpaperSet() when
182 // image will be loaded.
183 MovableOnDestroyCallbackHolder on_finish_
;
184 base::OneShotTimer
<WallpaperManager::PendingWallpaper
> timer
;
186 // Load start time to calculate duration.
187 base::Time started_load_at_
;
189 DISALLOW_COPY_AND_ASSIGN(PendingWallpaper
);
193 virtual ~WallpaperManager();
195 // Get pointer to singleton WallpaperManager instance, create it if necessary.
196 static WallpaperManager
* Get();
198 // Registers wallpaper manager preferences.
199 static void RegisterPrefs(PrefRegistrySimple
* registry
);
201 // Resizes |image| to a resolution which is nearest to |preferred_width| and
202 // |preferred_height| while respecting the |layout| choice. |output_skia| is
203 // optional (may be NULL). Returns true on success.
204 static bool ResizeImage(const gfx::ImageSkia
& image
,
205 ash::WallpaperLayout layout
,
207 int preferred_height
,
208 scoped_refptr
<base::RefCountedBytes
>* output
,
209 gfx::ImageSkia
* output_skia
);
211 // Resizes |image| to a resolution which is nearest to |preferred_width| and
212 // |preferred_height| while respecting the |layout| choice and saves the
213 // resized wallpaper to |path|. |output_skia| is optional (may be
214 // NULL). Returns true on success.
215 static bool ResizeAndSaveWallpaper(const gfx::ImageSkia
& image
,
216 const base::FilePath
& path
,
217 ash::WallpaperLayout layout
,
219 int preferred_height
,
220 gfx::ImageSkia
* output_skia
);
222 // Returns the appropriate wallpaper resolution for all root windows.
223 static WallpaperResolution
GetAppropriateResolution();
224 // This is a temporary variant of the previous method to investigate
225 // a problem with WallpaperManagetBrowserTest.
226 static WallpaperResolution
GetAppropriateResolutionForTesting();
228 void SetCommandLineForTesting(base::CommandLine
* command_line
);
230 // Indicates imminent shutdown, allowing the WallpaperManager to remove any
231 // observers it has registered.
234 // Adds PowerManagerClient, TimeZoneSettings and CrosSettings observers.
237 // Loads wallpaper asynchronously if the current wallpaper is not the
238 // wallpaper of logged in user.
239 void EnsureLoggedInUserWallpaperLoaded();
241 // Returns custom wallpaper path. Append |sub_dir|, |user_id_hash| and |file|
242 // to custom wallpaper directory.
243 base::FilePath
GetCustomWallpaperPath(const char* sub_dir
,
244 const std::string
& user_id_hash
,
245 const std::string
& file
) const;
247 // Gets wallpaper information of logged in user.
248 bool GetLoggedInUserWallpaperInfo(WallpaperInfo
* info
);
250 // Initializes wallpaper. If logged in, loads user's wallpaper. If not logged
251 // in, uses a solid color wallpaper. If logged in as a stub user, uses an
253 void InitializeWallpaper();
255 // NotificationObserver overrides:
256 virtual void Observe(int type
,
257 const content::NotificationSource
& source
,
258 const content::NotificationDetails
& details
) OVERRIDE
;
260 // Removes all |user_id| related wallpaper info and saved wallpapers.
261 void RemoveUserWallpaperInfo(const std::string
& user_id
);
263 // Saves custom wallpaper to file, post task to generate thumbnail and updates
264 // local state preferences. If |update_wallpaper| is false, don't change
265 // wallpaper but only update cache.
266 void SetCustomWallpaper(const std::string
& user_id
,
267 const std::string
& user_id_hash
,
268 const std::string
& file
,
269 ash::WallpaperLayout layout
,
270 User::WallpaperType type
,
271 const gfx::ImageSkia
& image
,
272 bool update_wallpaper
);
274 // Use given files as new default wallpaper.
275 // Reloads current wallpaper, if old default was loaded.
276 // Current value of default_wallpaper_image_ is destroyed.
277 // Sets default_wallpaper_image_ either to |small_wallpaper_image| or
278 // |large_wallpaper_image| depending on GetAppropriateResolution().
279 void SetDefaultWallpaperPath(
280 const base::FilePath
& customized_default_wallpaper_file_small
,
281 scoped_ptr
<gfx::ImageSkia
> small_wallpaper_image
,
282 const base::FilePath
& customized_default_wallpaper_file_large
,
283 scoped_ptr
<gfx::ImageSkia
> large_wallpaper_image
);
285 // Sets wallpaper to default wallpaper (asynchronously with zero delay).
286 void SetDefaultWallpaperNow(const std::string
& user_id
);
288 // Sets wallpaper to default wallpaper (asynchronously with default delay).
289 void SetDefaultWallpaperDelayed(const std::string
& user_id
);
291 // Sets selected wallpaper information for |user_id| and saves it to Local
292 // State if |is_persistent| is true.
293 void SetUserWallpaperInfo(const std::string
& user_id
,
294 const WallpaperInfo
& info
,
297 // Sets |user_id|'s wallpaper (asynchronously with zero delay).
298 void SetUserWallpaperNow(const std::string
& user_id
);
300 // Sets |user_id|'s wallpaper (asynchronously with default delay).
301 void SetUserWallpaperDelayed(const std::string
& user_id
);
303 // Sets wallpaper to |image| (asynchronously with zero delay). If
304 // |update_wallpaper| is false, skip change wallpaper but only update cache.
305 void SetWallpaperFromImageSkia(const std::string
& user_id
,
306 const gfx::ImageSkia
& image
,
307 ash::WallpaperLayout layout
,
308 bool update_wallpaper
);
310 // Updates current wallpaper. It may switch the size of wallpaper based on the
311 // current display's resolution. (asynchronously with zero delay)
312 void UpdateWallpaper(bool clear_cache
);
314 // Adds given observer to the list.
315 void AddObserver(Observer
* observer
);
317 // Removes given observer from the list.
318 void RemoveObserver(Observer
* observer
);
320 // Returns whether a wallpaper policy is enforced for |user_id|.
321 bool IsPolicyControlled(const std::string
& user_id
) const;
323 // Called when a wallpaper policy has been set for |user_id|. Blocks user
324 // from changing the wallpaper.
325 void OnPolicySet(const std::string
& policy
, const std::string
& user_id
);
327 // Called when the wallpaper policy has been cleared for |user_id|.
328 void OnPolicyCleared(const std::string
& policy
, const std::string
& user_id
);
330 // Called when the policy-set wallpaper has been fetched. Initiates decoding
331 // of the JPEG |data| with a callback to SetPolicyControlledWallpaper().
332 void OnPolicyFetched(const std::string
& policy
,
333 const std::string
& user_id
,
334 scoped_ptr
<std::string
> data
);
336 // Enable surprise me wallpaper mode.
337 void EnableSurpriseMe();
339 // This is called from CustomizationDocument.
340 // |resized_directory| is the directory where resized versions are stored and
342 void SetCustomizedDefaultWallpaper(const GURL
& wallpaper_url
,
343 const base::FilePath
& downloaded_file
,
344 const base::FilePath
& resized_directory
);
347 friend class TestApi
;
348 friend class WallpaperManagerBrowserTest
;
349 friend class WallpaperManagerBrowserTestDefaultWallpaper
;
350 friend class WallpaperManagerPolicyTest
;
352 typedef std::map
<std::string
, gfx::ImageSkia
> CustomWallpaperMap
;
354 // Initialize wallpaper for the specified user to default and saves this
355 // settings in local state.
356 void InitInitialUserWallpaper(const std::string
& user_id
, bool is_persistent
);
358 // Set wallpaper to |user_image| controlled by policy. (Takes a UserImage
359 // because that's the callback interface provided by UserImageLoader.)
360 void SetPolicyControlledWallpaper(const std::string
& user_id
,
361 const UserImage
& user_image
);
363 // Gets encoded wallpaper from cache. Returns true if success.
364 bool GetWallpaperFromCache(const std::string
& user_id
, gfx::ImageSkia
* image
);
366 // The number of wallpapers have loaded. For test only.
367 int loaded_wallpapers() const { return loaded_wallpapers_
; }
369 // Cache some (or all) logged in users' wallpapers to memory at login
370 // screen. It should not compete with first wallpaper loading when boot
371 // up/initialize login WebUI page.
372 // There are two ways the first wallpaper might be loaded:
373 // 1. Loaded on boot. Login WebUI waits for it.
374 // 2. When flag --disable-boot-animation is passed. Login WebUI is loaded
375 // right away and in 500ms after. Wallpaper started to load.
376 // For case 2, should_cache_wallpaper_ is used to indicate if we need to
377 // cache wallpapers on wallpaper animation finished. The cache operation
378 // should be only executed once.
379 void CacheUsersWallpapers();
381 // Caches |user_id|'s wallpaper to memory.
382 void CacheUserWallpaper(const std::string
& user_id
);
384 // Clears disposable ONLINE and CUSTOM wallpaper cache. At multi profile
385 // world, logged in users' wallpaper cache is not disposable.
386 void ClearDisposableWallpaperCache();
388 // Clears all obsolete wallpaper prefs from old version wallpaper pickers.
389 void ClearObsoleteWallpaperPrefs();
391 // Deletes all |user_id| related custom wallpapers and directories.
392 void DeleteUserWallpapers(const std::string
& user_id
,
393 const std::string
& path_to_file
);
395 // Gets the CommandLine representing the current process's command line.
396 base::CommandLine
* GetCommandLine();
398 // Initialize wallpaper of registered device after device policy is trusted.
399 // Note that before device is enrolled, it proceeds with untrusted setting.
400 void InitializeRegisteredDeviceWallpaper();
402 // Loads |user_id|'s wallpaper. When |update_wallpaper| is true, sets
403 // wallpaper to the loaded wallpaper.
404 void LoadWallpaper(const std::string
& user_id
,
405 const WallpaperInfo
& info
,
406 bool update_wallpaper
,
407 MovableOnDestroyCallbackHolder on_finish
);
409 // Moves custom wallpapers from |user_id| directory to |user_id_hash|
411 void MoveCustomWallpapersOnWorker(const std::string
& user_id
,
412 const std::string
& user_id_hash
);
414 // Called when the original custom wallpaper is moved to the new place.
415 // Updates the corresponding user wallpaper info.
416 void MoveCustomWallpapersSuccess(const std::string
& user_id
,
417 const std::string
& user_id_hash
);
419 // Moves custom wallpaper to a new place. Email address was used as directory
420 // name in the old system, this is not safe. New directory system uses
421 // user_id_hash instead of user_id. This must be called after user_id_hash is
423 void MoveLoggedInUserCustomWallpaper();
425 // Gets |user_id|'s custom wallpaper at |wallpaper_path|. Falls back on
426 // original custom wallpaper. When |update_wallpaper| is true, sets wallpaper
427 // to the loaded wallpaper. Must run on wallpaper sequenced worker thread.
428 void GetCustomWallpaperInternal(const std::string
& user_id
,
429 const WallpaperInfo
& info
,
430 const base::FilePath
& wallpaper_path
,
431 bool update_wallpaper
,
432 MovableOnDestroyCallbackHolder on_finish
);
434 // Gets wallpaper information of |user_id| from Local State or memory. Returns
435 // false if wallpaper information is not found.
436 bool GetUserWallpaperInfo(const std::string
& user_id
,
437 WallpaperInfo
* info
) const;
439 // Sets wallpaper to the decoded wallpaper if |update_wallpaper| is true.
440 // Otherwise, cache wallpaper to memory if not logged in. (Takes a UserImage
441 // because that's the callback interface provided by UserImageLoader.)
442 void OnWallpaperDecoded(const std::string
& user_id
,
443 ash::WallpaperLayout layout
,
444 bool update_wallpaper
,
445 MovableOnDestroyCallbackHolder on_finish
,
446 const UserImage
& user_image
);
448 // Record data for User Metrics Analysis.
449 void RecordUma(User::WallpaperType type
, int index
) const;
451 // Saves original custom wallpaper to |path| (absolute path) on filesystem
452 // and starts resizing operation of the custom wallpaper if necessary.
453 void SaveCustomWallpaper(const std::string
& user_id_hash
,
454 const base::FilePath
& path
,
455 ash::WallpaperLayout layout
,
456 scoped_ptr
<gfx::ImageSkia
> image
) const;
458 // Creates new PendingWallpaper request (or updates currently pending).
459 void ScheduleSetUserWallpaper(const std::string
& user_id
, bool delayed
);
461 // Sets wallpaper to default.
462 void DoSetDefaultWallpaper(
463 const std::string
& user_id
,
464 MovableOnDestroyCallbackHolder on_finish
);
466 // Starts to load wallpaper at |wallpaper_path|. If |wallpaper_path| is the
467 // same as |current_wallpaper_path_|, do nothing. Must be called on UI thread.
468 void StartLoad(const std::string
& user_id
,
469 const WallpaperInfo
& info
,
470 bool update_wallpaper
,
471 const base::FilePath
& wallpaper_path
,
472 MovableOnDestroyCallbackHolder on_finish
);
474 // After completed load operation, update average load time.
475 void SaveLastLoadTime(const base::TimeDelta elapsed
);
477 // Notify all registered observers.
478 void NotifyAnimationFinished();
480 // Returns modifiable PendingWallpaper.
481 // Returns pending_inactive_ or creates new PendingWallpaper if necessary.
482 PendingWallpaper
* GetPendingWallpaper(const std::string
& user_id
,
485 // Calculate delay for next wallpaper load.
486 // It is usually average wallpaper load time.
487 // If last wallpaper load happened long ago, timeout should be reduced by
488 // the time passed after last wallpaper load. So usual user experience results
490 base::TimeDelta
GetWallpaperLoadDelay() const;
492 // This is called after we check that supplied default wallpaper files exist.
493 void SetCustomizedDefaultWallpaperAfterCheck(
494 const GURL
& wallpaper_url
,
495 const base::FilePath
& downloaded_file
,
496 scoped_ptr
<CustomizedWallpaperRescaledFiles
> rescaled_files
);
498 // Starts rescaling of customized wallpaper.
499 void OnCustomizedDefaultWallpaperDecoded(
500 const GURL
& wallpaper_url
,
501 scoped_ptr
<CustomizedWallpaperRescaledFiles
> rescaled_files
,
502 const UserImage
& user_image
);
504 // Resize and save customized default wallpaper.
505 void ResizeCustomizedDefaultWallpaper(
506 scoped_ptr
<gfx::ImageSkia
> image
,
507 const UserImage::RawImage
& raw_image
,
508 const CustomizedWallpaperRescaledFiles
* rescaled_files
,
510 gfx::ImageSkia
* small_wallpaper_image
,
511 gfx::ImageSkia
* large_wallpaper_image
);
513 // Check the result of ResizeCustomizedDefaultWallpaper and finally
514 // apply Customized Default Wallpaper.
515 void OnCustomizedDefaultWallpaperResized(
516 const GURL
& wallpaper_url
,
517 scoped_ptr
<CustomizedWallpaperRescaledFiles
> rescaled_files
,
518 scoped_ptr
<bool> success
,
519 scoped_ptr
<gfx::ImageSkia
> small_wallpaper_image
,
520 scoped_ptr
<gfx::ImageSkia
> large_wallpaper_image
);
522 // Init |*default_*_wallpaper_file_| from given command line and
523 // clear |default_wallpaper_image_|.
524 void SetDefaultWallpaperPathsFromCommandLine(base::CommandLine
* command_line
);
526 // Sets wallpaper to decoded default.
527 void OnDefaultWallpaperDecoded(const base::FilePath
& path
,
528 const ash::WallpaperLayout layout
,
529 scoped_ptr
<UserImage
>* result
,
530 MovableOnDestroyCallbackHolder on_finish
,
531 const UserImage
& user_image
);
533 // Start decoding given default wallpaper.
534 void StartLoadAndSetDefaultWallpaper(const base::FilePath
& path
,
535 const ash::WallpaperLayout layout
,
536 MovableOnDestroyCallbackHolder on_finish
,
537 scoped_ptr
<UserImage
>* result_out
);
539 // Returns wallpaper subdirectory name for current resolution.
540 const char* GetCustomWallpaperSubdirForCurrentResolution();
542 // The number of loaded wallpapers.
543 int loaded_wallpapers_
;
545 // Sequence token associated with wallpaper operations.
546 base::SequencedWorkerPool::SequenceToken sequence_token_
;
548 // Wallpaper sequenced task runner.
549 scoped_refptr
<base::SequencedTaskRunner
> task_runner_
;
551 // The file path of current loaded/loading custom/online wallpaper.
552 base::FilePath current_wallpaper_path_
;
554 // Loads user wallpaper from its file.
555 scoped_refptr
<UserImageLoader
> wallpaper_loader_
;
557 // Logged-in user wallpaper information.
558 WallpaperInfo current_user_wallpaper_info_
;
560 // If non-NULL, used in place of the real command line.
561 base::CommandLine
* command_line_for_testing_
;
563 // Caches wallpapers of users. Accessed only on UI thread.
564 CustomWallpaperMap wallpaper_cache_
;
566 // The last selected user on user pod row.
567 std::string last_selected_user_
;
569 bool should_cache_wallpaper_
;
571 scoped_ptr
<CrosSettings::ObserverSubscription
>
572 show_user_name_on_signin_subscription_
;
574 base::WeakPtrFactory
<WallpaperManager
> weak_factory_
;
576 content::NotificationRegistrar registrar_
;
578 ObserverList
<Observer
> observers_
;
580 // These members are for the scheduler:
582 // When last load attempt finished.
583 base::Time last_load_finished_at_
;
585 // last N wallpaper loads times.
586 std::deque
<base::TimeDelta
> last_load_times_
;
588 // Pointer to last inactive (waiting) entry of 'loading_' list.
589 // NULL when there is no inactive request.
590 PendingWallpaper
* pending_inactive_
;
592 // Owns PendingWallpaper.
593 // PendingWallpaper deletes itself from here on load complete.
594 // All pending will be finally deleted on destroy.
595 typedef std::vector
<scoped_refptr
<PendingWallpaper
> > PendingList
;
596 PendingList loading_
;
598 base::FilePath default_small_wallpaper_file_
;
599 base::FilePath default_large_wallpaper_file_
;
601 base::FilePath guest_small_wallpaper_file_
;
602 base::FilePath guest_large_wallpaper_file_
;
604 // Current decoded default image is stored in cache.
605 scoped_ptr
<UserImage
> default_wallpaper_image_
;
607 DISALLOW_COPY_AND_ASSIGN(WallpaperManager
);
610 } // namespace chromeos
612 #endif // CHROME_BROWSER_CHROMEOS_LOGIN_WALLPAPER_MANAGER_H_