Index: chrome/browser/signin/cross_device_promo.h |
diff --git a/chrome/browser/signin/cross_device_promo.h b/chrome/browser/signin/cross_device_promo.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..4f53eed5816a4d08350fb74a3615f8e05c5330a2 |
--- /dev/null |
+++ b/chrome/browser/signin/cross_device_promo.h |
@@ -0,0 +1,128 @@ |
+// Copyright 2015 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_CROSS_DEVICE_PROMO_H_ |
+#define CHROME_BROWSER_SIGNIN_CROSS_DEVICE_PROMO_H_ |
+ |
+#include "base/observer_list.h" |
+#include "base/timer/timer.h" |
+#include "components/keyed_service/core/keyed_service.h" |
+#include "components/signin/core/browser/device_activity_fetcher.h" |
+#include "components/signin/core/browser/gaia_cookie_manager_service.h" |
+ |
+class PrefService; |
+class SigninClient; |
+class SigninManager; |
+ |
+class CrossDevicePromo : public KeyedService, |
+ public GaiaCookieManagerService::Observer, |
+ public DeviceActivityFetcher::Observer { |
+ public: |
+ class Observer { |
+ public: |
+ // Called if the state changes. |
+ virtual void OnPromoActivationChanged(bool active) = 0; |
+ }; |
+ |
+ explicit CrossDevicePromo(SigninManager* signin_manager, |
+ GaiaCookieManagerService* cookie_manager_service, |
+ SigninClient* signin_client, |
+ PrefService* pref_service); |
+ ~CrossDevicePromo() override; |
+ void Shutdown() override; |
+ |
+ void AddObserver(CrossDevicePromo::Observer* observer); |
+ void RemoveObserver(CrossDevicePromo::Observer* observer); |
+ |
+ // Overriden from GaiaCookieManagerService::Observer |
+ void OnGaiaAccountsInCookieUpdated( |
+ const std::vector<std::pair<std::string, bool> >& accounts, |
+ const GoogleServiceAuthError& error) override; |
+ |
+ // Overriden from DeviceActivityFetcher::Observer |
+ void OnFetchDeviceActivitySuccess( |
+ const std::vector<DeviceActivityFetcher::DeviceActivity>& devices) |
+ override; |
+ void OnFetchDeviceActivityFailure() override; |
+ |
+ // Profile should be shown the promo. |
+ bool IsPromoActive(); |
+ |
+ // Perform checks if the promo should be displayed to this profile. |
+ bool CheckPromoEligibility(); |
+ |
+ // User elects to opt out of this promo. |
+ void OptOut(); |
+ |
+ // Called whenever the Last Active Time changes. This is used to determine |
+ // when a new browsing session occurs. |
+ void UpdateLastActiveTime(const base::Time& previous_last_active); |
+ |
+ private: |
+ // Load configuration parameters from the Variations Seed. |
+ void Init(); |
+ |
+ // Set whether the promo is active or inactive. |
+ void MarkPromoActive(); |
+ void MarkPromoInactive(); |
+ |
+ // Perform checks if the promo should be displayed to this profile. This will |
+ // not write any prefs or initiate any checks that are otherwise called in |
+ // CheckPromoEligibility. Records no metrics. Used for DCHECKs. |
+ bool VerifyPromoEligibleReadOnly(); |
+ |
+ // Track that there is exactly one account in the cookie jar for a period |
+ // of time in order to activate the promo. |
+ void RegisterForCookieChanges(); |
+ void UnregisterForCookieChanges(); |
+ |
+ // Begin authenticating and then fetching the devices with the same account. |
+ void GetDevicesActivityForAccountInCookie(); |
+ |
+ SigninManager* signin_manager_; |
+ GaiaCookieManagerService* cookie_manager_service_; |
+ PrefService* prefs_; |
+ SigninClient* signin_client_; |
+ |
+ scoped_ptr<DeviceActivityFetcher> device_activity_fetcher_; |
+ ObserverList<CrossDevicePromo::Observer> observer_list_; |
+ |
+ // Maximum time since activity seen on another device that activity is |
+ // considered within a context switch. |
+ base::TimeDelta context_switch_duration_; |
+ |
+ // Max time until the next Device Activity check. For the first test, this |
+ // will be a uniformly random time between now and the max delay specified |
+ // from Variations; otherwise we use the max delay as read from variations. |
+ base::TimeDelta delay_until_next_list_devices_; |
+ |
+ // Minimum time a single account must be in the cookie jar to consider the |
+ // machine as used by only one person. |
+ base::TimeDelta single_account_in_profile_; |
+ |
+ // Time between noted browsing activity to determine when a new Browsing |
+ // Session has started. |
+ base::TimeDelta inactivity_between_browsing_sessions_; |
+ |
+ // Throttles some portion of RPCs so they never get executed. 100 = throttled. |
+ uint64 rpc_throttle_; |
+ |
+ // Metric to help us track how long a browsing session is. Useful for |
+ // configurigng the promo. |
+ base::Time start_last_browsing_session_; |
+ |
+ // Has the service been initialized. If false, the promo is inactive. |
+ bool initialized_; |
+ |
+ // Some parts of the flow we want to ignore towards our metrics so we don't |
+ // double count. |
+ bool track_metrics_; |
+ |
+ // Used to delay the check of Device Activity. |
+ base::OneShotTimer<CrossDevicePromo> device_activity_timer_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(CrossDevicePromo); |
+}; |
+ |
+#endif // CHROME_BROWSER_SIGNIN_CROSS_DEVICE_PROMO_H_ |