1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174
|
// Copyright 2014 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_SIGNIN_SCREENLOCK_BRIDGE_H_
#define CHROME_BROWSER_SIGNIN_SCREENLOCK_BRIDGE_H_
#include <string>
#include "base/basictypes.h"
#include "base/lazy_instance.h"
#include "base/macros.h"
#include "base/memory/scoped_ptr.h"
#include "base/observer_list.h"
#include "base/strings/string16.h"
#include "base/values.h"
class Profile;
// ScreenlockBridge brings together the screenLockPrivate API and underlying
// support. On ChromeOS, it delegates calls to the ScreenLocker. On other
// platforms, it delegates calls to UserManagerUI (and friends).
// TODO(tbarzic): Rename ScreenlockBridge to SignInScreenBridge, as this is not
// used solely for the lock screen anymore.
class ScreenlockBridge {
public:
class Observer {
public:
// Invoked after the screen is locked.
virtual void OnScreenDidLock() = 0;
// Invoked after the screen lock is dismissed.
virtual void OnScreenDidUnlock() = 0;
// Invoked when the user focused on the lock screen changes.
virtual void OnFocusedUserChanged(const std::string& user_id) = 0;
protected:
virtual ~Observer() {}
};
// User pod icons supported by lock screen / signin screen UI.
enum UserPodCustomIcon {
USER_POD_CUSTOM_ICON_NONE,
USER_POD_CUSTOM_ICON_HARDLOCKED,
USER_POD_CUSTOM_ICON_LOCKED,
USER_POD_CUSTOM_ICON_LOCKED_TO_BE_ACTIVATED,
// TODO(isherman): The "locked with proximity hint" icon is currently the
// same as the "locked" icon. It's treated as a separate case to allow an
// easy asset swap without changing the code, in case we decide to use a
// different icon for this case. If we definitely decide against that, then
// this enum entry should be removed.
USER_POD_CUSTOM_ICON_LOCKED_WITH_PROXIMITY_HINT,
USER_POD_CUSTOM_ICON_UNLOCKED,
USER_POD_CUSTOM_ICON_SPINNER
};
// Class containing parameters describing the custom icon that should be
// shown on a user's screen lock pod next to the input field.
class UserPodCustomIconOptions {
public:
UserPodCustomIconOptions();
~UserPodCustomIconOptions();
// Converts parameters to a dictionary values that can be sent to the
// screenlock web UI.
scoped_ptr<base::DictionaryValue> ToDictionaryValue() const;
// Sets the icon that should be shown in the UI.
void SetIcon(UserPodCustomIcon icon);
// Sets the icon tooltip. If |autoshow| is set the tooltip is automatically
// shown with the icon.
void SetTooltip(const base::string16& tooltip, bool autoshow);
// Sets the accessibility label of the icon. If this attribute is not
// provided, then the tooltip will be used.
void SetAriaLabel(const base::string16& aria_label);
// If hardlock on click is set, clicking the icon in the screenlock will
// go to state where password is required for unlock.
void SetHardlockOnClick();
private:
UserPodCustomIcon icon_;
base::string16 tooltip_;
bool autoshow_tooltip_;
base::string16 aria_label_;
bool hardlock_on_click_;
DISALLOW_COPY_AND_ASSIGN(UserPodCustomIconOptions);
};
class LockHandler {
public:
// Supported authentication types. Keep in sync with the enum in
// user_pod_row.js.
enum AuthType {
OFFLINE_PASSWORD = 0,
ONLINE_SIGN_IN = 1,
NUMERIC_PIN = 2,
USER_CLICK = 3,
EXPAND_THEN_USER_CLICK = 4,
FORCE_OFFLINE_PASSWORD = 5
};
// Displays |message| in a banner on the lock screen.
virtual void ShowBannerMessage(const base::string16& message) = 0;
// Shows a custom icon in the user pod on the lock screen.
virtual void ShowUserPodCustomIcon(
const std::string& user_email,
const UserPodCustomIconOptions& icon) = 0;
// Hides the custom icon in user pod for a user.
virtual void HideUserPodCustomIcon(const std::string& user_email) = 0;
// (Re)enable lock screen UI.
virtual void EnableInput() = 0;
// Set the authentication type to be used on the lock screen.
virtual void SetAuthType(const std::string& user_email,
AuthType auth_type,
const base::string16& auth_value) = 0;
// Returns the authentication type used for a user.
virtual AuthType GetAuthType(const std::string& user_email) const = 0;
// Unlock from easy unlock app for a user.
virtual void Unlock(const std::string& user_email) = 0;
// Attempts to login the user using an easy unlock key.
virtual void AttemptEasySignin(const std::string& user_email,
const std::string& secret,
const std::string& key_label) = 0;
protected:
virtual ~LockHandler() {}
};
static ScreenlockBridge* Get();
static std::string GetAuthenticatedUserEmail(Profile* profile);
void SetLockHandler(LockHandler* lock_handler);
void SetFocusedUser(const std::string& user_id);
bool IsLocked() const;
void Lock(Profile* profile);
void Unlock(Profile* profile);
void AddObserver(Observer* observer);
void RemoveObserver(Observer* observer);
LockHandler* lock_handler() { return lock_handler_; }
std::string focused_user_id() const { return focused_user_id_; }
private:
friend struct base::DefaultLazyInstanceTraits<ScreenlockBridge>;
friend struct base::DefaultDeleter<ScreenlockBridge>;
ScreenlockBridge();
~ScreenlockBridge();
LockHandler* lock_handler_; // Not owned
// The last focused user's id.
std::string focused_user_id_;
ObserverList<Observer, true> observers_;
DISALLOW_COPY_AND_ASSIGN(ScreenlockBridge);
};
#endif // CHROME_BROWSER_SIGNIN_SCREENLOCK_BRIDGE_H_
|