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_AVATAR_USER_IMAGE_MANAGER_H_
6cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#define CHROME_BROWSER_CHROMEOS_LOGIN_USERS_AVATAR_USER_IMAGE_MANAGER_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "components/user_manager/user.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class PrefRegistrySimple;
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace base {
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FilePath;
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gfx {
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ImageSkia;
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace user_manager {
23116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass UserImage;
24116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
25116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace chromeos {
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)class UserImageSyncObserver;
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Base class that provides a mechanism for updating user images.
315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// There is an instance of this class for each user in the system.
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class UserImageManager {
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Registers user image manager preferences.
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static void RegisterPrefs(PrefRegistrySimple* registry);
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  explicit UserImageManager(const std::string& user_id);
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~UserImageManager();
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Loads user image data from Local State.
415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void LoadUserImage() = 0;
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Indicates that a user has just logged in.
445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void UserLoggedIn(bool user_is_new, bool user_is_local) = 0;
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sets user image to the default image with index |image_index|, sends
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // LOGIN_USER_IMAGE_CHANGED notification and updates Local State.
485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void SaveUserDefaultImageIndex(int image_index) = 0;
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Saves image to file, sends LOGIN_USER_IMAGE_CHANGED notification and
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // updates Local State.
52116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual void SaveUserImage(const user_manager::UserImage& user_image) = 0;
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Tries to load user image from disk; if successful, sets it for the user,
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // sends LOGIN_USER_IMAGE_CHANGED notification and updates Local State.
565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void SaveUserImageFromFile(const base::FilePath& path) = 0;
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Sets profile image as user image for the user, sends
595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // LOGIN_USER_IMAGE_CHANGED notification and updates Local State. If
605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // the user is not logged-in or the last |DownloadProfileImage| call
615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // has failed, a default grey avatar will be used until the user logs
625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // in and profile image is downloaded successfully.
635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void SaveUserImageFromProfileImage() = 0;
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Deletes user image and the corresponding image file.
665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void DeleteUserImage() = 0;
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Starts downloading the profile image for the user.  If user's image
695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // index is |USER_IMAGE_PROFILE|, newly downloaded image is immediately
705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // set as user's current picture.  |reason| is an arbitrary string
715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // (used to report UMA histograms with download times).
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void DownloadProfileImage(const std::string& reason) = 0;
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the result of the last successful profile image download, if any.
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Otherwise, returns an empty bitmap.
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual const gfx::ImageSkia& DownloadedProfileImage() const = 0;
773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Returns sync observer attached to the user. Returns NULL if current
793551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // user can't sync images or user is not logged in.
803551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  virtual UserImageSyncObserver* GetSyncObserver() const = 0;
813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Unregisters preference observers before browser process shutdown.
8358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Also cancels any profile image download in progress.
843551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  virtual void Shutdown() = 0;
855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Invoked when an external data reference is set for the user.
875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void OnExternalDataSet(const std::string& policy) = 0;
885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Invoked when the external data reference is cleared for the user.
905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void OnExternalDataCleared(const std::string& policy) = 0;
915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Invoked when the external data referenced for the user has been
935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // fetched.  Failed fetches are retried and the method is called only
945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // when a fetch eventually succeeds. If a fetch fails permanently
955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // (e.g. because the external data reference specifies an invalid URL),
965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // the method is not called at all.
975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void OnExternalDataFetched(const std::string& policy,
985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                     scoped_ptr<std::string> data) = 0;
995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) protected:
1015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const std::string& user_id() const { return user_id_; }
1025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // ID of user which images are managed by current instance of
1045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // UserImageManager.
1055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const std::string user_id_;
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace chromeos
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
110cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#endif  // CHROME_BROWSER_CHROMEOS_LOGIN_USERS_AVATAR_USER_IMAGE_MANAGER_H_
111