| OLD | NEW |
| (Empty) |
| 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. | |
| 4 | |
| 5 #ifndef CHROME_BROWSER_CHROMEOS_LOGIN_USER_IMAGE_MANAGER_IMPL_H_ | |
| 6 #define CHROME_BROWSER_CHROMEOS_LOGIN_USER_IMAGE_MANAGER_IMPL_H_ | |
| 7 | |
| 8 #include <map> | |
| 9 #include <set> | |
| 10 #include <string> | |
| 11 | |
| 12 #include "base/basictypes.h" | |
| 13 #include "base/compiler_specific.h" | |
| 14 #include "base/memory/ref_counted.h" | |
| 15 #include "base/memory/scoped_ptr.h" | |
| 16 #include "base/memory/weak_ptr.h" | |
| 17 #include "base/time/time.h" | |
| 18 #include "base/timer/timer.h" | |
| 19 #include "base/values.h" | |
| 20 #include "chrome/browser/chromeos/login/user.h" | |
| 21 #include "chrome/browser/chromeos/login/user_image_loader.h" | |
| 22 #include "chrome/browser/chromeos/login/user_image_manager.h" | |
| 23 #include "chrome/browser/profiles/profile_downloader_delegate.h" | |
| 24 #include "ui/gfx/image/image_skia.h" | |
| 25 | |
| 26 class ProfileDownloader; | |
| 27 class UserImage; | |
| 28 | |
| 29 namespace base { | |
| 30 class FilePath; | |
| 31 class SequencedTaskRunner; | |
| 32 } | |
| 33 | |
| 34 namespace chromeos { | |
| 35 | |
| 36 class UserImageSyncObserver; | |
| 37 class UserManager; | |
| 38 | |
| 39 class UserImageManagerImpl | |
| 40 : public UserImageManager, | |
| 41 public ProfileDownloaderDelegate { | |
| 42 public: | |
| 43 // UserImageManager: | |
| 44 UserImageManagerImpl(const std::string& user_id, | |
| 45 UserManager* user_manager); | |
| 46 virtual ~UserImageManagerImpl(); | |
| 47 | |
| 48 virtual void LoadUserImage() OVERRIDE; | |
| 49 virtual void UserLoggedIn(bool user_is_new, bool user_is_local) OVERRIDE; | |
| 50 virtual void SaveUserDefaultImageIndex(int default_image_index) OVERRIDE; | |
| 51 virtual void SaveUserImage(const UserImage& user_image) OVERRIDE; | |
| 52 virtual void SaveUserImageFromFile(const base::FilePath& path) OVERRIDE; | |
| 53 virtual void SaveUserImageFromProfileImage() OVERRIDE; | |
| 54 virtual void DeleteUserImage() OVERRIDE; | |
| 55 virtual void DownloadProfileImage(const std::string& reason) OVERRIDE; | |
| 56 virtual const gfx::ImageSkia& DownloadedProfileImage() const OVERRIDE; | |
| 57 virtual UserImageSyncObserver* GetSyncObserver() const OVERRIDE; | |
| 58 virtual void Shutdown() OVERRIDE; | |
| 59 | |
| 60 virtual void OnExternalDataSet(const std::string& policy) OVERRIDE; | |
| 61 virtual void OnExternalDataCleared(const std::string& policy) OVERRIDE; | |
| 62 virtual void OnExternalDataFetched(const std::string& policy, | |
| 63 scoped_ptr<std::string> data) OVERRIDE; | |
| 64 | |
| 65 static void IgnoreProfileDataDownloadDelayForTesting(); | |
| 66 | |
| 67 private: | |
| 68 friend class UserImageManagerTest; | |
| 69 | |
| 70 // Every image load or update is encapsulated by a Job. Whenever an image load | |
| 71 // or update is requested for a user, the Job currently running for that user | |
| 72 // (if any) is canceled. This ensures that at most one Job is running per user | |
| 73 // at any given time. There are two further guarantees: | |
| 74 // | |
| 75 // * Changes to User objects and local state are performed on the thread that | |
| 76 // |this| runs on. | |
| 77 // * File writes and deletions are performed via |background_task_runner_|. | |
| 78 // | |
| 79 // With the above, it is guaranteed that any changes made by a canceled Job | |
| 80 // cannot race against against changes made by the superseding Job. | |
| 81 class Job; | |
| 82 | |
| 83 // ProfileDownloaderDelegate: | |
| 84 virtual bool NeedsProfilePicture() const OVERRIDE; | |
| 85 virtual int GetDesiredImageSideLength() const OVERRIDE; | |
| 86 virtual Profile* GetBrowserProfile() OVERRIDE; | |
| 87 virtual std::string GetCachedPictureURL() const OVERRIDE; | |
| 88 virtual void OnProfileDownloadSuccess(ProfileDownloader* downloader) OVERRIDE; | |
| 89 virtual void OnProfileDownloadFailure( | |
| 90 ProfileDownloader* downloader, | |
| 91 ProfileDownloaderDelegate::FailureReason reason) OVERRIDE; | |
| 92 | |
| 93 // Returns true if the user image for the user is managed by | |
| 94 // policy and the user is not allowed to change it. | |
| 95 bool IsUserImageManaged() const; | |
| 96 | |
| 97 // Randomly chooses one of the default images for the specified user, sends a | |
| 98 // LOGIN_USER_IMAGE_CHANGED notification and updates local state. | |
| 99 void SetInitialUserImage(); | |
| 100 | |
| 101 // Initializes the |downloaded_profile_image_| for the currently logged-in | |
| 102 // user to a profile image that had been downloaded and saved before if such | |
| 103 // a saved image is available and no updated image has been downloaded yet. | |
| 104 void TryToInitDownloadedProfileImage(); | |
| 105 | |
| 106 // Returns true if the profile image needs to be downloaded. This is the case | |
| 107 // when a GAIA user is logged in and at least one of the following applies: | |
| 108 // * The profile image has explicitly been requested by a call to | |
| 109 // DownloadProfileImage() and has not been successfully downloaded since. | |
| 110 // * The user's user image is the profile image. | |
| 111 bool NeedProfileImage() const; | |
| 112 | |
| 113 // Downloads the profile data for the currently logged-in user. The user's | |
| 114 // full name and, if NeedProfileImage() is true, the profile image are | |
| 115 // downloaded. |reason| is an arbitrary string (used to report UMA histograms | |
| 116 // with download times). | |
| 117 void DownloadProfileData(const std::string& reason); | |
| 118 | |
| 119 // Removes ther user from the dictionary |prefs_dict_root| in | |
| 120 // local state and deletes the image file that the dictionary | |
| 121 // referenced for that user. | |
| 122 void DeleteUserImageAndLocalStateEntry(const char* prefs_dict_root); | |
| 123 | |
| 124 // Called when a Job updates the copy of the user image held in | |
| 125 // memory. Allows |this| to update |downloaded_profile_image_| and | |
| 126 // send a NOTIFICATION_LOGIN_USER_IMAGE_CHANGED notification. | |
| 127 void OnJobChangedUserImage(); | |
| 128 | |
| 129 // Called when a Job for the user finishes. If a migration was | |
| 130 // required for the user, the migration is now complete and the old | |
| 131 // image file for that user, if any, is deleted. | |
| 132 void OnJobDone(); | |
| 133 | |
| 134 // Completes migration by removing the user from the old prefs | |
| 135 // dictionary. | |
| 136 void UpdateLocalStateAfterMigration(); | |
| 137 | |
| 138 // Create a sync observer if a user is logged in, the user's user image is | |
| 139 // allowed to be synced and no sync observer exists yet. | |
| 140 void TryToCreateImageSyncObserver(); | |
| 141 | |
| 142 // Returns immutable version of user with |user_id_|. | |
| 143 const User* GetUser() const; | |
| 144 | |
| 145 // Returns mutable version of user with |user_id_|. | |
| 146 User* GetUserAndModify() const; | |
| 147 | |
| 148 // Returns true if user with |user_id_| is logged in and a regular user. | |
| 149 bool IsUserLoggedInAndRegular() const; | |
| 150 | |
| 151 // The user manager. | |
| 152 UserManager* user_manager_; | |
| 153 | |
| 154 // Loader for JPEG user images. | |
| 155 scoped_refptr<UserImageLoader> image_loader_; | |
| 156 | |
| 157 // Unsafe loader instance for all user images formats. | |
| 158 scoped_refptr<UserImageLoader> unsafe_image_loader_; | |
| 159 | |
| 160 // Whether the |profile_downloader_| is downloading the profile image for the | |
| 161 // currently logged-in user (and not just the full name). Only valid when a | |
| 162 // download is currently in progress. | |
| 163 bool downloading_profile_image_; | |
| 164 | |
| 165 // Download reason given to DownloadProfileImage(), used for UMA histograms. | |
| 166 // Only valid when a download is currently in progress and | |
| 167 // |downloading_profile_image_| is true. | |
| 168 std::string profile_image_download_reason_; | |
| 169 | |
| 170 // Time when the profile image download started. Only valid when a download is | |
| 171 // currently in progress and |downloading_profile_image_| is true. | |
| 172 base::TimeTicks profile_image_load_start_time_; | |
| 173 | |
| 174 // Downloader for the user's profile data. NULL when no download is | |
| 175 // currently in progress. | |
| 176 scoped_ptr<ProfileDownloader> profile_downloader_; | |
| 177 | |
| 178 // The currently logged-in user's downloaded profile image, if successfully | |
| 179 // downloaded or initialized from a previously downloaded and saved image. | |
| 180 gfx::ImageSkia downloaded_profile_image_; | |
| 181 | |
| 182 // Data URL corresponding to |downloaded_profile_image_|. Empty if no | |
| 183 // |downloaded_profile_image_| is currently available. | |
| 184 std::string downloaded_profile_image_data_url_; | |
| 185 | |
| 186 // URL from which |downloaded_profile_image_| was downloaded. Empty if no | |
| 187 // |downloaded_profile_image_| is currently available. | |
| 188 GURL profile_image_url_; | |
| 189 | |
| 190 // Whether a download of the currently logged-in user's profile image has been | |
| 191 // explicitly requested by a call to DownloadProfileImage() and has not been | |
| 192 // satisfied by a successful download yet. | |
| 193 bool profile_image_requested_; | |
| 194 | |
| 195 // Timer used to start a profile data download shortly after login and to | |
| 196 // restart the download after network errors. | |
| 197 base::OneShotTimer<UserImageManagerImpl> profile_download_one_shot_timer_; | |
| 198 | |
| 199 // Timer used to periodically start a profile data, ensuring the profile data | |
| 200 // stays up to date. | |
| 201 base::RepeatingTimer<UserImageManagerImpl> profile_download_periodic_timer_; | |
| 202 | |
| 203 // Sync observer for the currently logged-in user. | |
| 204 scoped_ptr<UserImageSyncObserver> user_image_sync_observer_; | |
| 205 | |
| 206 // Background task runner on which Jobs perform file I/O and the image | |
| 207 // decoders run. | |
| 208 scoped_refptr<base::SequencedTaskRunner> background_task_runner_; | |
| 209 | |
| 210 // The currently running job. | |
| 211 scoped_ptr<Job> job_; | |
| 212 | |
| 213 bool has_managed_image_; | |
| 214 bool user_needs_migration_; | |
| 215 | |
| 216 base::WeakPtrFactory<UserImageManagerImpl> weak_factory_; | |
| 217 | |
| 218 DISALLOW_COPY_AND_ASSIGN(UserImageManagerImpl); | |
| 219 }; | |
| 220 | |
| 221 } // namespace chromeos | |
| 222 | |
| 223 #endif // CHROME_BROWSER_CHROMEOS_LOGIN_USER_IMAGE_MANAGER_IMPL_H_ | |
| OLD | NEW |