blob: 7a7f9dd2deaea6713507b859c31c792f63f9b785 [file] [log] [blame]
// Copyright 2020 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_NEARBY_SHARING_NEARBY_SHARING_SERVICE_IMPL_H_
#define CHROME_BROWSER_NEARBY_SHARING_NEARBY_SHARING_SERVICE_IMPL_H_
#include <stdint.h>
#include <memory>
#include <string>
#include <utility>
#include <vector>
#include "ash/public/cpp/session/session_observer.h"
#include "base/cancelable_callback.h"
#include "base/containers/flat_map.h"
#include "base/containers/flat_set.h"
#include "base/functional/callback_helpers.h"
#include "base/memory/ptr_util.h"
#include "base/memory/raw_ptr.h"
#include "base/memory/weak_ptr.h"
#include "base/sequence_checker.h"
#include "base/time/time.h"
#include "base/timer/timer.h"
#include "base/unguessable_token.h"
#include "chrome/browser/nearby_sharing/attachment.h"
#include "chrome/browser/nearby_sharing/attachment_info.h"
#include "chrome/browser/nearby_sharing/client/nearby_share_http_notifier.h"
#include "chrome/browser/nearby_sharing/fast_initiation/fast_initiation_scanner_feature_usage_metrics.h"
#include "chrome/browser/nearby_sharing/incoming_frames_reader.h"
#include "chrome/browser/nearby_sharing/incoming_share_target_info.h"
#include "chrome/browser/nearby_sharing/local_device_data/nearby_share_local_device_data_manager.h"
#include "chrome/browser/nearby_sharing/metrics/attachment_metric_logger.h"
#include "chrome/browser/nearby_sharing/metrics/discovery_metric_logger.h"
#include "chrome/browser/nearby_sharing/metrics/nearby_share_metric_logger.h"
#include "chrome/browser/nearby_sharing/metrics/throughput_metric_logger.h"
#include "chrome/browser/nearby_sharing/nearby_notification_manager.h"
#include "chrome/browser/nearby_sharing/nearby_share_feature_usage_metrics.h"
#include "chrome/browser/nearby_sharing/nearby_share_logger.h"
#include "chrome/browser/nearby_sharing/nearby_share_settings.h"
#include "chrome/browser/nearby_sharing/nearby_share_transfer_profiler.h"
#include "chrome/browser/nearby_sharing/nearby_sharing_service.h"
#include "chrome/browser/nearby_sharing/outgoing_share_target_info.h"
#include "chrome/browser/nearby_sharing/power_client.h"
#include "chrome/browser/nearby_sharing/share_target.h"
#include "chrome/browser/nearby_sharing/transfer_metadata.h"
#include "chrome/browser/nearby_sharing/wifi_network_configuration/wifi_network_configuration_handler.h"
#include "chrome/services/sharing/public/proto/wire_format.pb.h"
#include "chromeos/ash/components/nearby/common/connections_manager/nearby_connections_manager.h"
#include "chromeos/ash/components/nearby/common/connections_manager/nearby_file_handler.h"
#include "chromeos/ash/components/nearby/presence/nearby_presence_service.h"
#include "chromeos/ash/services/nearby/public/cpp/nearby_process_manager.h"
#include "chromeos/ash/services/nearby/public/mojom/nearby_decoder_types.mojom.h"
#include "chromeos/ash/services/nearby/public/mojom/nearby_share_settings.mojom-shared.h"
#include "chromeos/ash/services/nearby/public/mojom/nearby_share_settings.mojom.h"
#include "components/prefs/pref_change_registrar.h"
#include "device/bluetooth/bluetooth_adapter.h"
#include "net/base/network_change_notifier.h"
class FastInitiationAdvertiser;
class FastInitiationScanner;
class NearbyConnectionsManager;
class NearbyShareContactManager;
class NearbyShareCertificateManager;
class NearbyShareClientFactory;
class NearbyShareLocalDeviceDataManager;
class NotificationDisplayService;
class PrefService;
class Profile;
namespace NearbySharingServiceUnitTests {
class NearbySharingServiceImplTestBase;
}
namespace user_manager {
class User;
} // namespace user_manager
// All methods should be called from the same sequence that created the service.
class NearbySharingServiceImpl
: public NearbySharingService,
public nearby_share::mojom::NearbyShareSettingsObserver,
public NearbyShareCertificateManager::Observer,
public device::BluetoothAdapter::Observer,
public NearbyConnectionsManager::IncomingConnectionListener,
public NearbyConnectionsManager::DiscoveryListener,
public NearbyConnectionsManager::BandwidthUpgradeListener,
public ash::SessionObserver,
public PowerClient::Observer,
public net::NetworkChangeNotifier::NetworkChangeObserver {
public:
// The number of unexpected nearby process shutdowns that we allow during a
// fixed window before deciding not to restart the process.
static constexpr int kMaxRecentNearbyProcessUnexpectedShutdownCount = 4;
NearbySharingServiceImpl(
user_manager::User& user,
Profile* profile,
NotificationDisplayService* notification_display_service,
std::unique_ptr<NearbyConnectionsManager> nearby_connections_manager,
ash::nearby::NearbyProcessManager* process_manager,
std::unique_ptr<PowerClient> power_client,
std::unique_ptr<WifiNetworkConfigurationHandler> wifi_network_handler);
~NearbySharingServiceImpl() override;
// NearbySharingService:
void Shutdown() override;
void AddObserver(NearbySharingService::Observer* observer) override;
void RemoveObserver(NearbySharingService::Observer* observer) override;
bool HasObserver(NearbySharingService::Observer* observer) override;
StatusCodes RegisterSendSurface(
TransferUpdateCallback* transfer_callback,
ShareTargetDiscoveredCallback* discovery_callback,
SendSurfaceState state) override;
StatusCodes UnregisterSendSurface(
TransferUpdateCallback* transfer_callback,
ShareTargetDiscoveredCallback* discovery_callback) override;
StatusCodes RegisterReceiveSurface(TransferUpdateCallback* transfer_callback,
ReceiveSurfaceState state) override;
StatusCodes UnregisterReceiveSurface(
TransferUpdateCallback* transfer_callback) override;
StatusCodes ClearForegroundReceiveSurfaces() override;
bool IsInHighVisibility() const override;
bool IsTransferring() const override;
bool IsReceivingFile() const override;
bool IsSendingFile() const override;
bool IsScanning() const override;
bool IsConnecting() const override;
StatusCodes SendAttachments(
const ShareTarget& share_target,
std::vector<std::unique_ptr<Attachment>> attachments) override;
void Accept(const ShareTarget& share_target,
StatusCodesCallback status_codes_callback) override;
void Reject(const ShareTarget& share_target,
StatusCodesCallback status_codes_callback) override;
void Cancel(const ShareTarget& share_target,
StatusCodesCallback status_codes_callback) override;
bool DidLocalUserCancelTransfer(const ShareTarget& share_target) override;
void Open(const ShareTarget& share_target,
StatusCodesCallback status_codes_callback) override;
void OpenURL(GURL url) override;
void SetArcTransferCleanupCallback(
base::OnceCallback<void()> callback) override;
NearbyNotificationDelegate* GetNotificationDelegate(
const std::string& notification_id) override;
void RecordFastInitiationNotificationUsage(bool success) override;
NearbyShareSettings* GetSettings() override;
NearbyShareHttpNotifier* GetHttpNotifier() override;
NearbyShareLocalDeviceDataManager* GetLocalDeviceDataManager() override;
NearbyShareContactManager* GetContactManager() override;
NearbyShareCertificateManager* GetCertificateManager() override;
NearbyNotificationManager* GetNotificationManager() override;
// NearbyConnectionsManager::IncomingConnectionListener:
void OnIncomingConnectionInitiated(
const std::string& endpoint_id,
const std::vector<uint8_t>& endpoint_info) override {}
void OnIncomingConnectionAccepted(const std::string& endpoint_id,
const std::vector<uint8_t>& endpoint_info,
NearbyConnection* connection) override;
// net::NetworkChangeNotifier::NetworkChangeObserver:
void OnNetworkChanged(
net::NetworkChangeNotifier::ConnectionType type) override;
// Test methods
void FlushMojoForTesting();
void set_free_disk_space_for_testing(int64_t free_disk_space) {
free_disk_space_for_testing_ = free_disk_space;
}
void set_visibility_reminder_timer_delay_for_testing(base::TimeDelta delay) {
visibility_reminder_timer_delay_ = delay;
UpdateVisibilityReminderTimer(true);
}
private:
friend class NearbySharingServiceUnitTests::NearbySharingServiceImplTestBase;
// nearby_share::mojom::NearbyShareSettingsObserver:
void OnEnabledChanged(bool enabled) override;
void OnFastInitiationNotificationStateChanged(
nearby_share::mojom::FastInitiationNotificationState state) override;
void OnIsFastInitiationHardwareSupportedChanged(bool is_supported) override {}
void OnDeviceNameChanged(const std::string& device_name) override;
void OnDataUsageChanged(nearby_share::mojom::DataUsage data_usage) override;
void OnVisibilityChanged(nearby_share::mojom::Visibility visibility) override;
void OnAllowedContactsChanged(
const std::vector<std::string>& allowed_contacts) override;
void OnIsOnboardingCompleteChanged(bool is_complete) override {}
// NearbyShareCertificateManager::Observer:
void OnPublicCertificatesDownloaded() override;
void OnPrivateCertificatesChanged() override;
// NearbyConnectionsManager::DiscoveryListener:
void OnEndpointDiscovered(const std::string& endpoint_id,
const std::vector<uint8_t>& endpoint_info) override;
void OnEndpointLost(const std::string& endpoint_id) override;
// NearbyConnectionsManager::BandwidthUpgradeListener:
void OnInitialMedium(const std::string& endpoint_id,
const Medium medium) override;
void OnBandwidthUpgrade(const std::string& endpoint_id,
const Medium medium) override;
void OnBandwidthUpgradeV3(nearby::presence::PresenceDevice remote_device,
const Medium medium) override;
// ash::SessionObserver:
void OnLockStateChanged(bool locked) override;
// BluetoothAdapter::Observer:
void AdapterPresentChanged(device::BluetoothAdapter* adapter,
bool present) override;
void AdapterPoweredChanged(device::BluetoothAdapter* adapter,
bool powered) override;
void LowEnergyScanSessionHardwareOffloadingStatusChanged(
device::BluetoothAdapter::LowEnergyScanSessionHardwareOffloadingStatus
status) override;
// PowerClient::Observer:
void SuspendImminent() override;
void SuspendDone() override;
base::ObserverList<TransferUpdateCallback>& GetReceiveCallbacksFromState(
ReceiveSurfaceState state);
bool IsVisibleInBackground(nearby_share::mojom::Visibility visibility);
const std::optional<std::vector<uint8_t>> CreateEndpointInfo(
const std::optional<std::string>& device_name);
void GetBluetoothAdapter();
void OnGetBluetoothAdapter(scoped_refptr<device::BluetoothAdapter> adapter);
void StartFastInitiationAdvertising();
void OnStartFastInitiationAdvertising();
void OnStartFastInitiationAdvertisingError();
void StopFastInitiationAdvertising();
void OnStopFastInitiationAdvertising();
// Processes endpoint discovered/lost events. We queue up the events to ensure
// each discovered or lost event is fully handled before the next is run. For
// example, we don't want to start processing an endpoint-lost event before
// the corresponding endpoint-discovered event is finished. This is especially
// important because of the asynchronous steps required to process an
// endpoint-discovered event.
void AddEndpointDiscoveryEvent(base::OnceClosure event);
void HandleEndpointDiscovered(const std::string& endpoint_id,
const std::vector<uint8_t>& endpoint_info);
void HandleEndpointLost(const std::string& endpoint_id);
void FinishEndpointDiscoveryEvent();
void OnOutgoingAdvertisementDecoded(
const std::string& endpoint_id,
const std::vector<uint8_t>& endpoint_info,
sharing::mojom::AdvertisementPtr advertisement);
void OnOutgoingDecryptedCertificate(
const std::string& endpoint_id,
const std::vector<uint8_t>& endpoint_info,
sharing::mojom::AdvertisementPtr advertisement,
std::optional<NearbyShareDecryptedPublicCertificate> certificate);
void ScheduleCertificateDownloadDuringDiscovery(size_t attempt_count);
void OnCertificateDownloadDuringDiscoveryTimerFired(size_t attempt_count);
bool IsBluetoothPresent() const;
bool IsBluetoothPowered() const;
bool HasAvailableAdvertisingMediums();
bool HasAvailableDiscoveryMediums();
void InvalidateSurfaceState();
bool ShouldStopNearbyProcess();
void OnProcessShutdownTimerFired();
void InvalidateSendSurfaceState();
void InvalidateScanningState();
void InvalidateFastInitiationAdvertising();
void InvalidateReceiveSurfaceState();
void InvalidateAdvertisingState();
void StopAdvertising();
void StartScanning();
StatusCodes StopScanning();
void StopAdvertisingAndInvalidateSurfaceState();
void InvalidateFastInitiationScanning();
void StartFastInitiationScanning();
void OnFastInitiationDevicesDetected();
void OnFastInitiationDevicesNotDetected();
void StopFastInitiationScanning();
void ScheduleRotateBackgroundAdvertisementTimer();
void OnRotateBackgroundAdvertisementTimerFired();
void RemoveOutgoingShareTargetWithEndpointId(const std::string& endpoint_id);
void OnTransferComplete();
void OnTransferStarted(bool is_incoming);
void ReceivePayloads(ShareTarget share_target,
StatusCodesCallback status_codes_callback);
StatusCodes SendPayloads(const ShareTarget& share_target);
void OnUniquePathFetched(
int64_t attachment_id,
int64_t payload_id,
base::OnceCallback<void(nearby::connections::mojom::Status)> callback,
base::FilePath path);
void OnPayloadPathRegistered(base::ScopedClosureRunner closure_runner,
bool* aggregated_success,
nearby::connections::mojom::Status status);
void OnPayloadPathsRegistered(const ShareTarget& share_target,
std::unique_ptr<bool> aggregated_success,
StatusCodesCallback status_codes_callback);
void OnOutgoingConnection(const ShareTarget& share_target,
base::TimeTicks connect_start_time,
NearbyConnection* connection);
void SendIntroduction(const ShareTarget& share_target,
std::optional<std::string> four_digit_token);
void CreatePayloads(ShareTarget share_target,
base::OnceCallback<void(ShareTarget, bool)> callback);
void OnCreatePayloads(std::vector<uint8_t> endpoint_info,
ShareTarget share_target,
bool success);
void OnOpenFiles(ShareTarget share_target,
base::OnceCallback<void(ShareTarget, bool)> callback,
std::vector<NearbyFileHandler::FileInfo> files);
std::vector<nearby::connections::mojom::PayloadPtr> CreateTextPayloads(
const std::vector<TextAttachment>& attachments);
void WriteResponse(
NearbyConnection& connection,
sharing::nearby::ConnectionResponseFrame::Status reponse_status);
void WriteCancel(NearbyConnection& connection);
void Fail(const ShareTarget& share_target, TransferMetadata::Status status);
void OnIncomingAdvertisementDecoded(
const std::string& endpoint_id,
ShareTarget placeholder_share_target,
sharing::mojom::AdvertisementPtr advertisement);
void OnIncomingTransferUpdate(const ShareTarget& share_target,
const TransferMetadata& metadata);
void OnOutgoingTransferUpdate(const ShareTarget& share_target,
const TransferMetadata& metadata);
void CloseConnection(const ShareTarget& share_target);
void OnIncomingDecryptedCertificate(
const std::string& endpoint_id,
sharing::mojom::AdvertisementPtr advertisement,
ShareTarget placeholder_share_target,
std::optional<NearbyShareDecryptedPublicCertificate> certificate);
void RunPairedKeyVerification(
const ShareTarget& share_target,
const std::string& endpoint_id,
base::OnceCallback<void(
PairedKeyVerificationRunner::PairedKeyVerificationResult)> callback);
void OnIncomingConnectionKeyVerificationDone(
ShareTarget share_target,
std::optional<std::string> four_digit_token,
PairedKeyVerificationRunner::PairedKeyVerificationResult result);
void OnOutgoingConnectionKeyVerificationDone(
const ShareTarget& share_target,
std::optional<std::string> four_digit_token,
PairedKeyVerificationRunner::PairedKeyVerificationResult result);
void RefreshUIOnDisconnection(ShareTarget share_target);
void ReceiveIntroduction(ShareTarget share_target,
std::optional<std::string> four_digit_token);
void OnReceivedIntroduction(ShareTarget share_target,
std::optional<std::string> four_digit_token,
std::optional<sharing::mojom::V1FramePtr> frame);
void ReceiveConnectionResponse(ShareTarget share_target);
void OnReceiveConnectionResponse(
ShareTarget share_target,
std::optional<sharing::mojom::V1FramePtr> frame);
void OnStorageCheckCompleted(ShareTarget share_target,
std::optional<std::string> four_digit_token,
bool is_out_of_storage);
void OnFrameRead(ShareTarget share_target,
std::optional<sharing::mojom::V1FramePtr> frame);
void HandleCertificateInfoFrame(
const sharing::mojom::CertificateInfoFramePtr& certificate_frame);
void OnIncomingConnectionDisconnected(const ShareTarget& share_target);
void OnOutgoingConnectionDisconnected(const ShareTarget& share_target);
void OnIncomingMutualAcceptanceTimeout(const ShareTarget& share_target);
void OnOutgoingMutualAcceptanceTimeout(const ShareTarget& share_target);
void OnNearbyProcessStopped(
ash::nearby::NearbyProcessManager::NearbyProcessShutdownReason
shutdown_reason);
void CleanupAfterNearbyProcessStopped();
void RestartNearbyProcessIfAppropriate(
ash::nearby::NearbyProcessManager::NearbyProcessShutdownReason
shutdown_reason);
bool ShouldRestartNearbyProcess(
ash::nearby::NearbyProcessManager::NearbyProcessShutdownReason
shutdown_reason);
void ClearRecentNearbyProcessUnexpectedShutdownCount();
void BindToNearbyProcess();
sharing::mojom::NearbySharingDecoder* GetNearbySharingDecoder();
std::optional<ShareTarget> CreateShareTarget(
const std::string& endpoint_id,
const sharing::mojom::AdvertisementPtr& advertisement,
std::optional<NearbyShareDecryptedPublicCertificate> certificate,
bool is_incoming);
void OnPayloadTransferUpdate(ShareTarget share_target,
TransferMetadata metadata);
bool OnIncomingPayloadsComplete(ShareTarget& share_target);
void RemoveIncomingPayloads(ShareTarget share_target);
void Disconnect(const ShareTarget& share_target, TransferMetadata metadata);
void OnDisconnectingConnectionTimeout(const std::string& endpoint_id);
void OnDisconnectingConnectionDisconnected(const ShareTarget& share_target,
const std::string& endpoint_id);
ShareTargetInfo& GetOrCreateShareTargetInfo(const ShareTarget& share_target,
const std::string& endpoint_id);
ShareTargetInfo* GetShareTargetInfo(const ShareTarget& share_target);
IncomingShareTargetInfo* GetIncomingShareTargetInfo(
const ShareTarget& share_target);
OutgoingShareTargetInfo* GetOutgoingShareTargetInfo(
const ShareTarget& share_target);
NearbyConnection* GetConnection(const ShareTarget& share_target);
std::optional<std::vector<uint8_t>> GetBluetoothMacAddressForShareTarget(
const ShareTarget& share_target);
void ClearOutgoingShareTargetInfoMap();
void SetAttachmentPayloadId(const Attachment& attachment, int64_t payload_id);
std::optional<int64_t> GetAttachmentPayloadId(int64_t attachment_id);
void UnregisterShareTarget(const ShareTarget& share_target);
void OnStartAdvertisingResult(
bool used_device_name,
NearbyConnectionsManager::ConnectionsStatus status);
void OnStopAdvertisingResult(
NearbyConnectionsManager::ConnectionsStatus status);
void OnStartDiscoveryResult(
NearbyConnectionsManager::ConnectionsStatus status);
void SetInHighVisibility(bool new_in_high_visibility);
// Note: |share_target| is intentionally passed by value. A share target
// reference could likely be invalidated by the owner during the multi-step
// cancellation process.
void DoCancel(ShareTarget share_target,
StatusCodesCallback status_codes_callback,
bool is_initiator_of_cancellation);
void AbortAndCloseConnectionIfNecessary(const TransferMetadata::Status status,
const ShareTarget& share_target);
// The method is responsible for updating visibility reminder timer:
// 1) Stops the timer if the feature flag is disabled OR Nearby Share is
// disabled OR visibility is changed to 'Hidden"; 2) Restart the timer and
// update the timestamp if we force it to update OR it's past 180 days since
// last time we updated it.
void UpdateVisibilityReminderTimer(bool reset_timestamp);
void OnVisibilityReminderTimerFired();
base::TimeDelta GetTimeUntilNextVisibilityReminder();
raw_ptr<Profile> profile_;
raw_ptr<PrefService> prefs_ = nullptr;
std::unique_ptr<NearbyConnectionsManager> nearby_connections_manager_;
raw_ptr<ash::nearby::NearbyProcessManager> process_manager_;
std::unique_ptr<ash::nearby::NearbyProcessManager::NearbyProcessReference>
process_reference_;
std::unique_ptr<PowerClient> power_client_;
std::unique_ptr<WifiNetworkConfigurationHandler> wifi_network_handler_;
scoped_refptr<device::BluetoothAdapter> bluetooth_adapter_;
// Advertiser which is non-null when we are attempting to share and
// broadcasting Fast Initiation advertisements.
std::unique_ptr<FastInitiationAdvertiser> fast_initiation_advertiser_;
// Scanner which is non-null when we are performing a background scan for
// remote devices that are attempting to share.
std::unique_ptr<FastInitiationScanner> fast_initiation_scanner_;
std::unique_ptr<NearbyNotificationManager> nearby_notification_manager_;
NearbyShareHttpNotifier nearby_share_http_notifier_;
std::unique_ptr<NearbyShareClientFactory> http_client_factory_;
std::unique_ptr<NearbyShareLocalDeviceDataManager> local_device_data_manager_;
std::unique_ptr<NearbyShareContactManager> contact_manager_;
std::unique_ptr<NearbyShareCertificateManager> certificate_manager_;
std::unique_ptr<NearbyShareTransferProfiler> transfer_profiler_;
std::unique_ptr<NearbyShareLogger> logger_;
NearbyShareSettings settings_;
NearbyShareFeatureUsageMetrics feature_usage_metrics_;
std::unique_ptr<FastInitiationScannerFeatureUsageMetrics>
fast_initiation_scanning_metrics_;
NearbyFileHandler file_handler_;
bool is_screen_locked_ = false;
base::OneShotTimer rotate_background_advertisement_timer_;
base::OneShotTimer certificate_download_during_discovery_timer_;
base::OneShotTimer process_shutdown_pending_timer_;
// A list of service observers.
base::ObserverList<NearbySharingService::Observer> observers_;
// A list of foreground receivers.
base::ObserverList<TransferUpdateCallback> foreground_receive_callbacks_;
// A list of background receivers.
base::ObserverList<TransferUpdateCallback> background_receive_callbacks_;
// A list of foreground receivers for transfer updates on the send surface.
base::ObserverList<TransferUpdateCallback>
foreground_send_transfer_callbacks_;
// A list of foreground receivers for discovered device updates on the send
// surface.
base::ObserverList<ShareTargetDiscoveredCallback>
foreground_send_discovery_callbacks_;
// A list of background receivers for transfer updates on the send surface.
base::ObserverList<TransferUpdateCallback>
background_send_transfer_callbacks_;
// A list of background receivers for discovered device updates on the send
// surface.
base::ObserverList<ShareTargetDiscoveredCallback>
background_send_discovery_callbacks_;
// Registers the most recent TransferMetadata and ShareTarget used for
// transitioning notifications between foreground surfaces and background
// surfaces. Empty if no metadata is available.
std::optional<std::pair<ShareTarget, TransferMetadata>>
last_incoming_metadata_;
// The most recent outgoing TransferMetadata and ShareTarget.
std::optional<std::pair<ShareTarget, TransferMetadata>>
last_outgoing_metadata_;
// A map of ShareTarget id to IncomingShareTargetInfo. This lets us know which
// Nearby Connections endpoint and public certificate are related to the
// incoming share target.
base::flat_map<base::UnguessableToken, IncomingShareTargetInfo>
incoming_share_target_info_map_;
// A map of endpoint id to ShareTarget, where each ShareTarget entry
// directly corresponds to a OutgoingShareTargetInfo entry in
// outgoing_share_target_info_map_;
base::flat_map<std::string, ShareTarget> outgoing_share_target_map_;
// A map of ShareTarget id to OutgoingShareTargetInfo. This lets us know which
// endpoint and public certificate are related to the outgoing share target.
// TODO(crbug.com/40132032) update this map when handling payloads
base::flat_map<base::UnguessableToken, OutgoingShareTargetInfo>
outgoing_share_target_info_map_;
// For metrics. The IDs of ShareTargets that are cancelled while trying to
// establish an outgoing connection.
base::flat_set<base::UnguessableToken> all_cancelled_share_target_ids_;
// The IDs of ShareTargets that we cancelled the transfer to.
base::flat_set<base::UnguessableToken> locally_cancelled_share_target_ids_;
// A map from endpoint ID to endpoint info from discovered, contact-based
// advertisements that could not decrypt any available public certificates.
// During discovery, if certificates are downloaded, we revist this map and
// retry certificate decryption.
base::flat_map<std::string, std::vector<uint8_t>>
discovered_advertisements_to_retry_map_;
// Mapping of Endpoint Id to share targets.
base::flat_map<std::string, ShareTarget> share_target_map_;
// Mapping of Endpoint Id to total transfer size.
base::flat_map<std::string, int64_t> transfer_size_map_;
// A mapping of Attachment Id to additional AttachmentInfo related to the
// Attachment.
base::flat_map<int64_t, AttachmentInfo> attachment_info_map_;
// This alarm is used to disconnect the sharing connection if both sides do
// not press accept within the timeout.
base::CancelableOnceClosure mutual_acceptance_timeout_alarm_;
// A map of ShareTarget id to disconnection timeout callback. Used to only
// disconnect after a timeout to keep sending any pending payloads.
base::flat_map<std::string, std::unique_ptr<base::CancelableOnceClosure>>
disconnection_timeout_alarms_;
// The current advertising power level. PowerLevel::kUnknown while not
// advertising.
NearbyConnectionsManager::PowerLevel advertising_power_level_ =
NearbyConnectionsManager::PowerLevel::kUnknown;
// True if we are currently scanning for remote devices.
bool is_scanning_ = false;
// True if we're currently sending or receiving a file.
bool is_transferring_ = false;
// True if we're currently receiving a file.
bool is_receiving_files_ = false;
// True if we're currently sending a file.
bool is_sending_files_ = false;
// True if we're currently attempting to connect to a remote device.
bool is_connecting_ = false;
// The time scanning began.
base::Time scanning_start_timestamp_;
// True when we are advertising with a device name visible to everyone.
bool in_high_visibility_ = false;
// The time attachments are sent after a share target is selected. This is
// used to time the process from selecting a share target to writing the
// introduction frame (last frame before receiver gets notified).
base::TimeTicks send_attachments_timestamp_;
// Whether an incoming share has been accepted and we are waiting to log the
// time from acceptance to the start of payload transfer.
bool is_waiting_to_record_accept_to_transfer_start_metric_ = false;
// Time at which an incoming transfer was accepted. This is used to calculate
// the time between an incoming share being accepted and the first payload
// byte being processed.
base::TimeTicks incoming_share_accepted_timestamp_;
int recent_nearby_process_unexpected_shutdown_count_ = 0;
base::OneShotTimer clear_recent_nearby_process_shutdown_count_timer_;
// Used to debounce OnNetworkChanged processing.
base::RetainingOneShotTimer on_network_changed_delay_timer_;
// Used to prevent the "Device nearby is sharing" notification from appearing
// immediately after a completed share.
base::OneShotTimer fast_initiation_scanner_cooldown_timer_;
// The duration of reminder timer. In production, this is 180 days.
// Can be shorten for testing efficiency purpose.
base::TimeDelta visibility_reminder_timer_delay_;
// Used to control when to show visibility reminder notification to users.
base::OneShotTimer visibility_reminder_timer_;
// Available free disk space for testing. Using real disk space can introduce
// flakiness in tests.
std::optional<int64_t> free_disk_space_for_testing_;
// A queue of endpoint-discovered and endpoint-lost events that ensures the
// events are processed sequentially, in the order received from Nearby
// Connections. An event is processed either immediately, if there are no
// other events in the queue, or as soon as the previous event processing
// finishes. When processing finishes, the event is removed from the queue.
base::queue<base::OnceClosure> endpoint_discovery_events_;
mojo::Receiver<nearby_share::mojom::NearbyShareSettingsObserver>
settings_receiver_{this};
// Called when cleanup for ARC is needed as part of the transfer.
base::OnceCallback<void()> arc_transfer_cleanup_callback_;
// Stores the user's selected visibility state and allowed contacts when the
// screen is locked and visibility is set to kYourDevices.
nearby_share::mojom::Visibility user_visibility_;
std::set<std::string> user_allowed_contacts_ = {};
// Metrics loggers.
std::unique_ptr<nearby::share::metrics::DiscoveryMetricLogger>
discovery_metric_logger_;
std::unique_ptr<nearby::share::metrics::ThroughputMetricLogger>
throughput_metric_logger_;
std::unique_ptr<nearby::share::metrics::AttachmentMetricLogger>
attachment_metric_logger_;
std::unique_ptr<nearby::share::metrics::NearbyShareMetricLogger>
neaby_share_metric_logger_;
SEQUENCE_CHECKER(sequence_checker_);
base::WeakPtrFactory<NearbySharingServiceImpl> weak_ptr_factory_{this};
base::WeakPtrFactory<NearbySharingServiceImpl>
endpoint_discovery_weak_ptr_factory_{this};
};
#endif // CHROME_BROWSER_NEARBY_SHARING_NEARBY_SHARING_SERVICE_IMPL_H_