910e62b5创建于 1月15日历史提交
// Copyright 2022 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef COMPONENTS_COMMERCE_CORE_ACCOUNT_CHECKER_H_
#define COMPONENTS_COMMERCE_CORE_ACCOUNT_CHECKER_H_

#include <memory>
#include <string>

#include "base/memory/scoped_refptr.h"
#include "components/endpoint_fetcher/endpoint_fetcher.h"
#include "components/signin/public/identity_manager/identity_manager.h"
#include "components/sync/base/data_type.h"
#include "components/sync/base/user_selectable_type.h"
#include "components/sync/service/sync_service.h"
#include "net/traffic_annotation/network_traffic_annotation.h"

class GURL;
class PrefService;
class PrefChangeRegistrar;

namespace base {
class TimeDelta;
}  // namespace base

namespace network {
class SharedURLLoaderFactory;
}  // namespace network

namespace commerce {

extern const char kNotificationsPrefUrl[];

// Used to check user account status.
class AccountChecker {
 public:
  AccountChecker(const AccountChecker&) = delete;
  virtual ~AccountChecker();

  virtual bool IsSignedIn();

  // Check whether a specific sync entity is enabled by the user. This means
  // the user has chosen to sync the provided model type and does not
  // necessarily mean sync is active.
  virtual bool IsSyncTypeEnabled(syncer::UserSelectableType type);

  // Check whether sync is available for the user.
  virtual bool IsSyncAvailable();

  virtual bool IsAnonymizedUrlDataCollectionEnabled();

  virtual bool IsSubjectToParentalControls();

  // Whether a user is allowed to use model execution features.
  virtual bool CanUseModelExecutionFeatures();

  // Gets the user's country as determined at startup.
  virtual std::string GetCountry();

  // Gets the user's locale as determine at startup.
  virtual std::string GetLocale();

  virtual PrefService* GetPrefs();

 protected:
  friend class ShoppingService;
  friend class MockAccountChecker;

  // This class should only be initialized in ShoppingService.
  AccountChecker(
      std::string country,
      std::string locale,
      PrefService* pref_service,
      signin::IdentityManager* identity_manager,
      syncer::SyncService* sync_service,
      scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory);

  // Fetch users' pref from server on whether to receive price tracking emails.
  void FetchPriceEmailPref();

  // This method could be overridden in tests.
  virtual std::unique_ptr<endpoint_fetcher::EndpointFetcher>
  CreateEndpointFetcher(signin::OAuthConsumerId oauth_consumer_id,
                        const GURL& url,
                        const endpoint_fetcher::HttpMethod http_method,
                        const std::string& content_type,
                        const base::TimeDelta& timeout,
                        const std::string& post_data,
                        const net::NetworkTrafficAnnotationTag& annotation_tag);

 private:
  // Called when the pref value on whether to receive price tracking emails
  // changes. We need to send the new value to server unless the change is
  // triggered by aligning with the server fetched value.
  void OnPriceEmailPrefChanged();

  void HandleSendPriceEmailPrefResponse(
      // Passing the endpoint_fetcher ensures the endpoint_fetcher's
      // lifetime extends to the callback and is not destroyed
      // prematurely (which would result in cancellation of the request).
      // TODO(crbug.com/40238190): Avoid passing this fetcher.
      std::unique_ptr<endpoint_fetcher::EndpointFetcher> endpoint_fetcher,
      std::unique_ptr<endpoint_fetcher::EndpointResponse> responses);

  void HandleFetchPriceEmailPrefResponse(
      // Passing the endpoint_fetcher ensures the endpoint_fetcher's
      // lifetime extends to the callback and is not destroyed
      // prematurely (which would result in cancellation of the request).
      // TODO(crbug.com/40238190): Avoid passing this fetcher.
      std::unique_ptr<endpoint_fetcher::EndpointFetcher> endpoint_fetcher,
      std::unique_ptr<endpoint_fetcher::EndpointResponse> responses);

  std::string country_;

  std::string locale_;

  raw_ptr<PrefService> pref_service_;

  raw_ptr<signin::IdentityManager> identity_manager_;

  raw_ptr<syncer::SyncService> sync_service_;

  const scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory_;

  std::unique_ptr<PrefChangeRegistrar> pref_change_registrar_;

  bool is_waiting_for_pref_fetch_completion_;

  // Indicate whether we should ignore the next email pref change. This is true
  // only if the change is triggered by aligning with the server fetched value,
  // in which case we don't need to send the new value to the server again.
  bool ignore_next_email_pref_change_{false};

  base::WeakPtrFactory<AccountChecker> weak_ptr_factory_;
};

}  // namespace commerce

#endif  // COMPONENTS_COMMERCE_CORE_ACCOUNT_CHECKER_H_