1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646
|
// 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_
|