1cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#ifndef CHROME_BROWSER_CHROMEOS_LOGIN_USERS_WALLPAPER_WALLPAPER_MANAGER_H_
6cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#define CHROME_BROWSER_CHROMEOS_LOGIN_USERS_WALLPAPER_WALLPAPER_MANAGER_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include <deque>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include <vector>
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/desktop_background/desktop_background_controller.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted_memory.h"
1568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/weak_ptr.h"
17f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/observer_list.h"
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/threading/sequenced_worker_pool.h"
19eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h"
20cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/chromeos/login/users/avatar/user_image_loader.h"
2168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "chrome/browser/chromeos/settings/cros_settings.h"
225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "components/user_manager/user.h"
23116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "components/user_manager/user_image/user_image.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_observer.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_registrar.h"
26ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "third_party/icu/source/i18n/unicode/timezone.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/image/image_skia.h"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class PrefRegistrySimple;
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace base {
32a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class CommandLine;
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class SequencedTaskRunner;
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace user_manager {
375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class User;
38116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass UserImage;
39116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
40116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace chromeos {
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct WallpaperInfo {
445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Either file name of migrated wallpaper including first directory level
455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // (corresponding to user id hash) or online wallpaper URL.
465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  std::string location;
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ash::WallpaperLayout layout;
485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  user_manager::User::WallpaperType type;
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Time date;
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool operator==(const WallpaperInfo& other) {
515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return (location == other.location) && (layout == other.layout) &&
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (type == other.type);
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class MovableOnDestroyCallback;
575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)typedef scoped_ptr<MovableOnDestroyCallback> MovableOnDestroyCallbackHolder;
585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class WallpaperManagerBrowserTest;
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Name of wallpaper sequence token.
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)extern const char kWallpaperSequenceTokenName[];
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// File path suffices of resized small or large wallpaper.
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// TODO(bshe): Use the same sub folder system as custom wallpapers use.
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// crbug.com/174928
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern const char kSmallWallpaperSuffix[];
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern const char kLargeWallpaperSuffix[];
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Directory names of custom wallpapers.
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)extern const char kSmallWallpaperSubDir[];
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)extern const char kLargeWallpaperSubDir[];
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)extern const char kOriginalWallpaperSubDir[];
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)extern const char kThumbnailWallpaperSubDir[];
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
76c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// The width and height of small/large resolution wallpaper. When screen size is
77c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// smaller than |kSmallWallpaperMaxWidth| and |kSmallWallpaperMaxHeight|, the
78c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// small resolution wallpaper should be used. Otherwise, use the large
79c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// resolution wallpaper.
80c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochextern const int kSmallWallpaperMaxWidth;
81c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochextern const int kSmallWallpaperMaxHeight;
82c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochextern const int kLargeWallpaperMaxWidth;
83c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochextern const int kLargeWallpaperMaxHeight;
84c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
85c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// The width and height of wallpaper thumbnails.
86c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochextern const int kWallpaperThumbnailWidth;
87c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochextern const int kWallpaperThumbnailHeight;
88c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
895c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// This singleton class maintains wallpapers for users who have logged into this
905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// Chrome OS device.
9158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)class WallpaperManager: public content::NotificationObserver {
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
93c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  enum WallpaperResolution {
94c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    WALLPAPER_RESOLUTION_LARGE,
95c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    WALLPAPER_RESOLUTION_SMALL
96c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  };
97c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
98a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // For testing.
99a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  class TestApi {
100a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)   public:
101a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    explicit TestApi(WallpaperManager* wallpaper_manager);
102a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    virtual ~TestApi();
103a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
104a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    base::FilePath current_wallpaper_path();
105a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
1065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    bool GetWallpaperFromCache(const std::string& user_id,
1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                               gfx::ImageSkia* image);
1085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    void SetWallpaperCache(const std::string& user_id,
1105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                           const gfx::ImageSkia& image);
1115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
112a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    void ClearDisposableWallpaperCache();
1135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
114a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)   private:
115a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    WallpaperManager* wallpaper_manager_;  // not owned
116a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
117a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    DISALLOW_COPY_AND_ASSIGN(TestApi);
118a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  };
119a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
1200529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // This should be public to allow access from functions in anonymous
1210529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // namespace.
1220529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  class CustomizedWallpaperRescaledFiles;
1230529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
124f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  class Observer {
125f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)   public:
126f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    virtual ~Observer() {}
1275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    virtual void OnWallpaperAnimationFinished(const std::string& user_id) = 0;
128c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    virtual void OnUpdateWallpaperForTesting() {}
129cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    virtual void OnPendingListEmptyForTesting() {}
1305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  };
1315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // This is "wallpaper either scheduled to load, or loading right now".
1335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  //
1345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // While enqueued, it defines moment in the future, when it will be loaded.
1355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Enqueued but not started request might be updated by subsequent load
1365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // request. Therefore it's created empty, and updated being enqueued.
1375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  //
1385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // PendingWallpaper is owned by WallpaperManager, but reference to this object
139a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // is passed to other threads by PostTask() calls, therefore it is
1405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // RefCountedThreadSafe.
1415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  class PendingWallpaper : public base::RefCountedThreadSafe<PendingWallpaper> {
1425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   public:
1435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // Do LoadWallpaper() - image not found in cache.
1445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    PendingWallpaper(const base::TimeDelta delay, const std::string& user_id);
1455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // There are 4 cases in SetUserWallpaper:
1475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // 1) gfx::ImageSkia is found in cache.
1485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    //    - Schedule task to (probably) resize it and install:
1495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    //    call ash::Shell::GetInstance()->desktop_background_controller()->
1505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    //          SetCustomWallpaper(user_wallpaper, layout);
1515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // 2) WallpaperInfo is found in cache
1525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    //    - need to LoadWallpaper(), resize and install.
1535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // 3) wallpaper path is not NULL, load image URL, then resize, etc...
1545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // 4) SetDefaultWallpaper (either on some error, or when user is new).
1555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    void ResetSetWallpaperImage(const gfx::ImageSkia& image,
1565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                const WallpaperInfo& info);
1575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    void ResetLoadWallpaper(const WallpaperInfo& info);
1585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    void ResetSetCustomWallpaper(const WallpaperInfo& info,
1595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                 const base::FilePath& wallpaper_path);
1605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    void ResetSetDefaultWallpaper();
1615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   private:
1635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    friend class base::RefCountedThreadSafe<PendingWallpaper>;
1645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    ~PendingWallpaper();
1665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // All Reset*() methods use SetMode() to set object to new state.
1685c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    void SetMode(const gfx::ImageSkia& image,
1695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                 const WallpaperInfo& info,
1705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                 const base::FilePath& wallpaper_path,
1715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                 const bool is_default);
1725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // This method is usually triggered by timer to actually load request.
1745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    void ProcessRequest();
1755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // This method is called by callback, when load request is finished.
1775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    void OnWallpaperSet();
1785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    std::string user_id_;
1805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    WallpaperInfo info_;
1815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    gfx::ImageSkia user_wallpaper_;
1825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::FilePath wallpaper_path_;
1835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // Load default wallpaper instead of user image.
1855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    bool default_;
1865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // This is "on destroy" callback that will call OnWallpaperSet() when
1885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // image will be loaded.
1895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    MovableOnDestroyCallbackHolder on_finish_;
1905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::OneShotTimer<WallpaperManager::PendingWallpaper> timer;
1915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // Load start time to calculate duration.
1935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::Time started_load_at_;
1945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    DISALLOW_COPY_AND_ASSIGN(PendingWallpaper);
196f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  };
197f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WallpaperManager();
1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~WallpaperManager();
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2015c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Get pointer to singleton WallpaperManager instance, create it if necessary.
2025c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  static WallpaperManager* Get();
2035c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
2045c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Registers wallpaper manager preferences.
2055c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  static void RegisterPrefs(PrefRegistrySimple* registry);
2065c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
2075c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Resizes |image| to a resolution which is nearest to |preferred_width| and
2085c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // |preferred_height| while respecting the |layout| choice. |output_skia| is
2095c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // optional (may be NULL). Returns true on success.
2105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  static bool ResizeImage(const gfx::ImageSkia& image,
2115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          ash::WallpaperLayout layout,
2125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          int preferred_width,
2135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          int preferred_height,
2145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          scoped_refptr<base::RefCountedBytes>* output,
2155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          gfx::ImageSkia* output_skia);
2165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
2175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Resizes |image| to a resolution which is nearest to |preferred_width| and
2185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // |preferred_height| while respecting the |layout| choice and saves the
2195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // resized wallpaper to |path|. |output_skia| is optional (may be
2205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // NULL). Returns true on success.
2215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  static bool ResizeAndSaveWallpaper(const gfx::ImageSkia& image,
2225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                                     const base::FilePath& path,
2235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                                     ash::WallpaperLayout layout,
2245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                                     int preferred_width,
2255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                                     int preferred_height,
2265c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                                     gfx::ImageSkia* output_skia);
2275c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
2285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Returns the appropriate wallpaper resolution for all root windows.
2295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  static WallpaperResolution GetAppropriateResolution();
2305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
2316d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // Returns custom wallpaper path. Append |sub_dir|, |user_id_hash| and |file|
2326d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // to custom wallpaper directory.
2336d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  static base::FilePath GetCustomWallpaperPath(const char* sub_dir,
2346d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                                               const std::string& user_id_hash,
2356d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                                               const std::string& file);
2366d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
237c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  void SetCommandLineForTesting(base::CommandLine* command_line);
238a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Indicates imminent shutdown, allowing the WallpaperManager to remove any
2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // observers it has registered.
2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void Shutdown();
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Adds PowerManagerClient, TimeZoneSettings and CrosSettings observers.
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AddObservers();
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Loads wallpaper asynchronously if the current wallpaper is not the
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // wallpaper of logged in user.
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void EnsureLoggedInUserWallpaperLoaded();
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Gets wallpaper information of logged in user.
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool GetLoggedInUserWallpaperInfo(WallpaperInfo* info);
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Initializes wallpaper. If logged in, loads user's wallpaper. If not logged
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // in, uses a solid color wallpaper. If logged in as a stub user, uses an
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // empty wallpaper.
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void InitializeWallpaper();
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // NotificationObserver overrides:
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Observe(int type,
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       const content::NotificationSource& source,
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       const content::NotificationDetails& details) OVERRIDE;
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Removes all |user_id| related wallpaper info and saved wallpapers.
2645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void RemoveUserWallpaperInfo(const std::string& user_id);
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Calls SetCustomWallpaper() with |user_id_hash| received from cryptohome.
2675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  void SetCustomWallpaperOnSanitizedUsername(const std::string& user_id,
2685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                             const gfx::ImageSkia& image,
2695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                             bool update_wallpaper,
2705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                             bool cryptohome_success,
2715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                             const std::string& user_id_hash);
2725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Saves custom wallpaper to file, post task to generate thumbnail and updates
2745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // local state preferences. If |update_wallpaper| is false, don't change
2755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // wallpaper but only update cache.
2765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void SetCustomWallpaper(const std::string& user_id,
2774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                          const std::string& user_id_hash,
2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          const std::string& file,
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          ash::WallpaperLayout layout,
2805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                          user_manager::User::WallpaperType type,
2815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          const gfx::ImageSkia& image,
2825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                          bool update_wallpaper);
2835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2840529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // Use given files as new default wallpaper.
2850529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // Reloads current wallpaper, if old default was loaded.
2860529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // Current value of default_wallpaper_image_ is destroyed.
2870529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // Sets default_wallpaper_image_ either to |small_wallpaper_image| or
2880529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // |large_wallpaper_image| depending on GetAppropriateResolution().
2890529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  void SetDefaultWallpaperPath(
2900529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      const base::FilePath& customized_default_wallpaper_file_small,
2910529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      scoped_ptr<gfx::ImageSkia> small_wallpaper_image,
2920529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      const base::FilePath& customized_default_wallpaper_file_large,
2930529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      scoped_ptr<gfx::ImageSkia> large_wallpaper_image);
2940529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
2955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Sets wallpaper to default wallpaper (asynchronously with zero delay).
2965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void SetDefaultWallpaperNow(const std::string& user_id);
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Sets wallpaper to default wallpaper (asynchronously with default delay).
2995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void SetDefaultWallpaperDelayed(const std::string& user_id);
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Sets selected wallpaper information for |user_id| and saves it to Local
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // State if |is_persistent| is true.
3035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void SetUserWallpaperInfo(const std::string& user_id,
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            const WallpaperInfo& info,
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            bool is_persistent);
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Sets |user_id|'s wallpaper (asynchronously with zero delay).
3085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void SetUserWallpaperNow(const std::string& user_id);
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Sets |user_id|'s wallpaper (asynchronously with default delay).
3115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void SetUserWallpaperDelayed(const std::string& user_id);
3125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Sets wallpaper to |image| (asynchronously with zero delay). If
3145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // |update_wallpaper| is false, skip change wallpaper but only update cache.
3155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void SetWallpaperFromImageSkia(const std::string& user_id,
3165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                                 const gfx::ImageSkia& image,
3175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                 ash::WallpaperLayout layout,
3185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                 bool update_wallpaper);
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Updates current wallpaper. It may switch the size of wallpaper based on the
3215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // current display's resolution. (asynchronously with zero delay)
322a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void UpdateWallpaper(bool clear_cache);
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
324f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Adds given observer to the list.
325f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  void AddObserver(Observer* observer);
326f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
327f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Removes given observer from the list.
328f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  void RemoveObserver(Observer* observer);
329f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
330a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Returns whether a wallpaper policy is enforced for |user_id|.
331a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  bool IsPolicyControlled(const std::string& user_id) const;
332a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
333a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Called when a wallpaper policy has been set for |user_id|.  Blocks user
334a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // from changing the wallpaper.
335a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void OnPolicySet(const std::string& policy, const std::string& user_id);
336a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
337a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Called when the wallpaper policy has been cleared for |user_id|.
338a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void OnPolicyCleared(const std::string& policy, const std::string& user_id);
339a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
340a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Called when the policy-set wallpaper has been fetched.  Initiates decoding
341a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // of the JPEG |data| with a callback to SetPolicyControlledWallpaper().
342a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void OnPolicyFetched(const std::string& policy,
343a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                       const std::string& user_id,
344a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                       scoped_ptr<std::string> data);
345a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
3460529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // This is called from CustomizationDocument.
3470529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // |resized_directory| is the directory where resized versions are stored and
3480529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // must be writable.
3490529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  void SetCustomizedDefaultWallpaper(const GURL& wallpaper_url,
3500529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                                     const base::FilePath& downloaded_file,
3510529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                                     const base::FilePath& resized_directory);
3520529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
353cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Returns queue size.
354cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  size_t GetPendingListSizeForTesting() const;
355cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
357a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  friend class TestApi;
3586d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  friend class PendingWallpaper;
3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  friend class WallpaperManagerBrowserTest;
360c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  friend class WallpaperManagerBrowserTestDefaultWallpaper;
361effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  friend class WallpaperManagerPolicyTest;
362effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef std::map<std::string, gfx::ImageSkia> CustomWallpaperMap;
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3656d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
3666d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // Saves original custom wallpaper to |path| (absolute path) on filesystem
3676d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // and starts resizing operation of the custom wallpaper if necessary.
3686d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  static void SaveCustomWallpaper(const std::string& user_id_hash,
3696d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                                  const base::FilePath& path,
3706d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                                  ash::WallpaperLayout layout,
3716d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                                  scoped_ptr<gfx::ImageSkia> image);
3726d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
3736d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // Moves custom wallpapers from |user_id| directory to |user_id_hash|
3746d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // directory.
3756d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  static void MoveCustomWallpapersOnWorker(
3766d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      const std::string& user_id,
3776d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      const std::string& user_id_hash,
3786d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      base::WeakPtr<WallpaperManager> weak_ptr);
3796d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
3806d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // Gets |user_id|'s custom wallpaper at |wallpaper_path|. Falls back on
3816d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // original custom wallpaper. When |update_wallpaper| is true, sets wallpaper
3826d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // to the loaded wallpaper. Must run on wallpaper sequenced worker thread.
3836d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  static void GetCustomWallpaperInternal(
3846d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      const std::string& user_id,
3856d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      const WallpaperInfo& info,
3866d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      const base::FilePath& wallpaper_path,
3876d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      bool update_wallpaper,
3886d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      MovableOnDestroyCallbackHolder on_finish,
3896d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      base::WeakPtr<WallpaperManager> weak_ptr);
3906d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
3916d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // Resize and save customized default wallpaper.
3926d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  static void ResizeCustomizedDefaultWallpaper(
3936d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      scoped_ptr<gfx::ImageSkia> image,
394116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      const user_manager::UserImage::RawImage& raw_image,
3956d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      const CustomizedWallpaperRescaledFiles* rescaled_files,
3966d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      bool* success,
3976d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      gfx::ImageSkia* small_wallpaper_image,
3986d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      gfx::ImageSkia* large_wallpaper_image);
3996d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
4005c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Initialize wallpaper for the specified user to default and saves this
4015c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // settings in local state.
4025c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  void InitInitialUserWallpaper(const std::string& user_id, bool is_persistent);
4035c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
4045c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Set wallpaper to |user_image| controlled by policy.  (Takes a UserImage
4055c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // because that's the callback interface provided by UserImageLoader.)
406a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void SetPolicyControlledWallpaper(const std::string& user_id,
407116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                    const user_manager::UserImage& user_image);
408a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
4095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Gets encoded wallpaper from cache. Returns true if success.
4105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  bool GetWallpaperFromCache(const std::string& user_id, gfx::ImageSkia* image);
4115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The number of wallpapers have loaded. For test only.
4132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int loaded_wallpapers() const { return loaded_wallpapers_; }
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Cache some (or all) logged in users' wallpapers to memory at login
4162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // screen. It should not compete with first wallpaper loading when boot
4172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // up/initialize login WebUI page.
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // There are two ways the first wallpaper might be loaded:
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // 1. Loaded on boot. Login WebUI waits for it.
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // 2. When flag --disable-boot-animation is passed. Login WebUI is loaded
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // right away and in 500ms after. Wallpaper started to load.
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // For case 2, should_cache_wallpaper_ is used to indicate if we need to
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // cache wallpapers on wallpaper animation finished. The cache operation
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // should be only executed once.
4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void CacheUsersWallpapers();
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Caches |user_id|'s wallpaper to memory.
4285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void CacheUserWallpaper(const std::string& user_id);
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Clears disposable ONLINE and CUSTOM wallpaper cache. At multi profile
4315c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // world, logged in users' wallpaper cache is not disposable.
4325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  void ClearDisposableWallpaperCache();
4335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Clears all obsolete wallpaper prefs from old version wallpaper pickers.
4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void ClearObsoleteWallpaperPrefs();
4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Deletes all |user_id| related custom wallpapers and directories.
4385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void DeleteUserWallpapers(const std::string& user_id,
4394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                            const std::string& path_to_file);
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
441a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // Gets the CommandLine representing the current process's command line.
442c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  base::CommandLine* GetCommandLine();
443a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
4442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Initialize wallpaper of registered device after device policy is trusted.
4452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Note that before device is enrolled, it proceeds with untrusted setting.
4462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void InitializeRegisteredDeviceWallpaper();
4472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Loads |user_id|'s wallpaper. When |update_wallpaper| is true, sets
4495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // wallpaper to the loaded wallpaper.
4505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void LoadWallpaper(const std::string& user_id,
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     const WallpaperInfo& info,
4525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                     bool update_wallpaper,
4535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                     MovableOnDestroyCallbackHolder on_finish);
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Called when the original custom wallpaper is moved to the new place.
4564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Updates the corresponding user wallpaper info.
4575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void MoveCustomWallpapersSuccess(const std::string& user_id,
4584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                   const std::string& user_id_hash);
4594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
4604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Moves custom wallpaper to a new place. Email address was used as directory
4614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // name in the old system, this is not safe. New directory system uses
4625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // user_id_hash instead of user_id. This must be called after user_id_hash is
4634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // ready.
4644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  void MoveLoggedInUserCustomWallpaper();
4654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
4665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Gets wallpaper information of |user_id| from Local State or memory. Returns
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // false if wallpaper information is not found.
468a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  bool GetUserWallpaperInfo(const std::string& user_id,
469a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                            WallpaperInfo* info) const;
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sets wallpaper to the decoded wallpaper if |update_wallpaper| is true.
4725c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Otherwise, cache wallpaper to memory if not logged in.  (Takes a UserImage
4735c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // because that's the callback interface provided by UserImageLoader.)
4745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void OnWallpaperDecoded(const std::string& user_id,
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          ash::WallpaperLayout layout,
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          bool update_wallpaper,
4775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                          MovableOnDestroyCallbackHolder on_finish,
478116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                          const user_manager::UserImage& user_image);
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Creates new PendingWallpaper request (or updates currently pending).
4815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void ScheduleSetUserWallpaper(const std::string& user_id, bool delayed);
4825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Sets wallpaper to default.
4845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void DoSetDefaultWallpaper(
4855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      const std::string& user_id,
4865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      MovableOnDestroyCallbackHolder on_finish);
4875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Starts to load wallpaper at |wallpaper_path|. If |wallpaper_path| is the
4892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // same as |current_wallpaper_path_|, do nothing. Must be called on UI thread.
4905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void StartLoad(const std::string& user_id,
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 const WallpaperInfo& info,
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 bool update_wallpaper,
4935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                 const base::FilePath& wallpaper_path,
4945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                 MovableOnDestroyCallbackHolder on_finish);
4955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // After completed load operation, update average load time.
4975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void SaveLastLoadTime(const base::TimeDelta elapsed);
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4995c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Notify all registered observers.
500f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  void NotifyAnimationFinished();
501f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
5025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Returns modifiable PendingWallpaper.
5035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Returns pending_inactive_ or creates new PendingWallpaper if necessary.
5045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  PendingWallpaper* GetPendingWallpaper(const std::string& user_id,
5055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                        bool delayed);
5065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
507cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // This is called by PendingWallpaper when load is finished.
508cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  void RemovePendingWallpaperFromList(PendingWallpaper* pending);
509cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
5105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Calculate delay for next wallpaper load.
5115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // It is usually average wallpaper load time.
5125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // If last wallpaper load happened long ago, timeout should be reduced by
5135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // the time passed after last wallpaper load. So usual user experience results
5145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // in zero delay.
5155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::TimeDelta GetWallpaperLoadDelay() const;
5165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
5170529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // This is called after we check that supplied default wallpaper files exist.
5180529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  void SetCustomizedDefaultWallpaperAfterCheck(
5190529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      const GURL& wallpaper_url,
5200529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      const base::FilePath& downloaded_file,
5210529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      scoped_ptr<CustomizedWallpaperRescaledFiles> rescaled_files);
5220529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
5230529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // Starts rescaling of customized wallpaper.
5240529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  void OnCustomizedDefaultWallpaperDecoded(
5250529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      const GURL& wallpaper_url,
5260529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      scoped_ptr<CustomizedWallpaperRescaledFiles> rescaled_files,
527116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      const user_manager::UserImage& user_image);
5280529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
5290529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // Check the result of ResizeCustomizedDefaultWallpaper and finally
5300529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // apply Customized Default Wallpaper.
5310529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  void OnCustomizedDefaultWallpaperResized(
5320529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      const GURL& wallpaper_url,
5330529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      scoped_ptr<CustomizedWallpaperRescaledFiles> rescaled_files,
5340529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      scoped_ptr<bool> success,
5350529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      scoped_ptr<gfx::ImageSkia> small_wallpaper_image,
5360529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      scoped_ptr<gfx::ImageSkia> large_wallpaper_image);
5370529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
538c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // Init |*default_*_wallpaper_file_| from given command line and
539c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // clear |default_wallpaper_image_|.
540c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  void SetDefaultWallpaperPathsFromCommandLine(base::CommandLine* command_line);
541c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
542c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // Sets wallpaper to decoded default.
543c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  void OnDefaultWallpaperDecoded(const base::FilePath& path,
544c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                                 const ash::WallpaperLayout layout,
545116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                 scoped_ptr<user_manager::UserImage>* result,
546c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                                 MovableOnDestroyCallbackHolder on_finish,
547116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                 const user_manager::UserImage& user_image);
548c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
549c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // Start decoding given default wallpaper.
550116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  void StartLoadAndSetDefaultWallpaper(
551116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      const base::FilePath& path,
552116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      const ash::WallpaperLayout layout,
553116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      MovableOnDestroyCallbackHolder on_finish,
554116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      scoped_ptr<user_manager::UserImage>* result_out);
555c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
556c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // Returns wallpaper subdirectory name for current resolution.
557c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  const char* GetCustomWallpaperSubdirForCurrentResolution();
558c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
559cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Init default_wallpaper_image_ with 1x1 image of default color.
560cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  void CreateSolidDefaultWallpaper();
561cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
5622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The number of loaded wallpapers.
5632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int loaded_wallpapers_;
5642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Sequence token associated with wallpaper operations.
5662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::SequencedWorkerPool::SequenceToken sequence_token_;
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Wallpaper sequenced task runner.
5692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<base::SequencedTaskRunner> task_runner_;
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The file path of current loaded/loading custom/online wallpaper.
5722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath current_wallpaper_path_;
5732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Loads user wallpaper from its file.
5752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<UserImageLoader> wallpaper_loader_;
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Logged-in user wallpaper information.
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WallpaperInfo current_user_wallpaper_info_;
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
580a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // If non-NULL, used in place of the real command line.
581a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  base::CommandLine* command_line_for_testing_;
582a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Caches wallpapers of users. Accessed only on UI thread.
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CustomWallpaperMap wallpaper_cache_;
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The last selected user on user pod row.
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string last_selected_user_;
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool should_cache_wallpaper_;
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
59168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  scoped_ptr<CrosSettings::ObserverSubscription>
59268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      show_user_name_on_signin_subscription_;
59368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::NotificationRegistrar registrar_;
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
596f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ObserverList<Observer> observers_;
597f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
5985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // These members are for the scheduler:
5995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
6005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // When last load attempt finished.
6015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::Time last_load_finished_at_;
6025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
6035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // last N wallpaper loads times.
6045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  std::deque<base::TimeDelta> last_load_times_;
6055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
6065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Pointer to last inactive (waiting) entry of 'loading_' list.
6075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // NULL when there is no inactive request.
6085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  PendingWallpaper* pending_inactive_;
6095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
6105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Owns PendingWallpaper.
6115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // PendingWallpaper deletes itself from here on load complete.
6125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // All pending will be finally deleted on destroy.
6135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  typedef std::vector<scoped_refptr<PendingWallpaper> > PendingList;
6145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  PendingList loading_;
6155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
616c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  base::FilePath default_small_wallpaper_file_;
617c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  base::FilePath default_large_wallpaper_file_;
618c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
619c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  base::FilePath guest_small_wallpaper_file_;
620c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  base::FilePath guest_large_wallpaper_file_;
621c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
622c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // Current decoded default image is stored in cache.
623116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  scoped_ptr<user_manager::UserImage> default_wallpaper_image_;
624c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
6251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  base::WeakPtrFactory<WallpaperManager> weak_factory_;
6261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(WallpaperManager);
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace chromeos
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
632cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#endif  // CHROME_BROWSER_CHROMEOS_LOGIN_USERS_WALLPAPER_WALLPAPER_MANAGER_H_
633