Add usage and binding id to TransferMetadata.

PiperOrigin-RevId: 911439518
This commit is contained in:
Francis Tsui
2026-05-06 11:12:19 -07:00
committed by Copybara-Service
parent eddff719b9
commit d026aed3e2
18 changed files with 306 additions and 83 deletions
+17 -1
View File
@@ -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",
+21 -9
View File
@@ -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<TransferMetadata>
@@ -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<TransferMetadata> metadata;
std::optional<TransferMetadataBuilder> 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) {
+21 -10
View File
@@ -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<const SharingLog&>(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<std::vector<uint8_t>> frames_data;
connections_manager_.set_send_payload_callback(
[&](std::unique_ptr<Payload> payload,
+8
View File
@@ -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();
}
+13 -3
View File
@@ -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<void()> 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<TransferMetadata> metadata;
std::optional<TransferMetadataBuilder> 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());
+13 -3
View File
@@ -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,
+10 -14
View File
@@ -107,7 +107,7 @@ void PayloadTracker::OnStatusUpdate(
payload_update_queue_->Queue(std::move(update));
}
std::optional<TransferMetadata> PayloadTracker::ProcessPayloadUpdate(
std::optional<TransferMetadataBuilder> PayloadTracker::ProcessPayloadUpdate(
std::unique_ptr<PayloadTransferUpdate> update) {
auto it = payload_state_.find(update->payload_id);
if (it == payload_state_.end()) {
@@ -139,34 +139,31 @@ std::optional<TransferMetadata> PayloadTracker::ProcessPayloadUpdate(
return OnTransferUpdate(state);
}
std::optional<TransferMetadata> PayloadTracker::OnTransferUpdate(
std::optional<TransferMetadataBuilder> 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<TransferMetadata> 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<TransferMetadata> 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 {
+3 -3
View File
@@ -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<PayloadUpdateQueue> payload_queue);
~PayloadTracker() override;
std::optional<TransferMetadata> ProcessPayloadUpdate(
std::optional<TransferMetadataBuilder> ProcessPayloadUpdate(
std::unique_ptr<PayloadTransferUpdate> update);
// NearbyConnectionsManager::PayloadStatusListener:
@@ -64,7 +64,7 @@ class PayloadTracker : public NearbyConnectionsManager::PayloadStatusListener {
PayloadStatus status = PayloadStatus::kInProgress;
};
std::optional<TransferMetadata> OnTransferUpdate(const State& state);
std::optional<TransferMetadataBuilder> OnTransferUpdate(const State& state);
bool IsComplete() const;
bool IsCancelled(const State& state) const;
+7 -1
View File
@@ -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<PayloadTransferUpdate>(
/*payload_id=*/kFileId, PayloadStatus::kInProgress,
/*total_bytes=*/kFileSize, /*bytes_transferred=*/bytes_transferred);
return payload_tracker_->ProcessPayloadUpdate(std::move(transfer_update));
std::optional<TransferMetadataBuilder> metadata_builder =
payload_tracker_->ProcessPayloadUpdate(std::move(transfer_update));
if (!metadata_builder.has_value()) {
return std::nullopt;
}
return metadata_builder->build();
}
private:
+8 -2
View File
@@ -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;
}
+7
View File
@@ -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<int64_t, int64_t> attachment_payload_map_;
PayloadTracker::PayloadUpdateQueue* payload_updates_queue_ = nullptr;
bool is_cancelled_ = false;
ShareSessionUsage session_usage_ = ShareSessionUsage::kUnknown;
};
} // namespace nearby::sharing
+45
View File
@@ -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 <string>
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_
+28 -20
View File
@@ -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<std::string> 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<std::string> 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<int64_t> in_progress_attachment_id,
std::optional<uint64_t> in_progress_attachment_transferred_bytes,
std::optional<uint64_t> in_progress_attachment_total_bytes)
: status_(status),
std::optional<uint64_t> 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<std::string> 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
+21 -5
View File
@@ -19,6 +19,10 @@
#include <optional>
#include <string>
#include <utility>
#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<std::string> 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<std::string> 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<int64_t> in_progress_attachment_id,
std::optional<uint64_t> in_progress_attachment_transferred_bytes,
std::optional<uint64_t> in_progress_attachment_total_bytes);
std::optional<uint64_t> 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<std::string> token_;
@@ -132,6 +145,9 @@ class TransferMetadata {
std::optional<int64_t> in_progress_attachment_id_;
std::optional<uint64_t> in_progress_attachment_transferred_bytes_;
std::optional<uint64_t> 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
+17 -2
View File
@@ -19,6 +19,8 @@
#include <string>
#include <utility>
#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
+8
View File
@@ -20,6 +20,8 @@
#include <optional>
#include <string>
#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<uint64_t> in_progress_attachment_transferred_bytes_ =
std::nullopt;
std::optional<uint64_t> in_progress_attachment_total_bytes_ = std::nullopt;
std::string binding_id_;
};
} // namespace sharing
+5
View File
@@ -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();
}
+54 -10
View File
@@ -19,6 +19,7 @@
#include <vector>
#include "gtest/gtest.h"
#include "sharing/share_session_usage.h"
namespace nearby {
namespace sharing {
@@ -34,6 +35,7 @@ std::vector<TransferMetadataToStringTestData> GetTestData() {
kTransferMetadataToStringTestData =
new std::vector<TransferMetadataToStringTestData>({
{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<TransferMetadataToStringTestData> 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<status: kConnecting, progress: 12.32, "
"is_original: 1, is_final_status: 0, is_self_share: 0, "
"transferred_bytes: 123456789, transfer_speed: 300000, "
"estimated_time_remaining: 123456>"},
/*in_progress_attachment_total_bytes=*/std::nullopt,
/*binding_id=*/""),
"TransferMetadata<usage: Sharing, status: kConnecting, "
"is_final_status: 0, is_self_share: 0, progress: 12.32, "
"is_original: 1, transferred_bytes: 123456789, "
"transfer_speed: 300000, estimated_time_remaining: 123456>"},
{TransferMetadata(
ShareSessionUsage::kSharing,
TransferMetadata::Status::kCancelled,
/*progress=*/77.795f,
std::optional<std::string>{"test_token"},
@@ -62,11 +66,51 @@ std::vector<TransferMetadataToStringTestData> 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<status: kCancelled, progress: 77.79, token: "
"test_token, is_original: 0, is_final_status: 1, is_self_share: "
"1, transferred_bytes: 123456789, transfer_speed: 0, "
/*in_progress_attachment_total_bytes=*/std::nullopt,
/*binding_id=*/""),
"TransferMetadata<usage: Sharing, status: kCancelled, "
"is_final_status: 1, is_self_share: 1, progress: 77.79, "
"token: test_token, is_original: 0, "
"transferred_bytes: 123456789, transfer_speed: 0, "
"estimated_time_remaining: 123456789>"},
{TransferMetadata(
ShareSessionUsage::kFileSync,
TransferMetadata::Status::kCancelled,
/*progress=*/77.795f,
std::optional<std::string>{"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<usage: FileSync, status: kCancelled, "
"is_final_status: 1, is_self_share: 1, progress: 77.79, "
"token: test_token, is_original: 0, "
"transferred_bytes: 123456789, transfer_speed: 0, "
"estimated_time_remaining: 123456789>"},
{TransferMetadata(
ShareSessionUsage::kPairing,
TransferMetadata::Status::kComplete,
/*progress=*/0.0f,
std::optional<std::string>{"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<usage: Pairing, status: kComplete, "
"is_final_status: 1, is_self_share: 1, "
"binding_id: test_binding_id>"},
});
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()));