signin_status_metrics_provider.h revision 1320f92c476a1ad9d19dba2a48c72b75566198e9
1// Copyright 2014 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_METRICS_SIGNIN_STATUS_METRICS_PROVIDER_H_
6#define CHROME_BROWSER_METRICS_SIGNIN_STATUS_METRICS_PROVIDER_H_
7
8#include <string>
9
10#include "base/gtest_prod_util.h"
11#include "base/memory/weak_ptr.h"
12#include "base/scoped_observer.h"
13#include "chrome/browser/signin/signin_manager_factory.h"
14#include "chrome/browser/ui/browser_list_observer.h"
15#include "components/metrics/metrics_provider.h"
16#include "components/signin/core/browser/signin_manager_base.h"
17
18class Browser;
19
20namespace base {
21class FilePath;
22}
23
24// Collect login status of all opened profiles during one UMA session and record
25// the value into a histogram before UMA log is uploaded. It's currently not
26// supported on platform chromeos, Android or iOS.
27class SigninStatusMetricsProvider : public metrics::MetricsProvider,
28                                    public chrome::BrowserListObserver,
29                                    public SigninManagerBase::Observer,
30                                    public SigninManagerFactory::Observer {
31 public:
32  virtual ~SigninStatusMetricsProvider();
33
34  // Record the collected sign-in status into a histogram and re-check current
35  // sign-in status to get prepared for the next UMA session. Called by
36  // MetricsServiceClient when it is collecting final metrics.
37  void RecordSigninStatusHistogram();
38
39  // Factory method, creates a new instance of this class.
40  static SigninStatusMetricsProvider* CreateInstance();
41
42 private:
43  // The boolean |is_test| indicates whether or not this is an instance for
44  // testing purpose. If so, skip the initialization. Except for testing
45  // purpose, this class's instance should be created through the static
46  // CreateInstance() method.
47  explicit SigninStatusMetricsProvider(bool is_test);
48
49  FRIEND_TEST_ALL_PREFIXES(SigninStatusMetricsProvider,
50                           UpdateInitialSigninStatus);
51  FRIEND_TEST_ALL_PREFIXES(SigninStatusMetricsProvider,
52                           UpdateStatusWhenBrowserAdded);
53  FRIEND_TEST_ALL_PREFIXES(SigninStatusMetricsProvider, GoogleSigninSucceeded);
54  FRIEND_TEST_ALL_PREFIXES(SigninStatusMetricsProvider, GoogleSignedOut);
55
56  // Possible sign-in status of all opened profiles during one UMA session. For
57  // MIXED_SIGNIN_STATUS, at least one signed-in profile and at least one
58  // unsigned-in profile were opened between two UMA log uploads.
59  enum ProfilesSigninStatus {
60    ALL_PROFILES_SIGNED_IN,
61    ALL_PROFILES_NOT_SIGNED_IN,
62    MIXED_SIGNIN_STATUS,
63    UNKNOWN_SIGNIN_STATUS,
64    ERROR_GETTING_SIGNIN_STATUS,
65    SIGNIN_STATUS_MAX,
66  };
67
68  // chrome::BrowserListObserver:
69  // This will never be called on Android.
70  virtual void OnBrowserAdded(Browser* browser) OVERRIDE;
71
72  // SigninManagerFactory::Observer:
73  virtual void SigninManagerCreated(SigninManagerBase* manager) OVERRIDE;
74  virtual void SigninManagerShutdown(SigninManagerBase* manager) OVERRIDE;
75
76  // SigninManagerBase::Observer:
77  virtual void GoogleSigninSucceeded(const std::string& account_id,
78                                     const std::string& username,
79                                     const std::string& password) OVERRIDE;
80  virtual void GoogleSignedOut(const std::string& account_id,
81                               const std::string& username) OVERRIDE;
82
83  // Obtain sign-in status and add observers.
84  void Initialize();
85
86  // Update the sign-in status based on all currently opened profiles. Called by
87  // ComputeCurrentSigninStatus at class construction and right after each UMA
88  // log upload. |total_count| is the number of opened profiles and
89  // |signed_in_count| represents the number of signed-in profiles among those
90  // |total_count| profiles.
91  void UpdateInitialSigninStatus(size_t total_count, size_t signed_in_count);
92
93  // Update the sign-in status right after a new browser is opened.
94  void UpdateStatusWhenBrowserAdded(bool signed_in);
95
96  // Compute current sign-in status of all opened profiles.
97  void ComputeCurrentSigninStatus();
98
99  // Sets the value of |signin_status_|. It ensures that |signin_status_| will
100  // not be changed if its value is already ERROR_GETTING_SIGNIN_STATUS.
101  void SetSigninStatus(ProfilesSigninStatus new_status);
102
103  // Get the current recorded sign-in status. For testing purpose only.
104  ProfilesSigninStatus GetSigninStatusForTesting();
105
106  // Sign-in status of all profiles seen so far.
107  ProfilesSigninStatus signin_status_;
108
109  // Used to track the SigninManagers that this instance is observing so that
110  // this instance can be removed as an observer on its destruction.
111  ScopedObserver<SigninManagerBase, SigninStatusMetricsProvider>
112      scoped_observer_;
113
114  // Whether the instance is for testing or not.
115  bool is_test_;
116
117  base::WeakPtrFactory<SigninStatusMetricsProvider> weak_ptr_factory_;
118
119  DISALLOW_COPY_AND_ASSIGN(SigninStatusMetricsProvider);
120};
121
122#endif  // CHROME_BROWSER_METRICS_SIGNIN_STATUS_METRICS_PROVIDER_H_
123