1// Copyright (c) 2012 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_FLOW_H_
6#define CHROME_BROWSER_CHROMEOS_LOGIN_USER_FLOW_H_
7
8#include "base/compiler_specific.h"
9#include "chrome/browser/profiles/profile.h"
10#include "chromeos/login/auth/auth_status_consumer.h"
11#include "components/user_manager/user.h"
12
13namespace chromeos {
14
15class UserContext;
16
17class LoginDisplayHost;
18// Defines possible variants of user flow upon logging in.
19// See UserManager::SetUserFlow for usage contract.
20class UserFlow {
21 public:
22  UserFlow();
23  virtual ~UserFlow() = 0;
24  // Indicates if screen locking should be enabled or disabled for a flow.
25  virtual bool CanLockScreen() = 0;
26  virtual bool ShouldShowSettings() = 0;
27  virtual bool ShouldLaunchBrowser() = 0;
28  virtual bool ShouldSkipPostLoginScreens() = 0;
29  virtual bool SupportsEarlyRestartToApplyFlags() = 0;
30  virtual bool HandleLoginFailure(const AuthFailure& failure) = 0;
31  virtual void HandleLoginSuccess(const UserContext& context) = 0;
32  virtual bool HandlePasswordChangeDetected() = 0;
33  virtual void HandleOAuthTokenStatusChange(
34      user_manager::User::OAuthTokenStatus status) = 0;
35  virtual void LaunchExtraSteps(Profile* profile) = 0;
36
37  void set_host(LoginDisplayHost* host) {
38    host_ = host;
39  }
40
41  LoginDisplayHost* host() {
42    return host_;
43  }
44
45 private:
46  LoginDisplayHost* host_;
47};
48
49// UserFlow implementation for regular login flow.
50class DefaultUserFlow : public UserFlow {
51 public:
52  virtual ~DefaultUserFlow();
53
54  virtual bool CanLockScreen() OVERRIDE;
55  virtual bool ShouldShowSettings() OVERRIDE;
56  virtual bool ShouldLaunchBrowser() OVERRIDE;
57  virtual bool ShouldSkipPostLoginScreens() OVERRIDE;
58  virtual bool SupportsEarlyRestartToApplyFlags() OVERRIDE;
59  virtual bool HandleLoginFailure(const AuthFailure& failure) OVERRIDE;
60  virtual void HandleLoginSuccess(const UserContext& context) OVERRIDE;
61  virtual bool HandlePasswordChangeDetected() OVERRIDE;
62  virtual void HandleOAuthTokenStatusChange(
63      user_manager::User::OAuthTokenStatus status) OVERRIDE;
64  virtual void LaunchExtraSteps(Profile* profile) OVERRIDE;
65};
66
67// UserFlow stub for non-regular flows.
68class ExtendedUserFlow : public UserFlow {
69 public:
70  explicit ExtendedUserFlow(const std::string& user_id);
71  virtual ~ExtendedUserFlow();
72
73  virtual bool ShouldShowSettings() OVERRIDE;
74
75 protected:
76  // Subclasses can call this method to unregister flow in the next event.
77  virtual void UnregisterFlowSoon();
78  std::string user_id() {
79    return user_id_;
80  }
81
82 private:
83  std::string user_id_;
84};
85
86}  // namespace chromeos
87
88#endif  // CHROME_BROWSER_CHROMEOS_LOGIN_USER_FLOW_H_
89