// Copyright (c) 2011 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef CHROME_BROWSER_CHROMEOS_LOGIN_USER_MANAGER_H_ #define CHROME_BROWSER_CHROMEOS_LOGIN_USER_MANAGER_H_ #pragma once #include #include #include "base/basictypes.h" #include "base/hash_tables.h" #include "base/memory/ref_counted.h" #include "base/synchronization/lock.h" #include "chrome/browser/chromeos/login/user_image_loader.h" #include "content/common/notification_observer.h" #include "content/common/notification_registrar.h" #include "third_party/skia/include/core/SkBitmap.h" class FilePath; class PrefService; namespace base { template struct DefaultLazyInstanceTraits; } namespace chromeos { class RemoveUserDelegate; // This class provides a mechanism for discovering users who have logged // into this chromium os device before and updating that list. class UserManager : public UserImageLoader::Delegate, public NotificationObserver { public: // A class representing information about a previously logged in user. class User { public: User(); ~User(); // The email the user used to log in. void set_email(const std::string& email) { email_ = email; } const std::string& email() const { return email_; } // Returns the name to display for this user. std::string GetDisplayName() const; // Tooltip contains user's display name and his email domain to distinguish // this user from the other one with the same display name. std::string GetNameTooltip() const; // The image for this user. void set_image(const SkBitmap& image) { image_ = image; } const SkBitmap& image() const { return image_; } private: std::string email_; SkBitmap image_; }; // Gets a shared instance of a UserManager. Not thread-safe...should // only be called from the main UI thread. static UserManager* Get(); // Registers user manager preferences. static void RegisterPrefs(PrefService* local_state); // Returns a list of the users who have logged into this device previously. // It is sorted in order of recency, with most recent at the beginning. virtual std::vector GetUsers() const; // Indicates that user just started incognito session. virtual void OffTheRecordUserLoggedIn(); // Indicates that a user with the given email has just logged in. // The persistent list will be updated accordingly. virtual void UserLoggedIn(const std::string& email); // Removes the user from the device. Note, it will verify that the given user // isn't the owner, so calling this method for the owner will take no effect. // Note, |delegate| can be NULL. virtual void RemoveUser(const std::string& email, RemoveUserDelegate* delegate); // Removes the user from the persistent list only. Also removes the user's // picture. virtual void RemoveUserFromList(const std::string& email); // Returns true if given user has logged into the device before. virtual bool IsKnownUser(const std::string& email); // Returns the logged-in user. virtual const User& logged_in_user() const; // Sets image for logged-in user and sends LOGIN_USER_IMAGE_CHANGED // notification about the image changed via NotificationService. void SetLoggedInUserImage(const SkBitmap& image); // Tries to load logged-in user image from disk and sets it for the user. void LoadLoggedInUserImage(const FilePath& path); // Saves image to file and saves image path in local state preferences. void SaveUserImage(const std::string& username, const SkBitmap& image); // Saves user image path for the user. Can be used to set default images. void SaveUserImagePath(const std::string& username, const std::string& image_path); // Returns the index of user's default image or -1 if the image is not // default. int GetUserDefaultImageIndex(const std::string& username); // chromeos::UserImageLoader::Delegate implementation. virtual void OnImageLoaded(const std::string& username, const SkBitmap& image, bool save_image); // NotificationObserver implementation. virtual void Observe(NotificationType type, const NotificationSource& source, const NotificationDetails& details); // Accessor for current_user_is_owner_ virtual bool current_user_is_owner() const; virtual void set_current_user_is_owner(bool current_user_is_owner); // Accessor for current_user_is_new_. bool current_user_is_new() const { return current_user_is_new_; } bool user_is_logged_in() const { return user_is_logged_in_; } // Returns true if we're logged in as a Guest. bool IsLoggedInAsGuest() const; protected: UserManager(); virtual ~UserManager(); // Returns image filepath for the given user. FilePath GetImagePathForUser(const std::string& username); private: // Notifies on new user session. void NotifyOnLogin(); // Sets one of the default images to the specified user and saves this // setting in local state. void SetDefaultUserImage(const std::string& username); // Loads user image from its file. scoped_refptr image_loader_; // Cache for user images. Stores image for each username. typedef base::hash_map UserImages; mutable UserImages user_images_; // The logged-in user. User logged_in_user_; // Cached flag of whether currently logged-in user is owner or not. // May be accessed on different threads, requires locking. bool current_user_is_owner_; mutable base::Lock current_user_is_owner_lock_; // Cached flag of whether the currently logged-in user existed before this // login. bool current_user_is_new_; // Cached flag of whether any user is logged in at the moment. bool user_is_logged_in_; NotificationRegistrar registrar_; friend struct base::DefaultLazyInstanceTraits; DISALLOW_COPY_AND_ASSIGN(UserManager); }; typedef std::vector UserVector; } // namespace chromeos #endif // CHROME_BROWSER_CHROMEOS_LOGIN_USER_MANAGER_H_