Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(65)

Side by Side Diff: chrome/browser/chromeos/login/user_image_manager_impl.h

Issue 286933002: [cros login] Split login related classes into subfolders. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: fix includes in new tests Created 6 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(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_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698