diff --git a/sharing/BUILD b/sharing/BUILD index b5974de2..d2c16191 100644 --- a/sharing/BUILD +++ b/sharing/BUILD @@ -109,6 +109,16 @@ cc_library( ], ) +cc_library( + name = "share_session_usage", + hdrs = ["share_session_usage.h"], + visibility = [ + "//location/nearby/cpp/sharing:__subpackages__", + "//location/nearby/sharing/lib:__subpackages__", + "//sharing:__subpackages__", + ], +) + cc_library( name = "transfer_metadata", srcs = [ @@ -128,6 +138,7 @@ cc_library( "//sharing:__subpackages__", ], deps = [ + ":share_session_usage", "@com_google_absl//absl/strings", "@com_google_absl//absl/strings:str_format", ], @@ -229,6 +240,7 @@ cc_library( ":incoming_frame_reader", ":nearby_sharing_util", ":paired_key_verification_runner", + ":share_session_usage", ":thread_timer", ":transfer_metadata", ":types", @@ -369,6 +381,7 @@ cc_library( ":outgoing_targets_manager", ":paired_key_verification_runner", ":share_session", + ":share_session_usage", ":thread_timer", ":transfer_metadata", ":types", @@ -378,7 +391,6 @@ cc_library( "//internal/analytics:event_logger", "//internal/base", "//internal/base:file_path", - "//internal/base:files", "//internal/flags:nearby_flags", "//internal/network:url", "//internal/platform:base", @@ -841,6 +853,7 @@ cc_test( name = "transfer_metadata_test", srcs = ["transfer_metadata_test.cc"], deps = [ + ":share_session_usage", ":transfer_metadata", "@com_github_protobuf_matchers//protobuf-matchers", "@com_google_googletest//:gtest_main", @@ -855,6 +868,7 @@ cc_test( ":nearby_connection_impl", ":paired_key_verification_runner", ":share_session", + ":share_session_usage", ":test_support", ":transfer_metadata", ":transfer_metadata_matchers", @@ -906,6 +920,7 @@ cc_test( ":connection_types", ":nearby_connection_impl", ":share_session", + ":share_session_usage", ":test_support", ":transfer_metadata", ":transfer_metadata_matchers", @@ -939,6 +954,7 @@ cc_test( ":nearby_connection_impl", ":paired_key_verification_runner", ":share_session", + ":share_session_usage", ":test_support", ":transfer_metadata", ":transfer_metadata_matchers", diff --git a/sharing/incoming_share_session.cc b/sharing/incoming_share_session.cc index a0e8e0d5..ed86146a 100644 --- a/sharing/incoming_share_session.cc +++ b/sharing/incoming_share_session.cc @@ -41,6 +41,7 @@ #include "sharing/payload_tracker.h" #include "sharing/proto/wire_format.pb.h" #include "sharing/share_session.h" +#include "sharing/share_session_usage.h" #include "sharing/share_target.h" #include "sharing/text_attachment.h" #include "sharing/thread_timer.h" @@ -69,7 +70,9 @@ IncomingShareSession::IncomingShareSession( transfer_update_callback) : ShareSession(clock, service_thread, connections_manager, analytics_recorder, std::move(endpoint_id), share_target), - transfer_update_callback_(std::move(transfer_update_callback)) {} + transfer_update_callback_(std::move(transfer_update_callback)) { + set_session_usage(ShareSessionUsage::kSharing); +} IncomingShareSession::IncomingShareSession(IncomingShareSession&&) = default; @@ -210,6 +213,7 @@ bool IncomingShareSession::ReadyForTransfer( if (!self_share()) { TransferMetadataBuilder transfer_metadata_builder; + transfer_metadata_builder.set_usage(session_usage()); transfer_metadata_builder.set_status( TransferMetadata::Status::kAwaitingLocalConfirmation); transfer_metadata_builder.set_token(token()); @@ -249,6 +253,7 @@ bool IncomingShareSession::AcceptTransfer( UpdateTransferMetadata( TransferMetadataBuilder() + .set_usage(session_usage()) .set_status(TransferMetadata::Status::kAwaitingRemoteAcceptance) .set_token(token()) .build()); @@ -434,7 +439,10 @@ void IncomingShareSession::SendFailureResponse( WriteResponseFrame(response_status); DCHECK(TransferMetadata::IsFinalStatus(status)) << "SendFailureResponse should only be called with a final status"; - UpdateTransferMetadata(TransferMetadataBuilder().set_status(status).build()); + UpdateTransferMetadata(TransferMetadataBuilder() + .set_usage(session_usage()) + .set_status(status) + .build()); } std::optional @@ -449,19 +457,21 @@ IncomingShareSession::ProcessPayloadTransferUpdates( // Cancel acceptance timer when payload transfer update is received. // This mean sender has begun sending payload. mutual_acceptance_timeout_ = nullptr; - std::optional metadata; + std::optional metadata_builder; // If there is a batch of updates in the queue, only return the latest // TransferMetadata. for (; !updates.empty(); updates.pop()) { - metadata = + metadata_builder = get_payload_tracker()->ProcessPayloadUpdate(std::move(updates.front())); - if (!metadata.has_value()) { + if (!metadata_builder.has_value()) { continue; } - - if (metadata->status() == TransferMetadata::Status::kComplete) { + TransferMetadata metadata = + metadata_builder->set_usage(session_usage()).build(); + if (metadata.status() == TransferMetadata::Status::kComplete) { if (!FinalizePayloads()) { return TransferMetadataBuilder() + .set_usage(session_usage()) .set_status(TransferMetadata::Status::kIncompletePayloads) .build(); } @@ -474,13 +484,15 @@ IncomingShareSession::ProcessPayloadTransferUpdates( if (update_file_paths_in_progress) { UpdateFilePayloadPaths(); } else { - if (metadata->status() == TransferMetadata::Status::kCancelled) { + if (metadata.status() == TransferMetadata::Status::kCancelled) { VLOG(1) << __func__ << ": Update file paths for cancelled transfer"; UpdateFilePayloadPaths(); } } } - return metadata; + return metadata_builder.has_value() + ? std::make_optional(metadata_builder->build()) + : std::nullopt; } void IncomingShareSession::OnConnected(NearbyConnection* connection) { diff --git a/sharing/incoming_share_session_test.cc b/sharing/incoming_share_session_test.cc index b926f65b..999fbe7f 100644 --- a/sharing/incoming_share_session_test.cc +++ b/sharing/incoming_share_session_test.cc @@ -43,9 +43,9 @@ #include "sharing/internal/public/logging.h" #include "sharing/nearby_connection_impl.h" #include "sharing/nearby_connections_types.h" -#include "sharing/paired_key_verification_runner.h" #include "sharing/proto/analytics/nearby_sharing_log.pb.h" #include "sharing/proto/wire_format.pb.h" +#include "sharing/share_session_usage.h" #include "sharing/share_target.h" #include "sharing/text_attachment.h" #include "sharing/transfer_metadata.h" @@ -59,7 +59,6 @@ namespace { using ::absl::Seconds; using ::location::nearby::proto::sharing::EventCategory; using ::location::nearby::proto::sharing::EventType; -using ::location::nearby::proto::sharing::OSType; using ::location::nearby::proto::sharing::ResponseToIntroduction; using ::nearby::analytics::HasAction; using ::nearby::analytics::HasCategory; @@ -1085,7 +1084,9 @@ TEST_F(IncomingShareSessionTest, ReadyForTransferNotSelfShare) { session_.OnConnected(&connection_); EXPECT_CALL( transfer_metadata_callback_, - Call(_, HasStatus(TransferMetadata::Status::kAwaitingLocalConfirmation))); + Call(_, AllOf(HasStatus( + TransferMetadata::Status::kAwaitingLocalConfirmation), + HasUsage(ShareSessionUsage::kSharing)))); EXPECT_THAT( session_.ReadyForTransfer( @@ -1104,7 +1105,9 @@ TEST_F(IncomingShareSessionTest, ReadyForTransferSelfShare) { session.OnConnected(&connection_); EXPECT_CALL( transfer_metadata_callback_, - Call(_, HasStatus(TransferMetadata::Status::kAwaitingLocalConfirmation))) + Call(_, AllOf(HasStatus( + TransferMetadata::Status::kAwaitingLocalConfirmation), + HasUsage(ShareSessionUsage::kSharing)))) .Times(0); EXPECT_THAT( @@ -1117,7 +1120,9 @@ TEST_F(IncomingShareSessionTest, ReadyForTransferTimeout) { session_.OnConnected(&connection_); EXPECT_CALL( transfer_metadata_callback_, - Call(_, HasStatus(TransferMetadata::Status::kAwaitingLocalConfirmation))); + Call(_, AllOf(HasStatus( + TransferMetadata::Status::kAwaitingLocalConfirmation), + HasUsage(ShareSessionUsage::kSharing)))); bool accept_timeout_called = false; EXPECT_THAT(session_.ReadyForTransfer( @@ -1195,7 +1200,9 @@ TEST_F(IncomingShareSessionTest, AcceptTransferSuccess) { IsFalse()); EXPECT_CALL( transfer_metadata_callback_, - Call(_, HasStatus(TransferMetadata::Status::kAwaitingRemoteAcceptance))); + Call(_, + AllOf(HasStatus(TransferMetadata::Status::kAwaitingRemoteAcceptance), + HasUsage(ShareSessionUsage::kSharing)))); EXPECT_CALL( mock_event_logger_, Log(Matcher(AllOf( @@ -1274,8 +1281,10 @@ TEST_F(IncomingShareSessionTest, TryUpgradeBandwidthNeeded) { } TEST_F(IncomingShareSessionTest, SendFailureResponseNotConnected) { - EXPECT_CALL(transfer_metadata_callback_, - Call(_, HasStatus(TransferMetadata::Status::kNotEnoughSpace))); + EXPECT_CALL( + transfer_metadata_callback_, + Call(_, AllOf(HasStatus(TransferMetadata::Status::kNotEnoughSpace), + HasUsage(ShareSessionUsage::kSharing)))); session_.SendFailureResponse(TransferMetadata::Status::kNotEnoughSpace); } @@ -1284,8 +1293,10 @@ TEST_F(IncomingShareSessionTest, SendFailureResponseConnected) { connections_manager_.AcceptConnection( /*endpoint_info=*/{}, kEndpointId, &connection_); session_.OnConnected(&connection_); - EXPECT_CALL(transfer_metadata_callback_, - Call(_, HasStatus(TransferMetadata::Status::kNotEnoughSpace))); + EXPECT_CALL( + transfer_metadata_callback_, + Call(_, AllOf(HasStatus(TransferMetadata::Status::kNotEnoughSpace), + HasUsage(ShareSessionUsage::kSharing)))); std::queue> frames_data; connections_manager_.set_send_payload_callback( [&](std::unique_ptr payload, diff --git a/sharing/nearby_sharing_service_impl.cc b/sharing/nearby_sharing_service_impl.cc index dbcb557b..bba46979 100644 --- a/sharing/nearby_sharing_service_impl.cc +++ b/sharing/nearby_sharing_service_impl.cc @@ -97,6 +97,7 @@ #include "sharing/proto/wire_format.pb.h" #include "sharing/scheduling/nearby_share_scheduler_utils.h" #include "sharing/share_session.h" +#include "sharing/share_session_usage.h" #include "sharing/share_target.h" #include "sharing/share_target_discovered_callback.h" #include "sharing/thread_timer.h" @@ -858,6 +859,7 @@ void NearbySharingServiceImpl::Reject( session->UpdateTransferMetadata( TransferMetadataBuilder() + .set_usage(session->session_usage()) .set_status(TransferMetadata::Status::kRejected) .build()); @@ -914,6 +916,7 @@ void NearbySharingServiceImpl::DoCancel( // UpdateTransferMetadata. session->UpdateTransferMetadata( TransferMetadataBuilder() + .set_usage(session->session_usage()) .set_status(TransferMetadata::Status::kCancelled) .build()); @@ -2582,6 +2585,7 @@ void NearbySharingServiceImpl::BeginOutgoingTransfer( } else { session.UpdateTransferMetadata( TransferMetadataBuilder() + .set_usage(session.session_usage()) .set_status(TransferMetadata::Status::kAwaitingLocalConfirmation) .set_token(session.token()) .build()); @@ -2592,6 +2596,7 @@ void NearbySharingServiceImpl::BeginOutgoingPairing( OutgoingShareSession& session) { VLOG(1) << __func__ << ": Preparing to initiate pairing with " << session.share_target().id; + session.set_session_usage(ShareSessionUsage::kPairing); // Verify that remote really authenticated with self share certificate. if (!session.self_share()) { LOG(WARNING) << __func__ << ": Not self share, skipping pairing."; @@ -2663,6 +2668,8 @@ void NearbySharingServiceImpl::OnPeerSyncBindingComplete( sync_manager_.AddSyncBinding(binding); session->UpdateTransferMetadata( TransferMetadataBuilder() + .set_usage(session->session_usage()) + .set_binding_id(binding_id) .set_status(TransferMetadata::Status::kComplete) .build()); } @@ -2899,6 +2906,7 @@ void NearbySharingServiceImpl::OnIncomingFilesMetadataUpdated( int64_t share_target_id, TransferMetadata metadata, bool success) { if (!success) { metadata = TransferMetadataBuilder() + .set_usage(metadata.usage()) .set_status(TransferMetadata::Status::kIncompletePayloads) .build(); } diff --git a/sharing/outgoing_share_session.cc b/sharing/outgoing_share_session.cc index 38e845e4..7b9b52a9 100644 --- a/sharing/outgoing_share_session.cc +++ b/sharing/outgoing_share_session.cc @@ -43,6 +43,7 @@ #include "sharing/payload_tracker.h" #include "sharing/proto/wire_format.pb.h" #include "sharing/share_session.h" +#include "sharing/share_session_usage.h" #include "sharing/share_target.h" #include "sharing/text_attachment.h" #include "sharing/thread_timer.h" @@ -185,6 +186,7 @@ bool OutgoingShareSession::InitiateSendAttachments( "create payloads."; UpdateTransferMetadata( TransferMetadataBuilder() + .set_usage(session_usage()) .set_status(TransferMetadata::Status::kMediaUnavailable) .build()); } @@ -334,6 +336,7 @@ bool OutgoingShareSession::AcceptTransfer( // Wait for remote accept in response frame. UpdateTransferMetadata( TransferMetadataBuilder() + .set_usage(session_usage()) .set_token(token()) .set_status(TransferMetadata::Status::kAwaitingRemoteAcceptance) .build()); @@ -408,6 +411,7 @@ void OutgoingShareSession::SendAttachmentsCompleted( bool OutgoingShareSession::SendIntroduction( std::function timeout_callback) { + set_session_usage(ShareSessionUsage::kSharing); Frame frame; frame.set_version(Frame::V1); V1Frame* v1_frame = frame.mutable_v1(); @@ -450,6 +454,7 @@ OutgoingShareSession::HandleConnectionResponse( case ConnectionResponseFrame::ACCEPT: { UpdateTransferMetadata( TransferMetadataBuilder() + .set_usage(session_usage()) .set_status(TransferMetadata::Status::kInProgress) .build()); return std::nullopt; @@ -551,6 +556,7 @@ void OutgoingShareSession::Connect( // Send process initialized successfully, from now on status updated // will be sent out via TransferUpdates. UpdateTransferMetadata(TransferMetadataBuilder() + .set_usage(session_usage()) .set_status(TransferMetadata::Status::kConnecting) .build()); connection_start_time_ = clock().Now(); @@ -627,12 +633,15 @@ OutgoingShareSession::ProcessPayloadTransferUpdates() { return std::nullopt; } - std::optional metadata; + std::optional metadata_builder; for (; !updates.empty(); updates.pop()) { - metadata = + metadata_builder = get_payload_tracker()->ProcessPayloadUpdate(std::move(updates.front())); } - return metadata; + return metadata_builder.has_value() + ? std::make_optional( + metadata_builder->set_usage(session_usage()).build()) + : std::nullopt; } void OutgoingShareSession::StartPeerBinding( @@ -650,6 +659,7 @@ void OutgoingShareSession::StartPeerBinding( LOG(INFO) << "Waiting for bindings response frame from " << share_target().id; UpdateTransferMetadata( TransferMetadataBuilder() + .set_usage(session_usage()) .set_token(token()) .set_status(TransferMetadata::Status::kAwaitingRemoteAcceptance) .build()); diff --git a/sharing/outgoing_share_session_test.cc b/sharing/outgoing_share_session_test.cc index 670bd680..38157909 100644 --- a/sharing/outgoing_share_session_test.cc +++ b/sharing/outgoing_share_session_test.cc @@ -49,6 +49,7 @@ #include "sharing/proto/analytics/nearby_sharing_log.pb.h" #include "sharing/proto/analytics/nearby_sharing_log.proto.static_reflection.h" #include "sharing/proto/wire_format.pb.h" +#include "sharing/share_session_usage.h" #include "sharing/share_target.h" #include "sharing/text_attachment.h" #include "sharing/transfer_metadata.h" @@ -923,6 +924,7 @@ TEST_F(OutgoingShareSessionTest, TEST_F(OutgoingShareSessionTest, StartPeerBindingSuccess) { session_.set_session_id(1234); + session_.set_session_usage(ShareSessionUsage::kPairing); NearbyConnectionImpl connection(device_info_); ConnectionSuccess(&connection); Frame expected_binding_request_frame = @@ -948,7 +950,9 @@ TEST_F(OutgoingShareSessionTest, StartPeerBindingSuccess) { }); EXPECT_CALL( transfer_metadata_callback_, - Call(_, HasStatus(TransferMetadata::Status::kAwaitingRemoteAcceptance))); + Call(_, + AllOf(HasStatus(TransferMetadata::Status::kAwaitingRemoteAcceptance), + HasUsage(ShareSessionUsage::kPairing)))); BindingResponse::Status binding_response_status = BindingResponse::FAILURE; session_.StartPeerBinding("test_binding_id", BindingRequest::FILESYNC, @@ -988,6 +992,7 @@ TEST_F(OutgoingShareSessionTest, StartPeerBindingSuccess) { TEST_F(OutgoingShareSessionTest, StartPeerBindingTimeout) { session_.set_session_id(1234); + session_.set_session_usage(ShareSessionUsage::kPairing); NearbyConnectionImpl connection(device_info_); ConnectionSuccess(&connection); Frame expected_binding_request_frame = @@ -1013,7 +1018,9 @@ TEST_F(OutgoingShareSessionTest, StartPeerBindingTimeout) { }); EXPECT_CALL( transfer_metadata_callback_, - Call(_, HasStatus(TransferMetadata::Status::kAwaitingRemoteAcceptance))); + Call(_, + AllOf(HasStatus(TransferMetadata::Status::kAwaitingRemoteAcceptance), + HasUsage(ShareSessionUsage::kPairing)))); BindingResponse::Status binding_response_status = BindingResponse::FAILURE; session_.StartPeerBinding("test_binding_id", BindingRequest::FILESYNC, @@ -1036,6 +1043,7 @@ TEST_F(OutgoingShareSessionTest, StartPeerBindingTimeout) { TEST_F(OutgoingShareSessionTest, StartPeerBindingFailure) { session_.set_session_id(1234); + session_.set_session_usage(ShareSessionUsage::kPairing); NearbyConnectionImpl connection(device_info_); ConnectionSuccess(&connection); Frame expected_binding_request_frame = @@ -1061,7 +1069,9 @@ TEST_F(OutgoingShareSessionTest, StartPeerBindingFailure) { }); EXPECT_CALL( transfer_metadata_callback_, - Call(_, HasStatus(TransferMetadata::Status::kAwaitingRemoteAcceptance))); + Call(_, + AllOf(HasStatus(TransferMetadata::Status::kAwaitingRemoteAcceptance), + HasUsage(ShareSessionUsage::kPairing)))); BindingResponse::Status binding_response_status = BindingResponse::FAILURE; session_.StartPeerBinding("test_binding_id", BindingRequest::FILESYNC, diff --git a/sharing/payload_tracker.cc b/sharing/payload_tracker.cc index e05b4818..345a87a6 100644 --- a/sharing/payload_tracker.cc +++ b/sharing/payload_tracker.cc @@ -107,7 +107,7 @@ void PayloadTracker::OnStatusUpdate( payload_update_queue_->Queue(std::move(update)); } -std::optional PayloadTracker::ProcessPayloadUpdate( +std::optional PayloadTracker::ProcessPayloadUpdate( std::unique_ptr update) { auto it = payload_state_.find(update->payload_id); if (it == payload_state_.end()) { @@ -139,34 +139,31 @@ std::optional PayloadTracker::ProcessPayloadUpdate( return OnTransferUpdate(state); } -std::optional PayloadTracker::OnTransferUpdate( +std::optional PayloadTracker::OnTransferUpdate( const State& state) { if (IsComplete()) { VLOG(1) << __func__ << ": All payloads are complete."; - return TransferMetadataBuilder() + return std::move(TransferMetadataBuilder() .set_status(TransferMetadata::Status::kComplete) .set_progress(100) .set_total_attachments_count(payload_state_.size()) - .set_transferred_attachments_count(transferred_attachments_count_) - .build(); + .set_transferred_attachments_count(transferred_attachments_count_)); } if (IsCancelled(state)) { VLOG(1) << __func__ << ": Payloads cancelled."; - return TransferMetadataBuilder() + return std::move(TransferMetadataBuilder() .set_status(TransferMetadata::Status::kCancelled) .set_total_attachments_count(payload_state_.size()) - .set_transferred_attachments_count(transferred_attachments_count_) - .build(); + .set_transferred_attachments_count(transferred_attachments_count_)); } if (HasFailed(state)) { VLOG(1) << __func__ << ": Payloads failed."; - return TransferMetadataBuilder() + return std::move(TransferMetadataBuilder() .set_status(TransferMetadata::Status::kFailed) .set_total_attachments_count(payload_state_.size()) - .set_transferred_attachments_count(transferred_attachments_count_) - .build(); + .set_transferred_attachments_count(transferred_attachments_count_)); } double percent = CalculateProgressPercent(state); @@ -220,7 +217,7 @@ std::optional PayloadTracker::OnTransferUpdate( last_update_progress_ = current_progress; - return TransferMetadataBuilder() + return std::move(TransferMetadataBuilder() .set_status(TransferMetadata::Status::kInProgress) .set_progress(percent) .set_transferred_bytes(current_transferred_size) @@ -230,8 +227,7 @@ std::optional PayloadTracker::OnTransferUpdate( .set_transferred_attachments_count(transferred_attachments_count_) .set_in_progress_attachment_id(state.attachment_id) .set_in_progress_attachment_total_bytes(state.total_size) - .set_in_progress_attachment_transferred_bytes(state.amount_transferred) - .build(); + .set_in_progress_attachment_transferred_bytes(state.amount_transferred)); } bool PayloadTracker::IsComplete() const { diff --git a/sharing/payload_tracker.h b/sharing/payload_tracker.h index 4f73e4e6..e27025e0 100644 --- a/sharing/payload_tracker.h +++ b/sharing/payload_tracker.h @@ -27,7 +27,7 @@ #include "sharing/attachment_container.h" #include "sharing/nearby_connections_manager.h" #include "sharing/nearby_connections_types.h" -#include "sharing/transfer_metadata.h" +#include "sharing/transfer_metadata_builder.h" #include "sharing/worker_queue.h" namespace nearby { @@ -46,7 +46,7 @@ class PayloadTracker : public NearbyConnectionsManager::PayloadStatusListener { std::unique_ptr payload_queue); ~PayloadTracker() override; - std::optional ProcessPayloadUpdate( + std::optional ProcessPayloadUpdate( std::unique_ptr update); // NearbyConnectionsManager::PayloadStatusListener: @@ -64,7 +64,7 @@ class PayloadTracker : public NearbyConnectionsManager::PayloadStatusListener { PayloadStatus status = PayloadStatus::kInProgress; }; - std::optional OnTransferUpdate(const State& state); + std::optional OnTransferUpdate(const State& state); bool IsComplete() const; bool IsCancelled(const State& state) const; diff --git a/sharing/payload_tracker_test.cc b/sharing/payload_tracker_test.cc index 73cac929..8b21d2ba 100644 --- a/sharing/payload_tracker_test.cc +++ b/sharing/payload_tracker_test.cc @@ -32,6 +32,7 @@ #include "sharing/nearby_connections_types.h" #include "sharing/proto/wire_format.pb.h" #include "sharing/transfer_metadata.h" +#include "sharing/transfer_metadata_builder.h" namespace nearby::sharing { namespace { @@ -69,7 +70,12 @@ class PayloadTrackerTest : public ::testing::Test { auto transfer_update = std::make_unique( /*payload_id=*/kFileId, PayloadStatus::kInProgress, /*total_bytes=*/kFileSize, /*bytes_transferred=*/bytes_transferred); - return payload_tracker_->ProcessPayloadUpdate(std::move(transfer_update)); + std::optional metadata_builder = + payload_tracker_->ProcessPayloadUpdate(std::move(transfer_update)); + if (!metadata_builder.has_value()) { + return std::nullopt; + } + return metadata_builder->build(); } private: diff --git a/sharing/share_session.cc b/sharing/share_session.cc index 885e8396..004b3779 100644 --- a/sharing/share_session.cc +++ b/sharing/share_session.cc @@ -176,7 +176,10 @@ void ShareSession::Abort(TransferMetadata::Status status) { // First invoke the appropriate transfer callback with the final // |status|. - UpdateTransferMetadata(TransferMetadataBuilder().set_status(status).build()); + UpdateTransferMetadata(TransferMetadataBuilder() + .set_usage(session_usage()) + .set_status(status) + .build()); Disconnect(); } @@ -246,7 +249,10 @@ void ShareSession::OnDisconnect() { OnConnectionDisconnected(); if (disconnect_status_ != TransferMetadata::Status::kUnknown) { UpdateTransferMetadata( - TransferMetadataBuilder().set_status(disconnect_status_).build()); + TransferMetadataBuilder() + .set_usage(session_usage()) + .set_status(disconnect_status_) + .build()); } connection_ = nullptr; } diff --git a/sharing/share_session.h b/sharing/share_session.h index d0dc0f03..0a6675d7 100644 --- a/sharing/share_session.h +++ b/sharing/share_session.h @@ -38,6 +38,7 @@ #include "sharing/paired_key_verification_runner.h" #include "sharing/payload_tracker.h" #include "sharing/proto/wire_format.pb.h" +#include "sharing/share_session_usage.h" #include "sharing/share_target.h" #include "sharing/transfer_metadata.h" @@ -96,6 +97,11 @@ class ShareSession { const ShareTarget& share_target() const { return share_target_; } + ShareSessionUsage session_usage() const { return session_usage_; } + void set_session_usage(ShareSessionUsage session_usage) { + session_usage_ = session_usage; + } + // Sets the status to send in the TransferMetadataUpdate on connection // disconnect. If |status| is kUnknown, then no TransferMetadataUpdate will be // sent. If |status| is set, it must be a final status. @@ -221,6 +227,7 @@ class ShareSession { absl::flat_hash_map attachment_payload_map_; PayloadTracker::PayloadUpdateQueue* payload_updates_queue_ = nullptr; bool is_cancelled_ = false; + ShareSessionUsage session_usage_ = ShareSessionUsage::kUnknown; }; } // namespace nearby::sharing diff --git a/sharing/share_session_usage.h b/sharing/share_session_usage.h new file mode 100644 index 00000000..0a2e2ded --- /dev/null +++ b/sharing/share_session_usage.h @@ -0,0 +1,45 @@ +// Copyright 2026 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef THIRD_PARTY_NEARBY_SHARING_SHARE_SESSION_USAGE_H_ +#define THIRD_PARTY_NEARBY_SHARING_SHARE_SESSION_USAGE_H_ + +#include + +namespace nearby::sharing { + +enum class ShareSessionUsage { + kUnknown, + kSharing, // Connection is used for quick share. + kPairing, // Connection is used for setting up a binding. + kFileSync, // Connection is used for file sync. +}; + +inline std::string ShareSessionUsageToString( + ShareSessionUsage transfer_usage) { + switch (transfer_usage) { + case ShareSessionUsage::kSharing: + return "Sharing"; + case ShareSessionUsage::kPairing: + return "Pairing"; + case ShareSessionUsage::kFileSync: + return "FileSync"; + case ShareSessionUsage::kUnknown: + return "Unknown"; + } +} + +} // namespace nearby::sharing + +#endif // THIRD_PARTY_NEARBY_SHARING_SHARE_SESSION_USAGE_H_ diff --git a/sharing/transfer_metadata.cc b/sharing/transfer_metadata.cc index 82462b89..d62e2a9e 100644 --- a/sharing/transfer_metadata.cc +++ b/sharing/transfer_metadata.cc @@ -24,9 +24,10 @@ #include "absl/strings/str_cat.h" #include "absl/strings/str_format.h" #include "absl/strings/str_join.h" +#include "absl/strings/string_view.h" +#include "sharing/share_session_usage.h" -namespace nearby { -namespace sharing { +namespace nearby::sharing { // static bool TransferMetadata::IsFinalStatus(Status status) { @@ -90,15 +91,17 @@ std::string TransferMetadata::StatusToString(Status status) { // LINT.ThenChange(//depot/google3/location/nearby/cpp/sharing/clients/dart/platform/lib/types/transfer_status.dart) TransferMetadata::TransferMetadata( - Status status, float progress, std::optional token, - bool is_original, bool is_final_status, bool is_self_share, - uint64_t transferred_bytes, uint64_t transfer_speed, + ShareSessionUsage usage, Status status, float progress, + std::optional token, bool is_original, bool is_final_status, + bool is_self_share, uint64_t transferred_bytes, uint64_t transfer_speed, uint64_t estimated_time_remaining, int total_attachments_count, int transferred_attachments_count, std::optional in_progress_attachment_id, std::optional in_progress_attachment_transferred_bytes, - std::optional in_progress_attachment_total_bytes) - : status_(status), + std::optional in_progress_attachment_total_bytes, + absl::string_view binding_id) + : usage_(usage), + status_(status), progress_(progress), token_(std::move(token)), is_original_(is_original), @@ -112,7 +115,8 @@ TransferMetadata::TransferMetadata( in_progress_attachment_id_(in_progress_attachment_id), in_progress_attachment_transferred_bytes_( in_progress_attachment_transferred_bytes), - in_progress_attachment_total_bytes_(in_progress_attachment_total_bytes) {} + in_progress_attachment_total_bytes_(in_progress_attachment_total_bytes), + binding_id_(binding_id) {} TransferMetadata::~TransferMetadata() = default; @@ -123,22 +127,26 @@ TransferMetadata& TransferMetadata::operator=(const TransferMetadata&) = std::string TransferMetadata::ToString() const { std::vector fmt; - + fmt.push_back( + absl::StrFormat("usage: %s", ShareSessionUsageToString(usage_))); fmt.push_back(absl::StrFormat("status: %s", StatusToString(status_))); - fmt.push_back(absl::StrFormat("progress: %.2f", progress_)); - if (token_) { - fmt.push_back(absl::StrFormat("token: %s", *token_)); - } - fmt.push_back(absl::StrFormat("is_original: %d", is_original_)); fmt.push_back(absl::StrFormat("is_final_status: %d", is_final_status_)); fmt.push_back(absl::StrFormat("is_self_share: %d", is_self_share_)); - fmt.push_back(absl::StrFormat("transferred_bytes: %d", transferred_bytes_)); - fmt.push_back(absl::StrFormat("transfer_speed: %d", transfer_speed_)); - fmt.push_back(absl::StrFormat("estimated_time_remaining: %d", - estimated_time_remaining_)); + if (usage_ != ShareSessionUsage::kPairing) { + fmt.push_back(absl::StrFormat("progress: %.2f", progress_)); + if (token_) { + fmt.push_back(absl::StrFormat("token: %s", *token_)); + } + fmt.push_back(absl::StrFormat("is_original: %d", is_original_)); + fmt.push_back(absl::StrFormat("transferred_bytes: %d", transferred_bytes_)); + fmt.push_back(absl::StrFormat("transfer_speed: %d", transfer_speed_)); + fmt.push_back(absl::StrFormat("estimated_time_remaining: %d", + estimated_time_remaining_)); + } else { + fmt.push_back(absl::StrFormat("binding_id: %s", binding_id_)); + } return absl::StrCat("TransferMetadata<", absl::StrJoin(fmt, ", "), ">"); } -} // namespace sharing -} // namespace nearby +} // namespace nearby::sharing diff --git a/sharing/transfer_metadata.h b/sharing/transfer_metadata.h index 03171a78..bc665e1f 100644 --- a/sharing/transfer_metadata.h +++ b/sharing/transfer_metadata.h @@ -19,6 +19,10 @@ #include #include +#include + +#include "absl/strings/string_view.h" +#include "sharing/share_session_usage.h" namespace nearby { namespace sharing { @@ -50,23 +54,31 @@ class TransferMetadata { // LINT.ThenChange(//depot/google3/location/nearby/cpp/sharing/clients/dart/platform/lib/types/transfer_status.dart) static bool IsFinalStatus(Status status); - static std::string StatusToString(TransferMetadata::Status status); + static std::string StatusToString(Status status); TransferMetadata( - Status status, float progress, std::optional token, - bool is_original, bool is_final_status, bool is_self_share, - uint64_t transferred_bytes, uint64_t transfer_speed, + ShareSessionUsage usage, Status status, float progress, + std::optional token, bool is_original, bool is_final_status, + bool is_self_share, uint64_t transferred_bytes, uint64_t transfer_speed, uint64_t estimated_time_remaining, int total_attachments_count, int transferred_attachments_count, std::optional in_progress_attachment_id, std::optional in_progress_attachment_transferred_bytes, - std::optional in_progress_attachment_total_bytes); + std::optional in_progress_attachment_total_bytes, + absl::string_view binding_id + ); ~TransferMetadata(); TransferMetadata(const TransferMetadata&); TransferMetadata& operator=(const TransferMetadata&); + ShareSessionUsage usage() const { return usage_; } Status status() const { return status_; } + std::string binding_id() const { return binding_id_; } + void set_binding_id(std::string binding_id) { + binding_id_ = std::move(binding_id); + } + // Returns transfer progress as percentage. float progress() const { return progress_; } @@ -118,6 +130,7 @@ class TransferMetadata { } private: + ShareSessionUsage usage_; Status status_; float progress_; std::optional token_; @@ -132,6 +145,9 @@ class TransferMetadata { std::optional in_progress_attachment_id_; std::optional in_progress_attachment_transferred_bytes_; std::optional in_progress_attachment_total_bytes_; + // If usage_ is kPairing and status_ is kComplete, this will be set to the + // binding id. Otherwise, this will be empty. + std::string binding_id_; }; } // namespace sharing diff --git a/sharing/transfer_metadata_builder.cc b/sharing/transfer_metadata_builder.cc index 3f849a2c..0fde6cdf 100644 --- a/sharing/transfer_metadata_builder.cc +++ b/sharing/transfer_metadata_builder.cc @@ -19,6 +19,8 @@ #include #include +#include "absl/strings/string_view.h" +#include "sharing/share_session_usage.h" #include "sharing/transfer_metadata.h" namespace nearby { @@ -27,6 +29,7 @@ namespace sharing { TransferMetadataBuilder TransferMetadataBuilder::Clone( const TransferMetadata& metadata) { TransferMetadataBuilder builder; + builder.usage_ = metadata.usage(); builder.is_original_ = metadata.is_original(); builder.progress_ = metadata.progress(); builder.status_ = metadata.status(); @@ -54,6 +57,18 @@ TransferMetadataBuilder& TransferMetadataBuilder::operator=( TransferMetadataBuilder::~TransferMetadataBuilder() = default; +TransferMetadataBuilder& TransferMetadataBuilder::set_usage( + ShareSessionUsage usage) { + usage_ = usage; + return *this; +} + +TransferMetadataBuilder& TransferMetadataBuilder::set_binding_id( + absl::string_view binding_id) { + binding_id_ = binding_id; + return *this; +} + TransferMetadataBuilder& TransferMetadataBuilder::set_is_original( bool is_original) { is_original_ = is_original; @@ -138,12 +153,12 @@ TransferMetadataBuilder::set_in_progress_attachment_total_bytes( TransferMetadata TransferMetadataBuilder::build() const { return TransferMetadata( - status_, progress_, token_, is_original_, + usage_, status_, progress_, token_, is_original_, TransferMetadata::IsFinalStatus(status_), is_self_share_, transferred_bytes_, transfer_speed_, estimated_time_remaining_, total_attachments_count_, transferred_attachments_count_, in_progress_attachment_id_, in_progress_attachment_transferred_bytes_, - in_progress_attachment_total_bytes_); + in_progress_attachment_total_bytes_, binding_id_); } } // namespace sharing diff --git a/sharing/transfer_metadata_builder.h b/sharing/transfer_metadata_builder.h index 208a8cca..aaaebf42 100644 --- a/sharing/transfer_metadata_builder.h +++ b/sharing/transfer_metadata_builder.h @@ -20,6 +20,8 @@ #include #include +#include "absl/strings/string_view.h" +#include "sharing/share_session_usage.h" #include "sharing/transfer_metadata.h" namespace nearby { @@ -34,6 +36,10 @@ class TransferMetadataBuilder { TransferMetadataBuilder& operator=(TransferMetadataBuilder&&); ~TransferMetadataBuilder(); + TransferMetadataBuilder& set_usage(ShareSessionUsage usage); + + TransferMetadataBuilder& set_binding_id(absl::string_view binding_id); + TransferMetadataBuilder& set_is_original(bool is_original); TransferMetadataBuilder& set_progress(double progress); @@ -69,6 +75,7 @@ class TransferMetadataBuilder { TransferMetadata build() const; private: + ShareSessionUsage usage_ = ShareSessionUsage::kUnknown; bool is_original_ = false; double progress_ = 0; TransferMetadata::Status status_ = TransferMetadata::Status::kInProgress; @@ -83,6 +90,7 @@ class TransferMetadataBuilder { std::optional in_progress_attachment_transferred_bytes_ = std::nullopt; std::optional in_progress_attachment_total_bytes_ = std::nullopt; + std::string binding_id_; }; } // namespace sharing diff --git a/sharing/transfer_metadata_matchers.h b/sharing/transfer_metadata_matchers.h index 64921792..9e85348b 100644 --- a/sharing/transfer_metadata_matchers.h +++ b/sharing/transfer_metadata_matchers.h @@ -23,6 +23,11 @@ MATCHER_P(HasStatus, status, "has status") { return arg.status() == status; } +MATCHER_P(HasUsage, usage, "has usage") { + return arg.usage() == usage; +} + + MATCHER(IsFinalStatus, "is final") { return arg.is_final_status(); } diff --git a/sharing/transfer_metadata_test.cc b/sharing/transfer_metadata_test.cc index ef2d7493..09721dcc 100644 --- a/sharing/transfer_metadata_test.cc +++ b/sharing/transfer_metadata_test.cc @@ -19,6 +19,7 @@ #include #include "gtest/gtest.h" +#include "sharing/share_session_usage.h" namespace nearby { namespace sharing { @@ -34,6 +35,7 @@ std::vector GetTestData() { kTransferMetadataToStringTestData = new std::vector({ {TransferMetadata( + ShareSessionUsage::kSharing, TransferMetadata::Status::kConnecting, /*progress=*/12.321f, /*token=*/std::nullopt, /*is_original=*/true, /*is_final_status=*/false, @@ -45,12 +47,14 @@ std::vector GetTestData() { /*transferred_attachments_count=*/0, /*in_progress_attachment_id=*/std::nullopt, /*in_progress_attachment_transferred_bytes=*/std::nullopt, - /*in_progress_attachment_total_bytes=*/std::nullopt), - "TransferMetadata"}, + /*in_progress_attachment_total_bytes=*/std::nullopt, + /*binding_id=*/""), + "TransferMetadata"}, {TransferMetadata( + ShareSessionUsage::kSharing, TransferMetadata::Status::kCancelled, /*progress=*/77.795f, std::optional{"test_token"}, @@ -62,11 +66,51 @@ std::vector GetTestData() { /*transferred_attachments_count=*/0, /*in_progress_attachment_id=*/std::nullopt, /*in_progress_attachment_transferred_bytes=*/std::nullopt, - /*in_progress_attachment_total_bytes=*/std::nullopt), - "TransferMetadata"}, + {TransferMetadata( + ShareSessionUsage::kFileSync, + TransferMetadata::Status::kCancelled, + /*progress=*/77.795f, + std::optional{"test_token"}, + /*is_original=*/false, + /*is_final_status=*/true, /*is_self_share=*/true, + /*transferred_bytes=*/123456789, /*transfer_speed=*/0, + /*estimated_time_remaining=*/123456789, + /*total_attachments_count=*/1, + /*transferred_attachments_count=*/0, + /*in_progress_attachment_id=*/std::nullopt, + /*in_progress_attachment_transferred_bytes=*/std::nullopt, + /*in_progress_attachment_total_bytes=*/std::nullopt, + /*binding_id=*/""), + "TransferMetadata"}, + {TransferMetadata( + ShareSessionUsage::kPairing, + TransferMetadata::Status::kComplete, + /*progress=*/0.0f, + std::optional{"test_token"}, + /*is_original=*/false, + /*is_final_status=*/true, /*is_self_share=*/true, + /*transferred_bytes=*/0, /*transfer_speed=*/0, + /*estimated_time_remaining=*/0, + /*total_attachments_count=*/0, + /*transferred_attachments_count=*/0, + /*in_progress_attachment_id=*/std::nullopt, + /*in_progress_attachment_transferred_bytes=*/std::nullopt, + /*in_progress_attachment_total_bytes=*/std::nullopt, + /*binding_id=*/"test_binding_id"), + "TransferMetadata"}, }); return *kTransferMetadataToStringTestData; @@ -80,7 +124,7 @@ TEST_P(TransferMetadataToStringTest, ToStringResultMatches) { GetParam().transfer_metadata.ToString()); } -INSTANTIATE_TEST_CASE_P(TransferMetadataToStringTest, +INSTANTIATE_TEST_SUITE_P(TransferMetadataToStringTest, TransferMetadataToStringTest, testing::ValuesIn(GetTestData()));