blob: 7e0ccf342d8576cc9a36b0344a62bd7b73fd9e34 [file] [log] [blame]
// 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_EASY_UNLOCK_SCREENLOCK_STATE_HANDLER_H_
#define CHROME_BROWSER_SIGNIN_EASY_UNLOCK_SCREENLOCK_STATE_HANDLER_H_
#include <string>
#include "base/strings/string16.h"
#include "chrome/browser/signin/screenlock_bridge.h"
class PrefService;
// Profile specific class responsible for updating screenlock UI for the user
// associated with the profile when their Easy Unlock state changes.
class EasyUnlockScreenlockStateHandler : public ScreenlockBridge::Observer {
public:
// Available Easy Unlock states.
enum State {
// Easy Unlock is not enabled, or the screen is not locked.
STATE_INACTIVE,
// Bluetooth is not on.
STATE_NO_BLUETOOTH,
// Easy Unlock is in process of turning on Bluetooth.
STATE_BLUETOOTH_CONNECTING,
// No phones eligible to unlock the device can be found.
STATE_NO_PHONE,
// A phone eligible to unlock the device is found, but cannot be
// authenticated.
STATE_PHONE_NOT_AUTHENTICATED,
// A phone eligible to unlock the device is found, but it's locked.
STATE_PHONE_LOCKED,
// A phone eligible to unlock the device is found, but does not have lock
// screen enabled.
STATE_PHONE_UNLOCKABLE,
// An Easy Unlock enabled phone is found, but it is not allowed to unlock
// the device because it does not support reporting it's lock screen state.
STATE_PHONE_UNSUPPORTED,
// A phone eligible to unlock the device is found, but its received signal
// strength is too low, i.e. the phone is roughly more than 30 feet away,
// and therefore is not allowed to unlock the device.
STATE_RSSI_TOO_LOW,
// A phone eligible to unlock the device is found, but the local device's
// transmission power is too high, indicating that the phone is (probably)
// more than 1 foot away, and therefore is not allowed to unlock the device.
STATE_TX_POWER_TOO_HIGH,
// The device can be unlocked using Easy Unlock.
STATE_AUTHENTICATED
};
// Hard lock states.
enum HardlockState {
NO_HARDLOCK = 0, // Hard lock is not enforced. This is default.
USER_HARDLOCK = 1 << 0, // Hard lock is requested by user.
PAIRING_CHANGED = 1 << 1, // Hard lock because pairing data is changed.
NO_PAIRING = 1 << 2, // Hard lock because there is no pairing data.
LOGIN_FAILED = 1 << 3, // Transient hard lock caused by login attempt
// failure. Reset when screen is unlocked.
PAIRING_ADDED = 1 << 4, // Similar to PAIRING_CHANGED when it happens
// on a new Chromebook.
};
// |user_email|: The email for the user associated with the profile to which
// this class is attached.
// |initial_hardlock_state|: The initial hardlock state.
// |screenlock_bridge|: The screenlock bridge used to update the screen lock
// state.
EasyUnlockScreenlockStateHandler(const std::string& user_email,
HardlockState initial_hardlock_state,
ScreenlockBridge* screenlock_bridge);
~EasyUnlockScreenlockStateHandler() override;
// Returns true if handler is not in INACTIVE state.
bool IsActive() const;
// Whether the handler is in state that is allowed just after auth failure
// (i.e. the state that would cause auth failure rather than one caused by an
// auth failure).
bool InStateValidOnRemoteAuthFailure() const;
// Changes internal state to |new_state| and updates the user's screenlock
// accordingly.
void ChangeState(State new_state);
// Updates the screenlock state.
void SetHardlockState(HardlockState new_state);
// Shows the hardlock UI if the hardlock_state_ is not NO_HARDLOCK.
void MaybeShowHardlockUI();
// Marks the current screenlock state as the one for trial Easy Unlock run.
void SetTrialRun();
State state() const { return state_; }
private:
// ScreenlockBridge::Observer:
void OnScreenDidLock() override;
void OnScreenDidUnlock() override;
void OnFocusedUserChanged(const std::string& user_id) override;
// Forces refresh of the Easy Unlock screenlock UI.
void RefreshScreenlockState();
void ShowHardlockUI();
// Updates icon's tooltip options.
// |trial_run|: Whether the trial Easy Unlock run is in progress.
void UpdateTooltipOptions(
bool trial_run,
ScreenlockBridge::UserPodCustomIconOptions* icon_options);
// Gets the name to be used for the device. The name depends on the device
// type (example values: Chromebook and Chromebox).
base::string16 GetDeviceName();
// Updates the screenlock auth type if it has to be changed.
void UpdateScreenlockAuthType();
State state_;
std::string user_email_;
ScreenlockBridge* screenlock_bridge_;
// State of hardlock.
HardlockState hardlock_state_;
bool hardlock_ui_shown_;
// Whether this is the trial Easy Unlock run. If this is the case, a
// tutorial message should be shown and hard-locking be disabled. The trial
// run should be set if the screen was locked by the Easy Unlock setup app.
bool is_trial_run_;
DISALLOW_COPY_AND_ASSIGN(EasyUnlockScreenlockStateHandler);
};
#endif // CHROME_BROWSER_SIGNIN_EASY_UNLOCK_SCREENLOCK_STATE_HANDLER_H_