Commit 75a006b7 authored by Richard Knoll's avatar Richard Knoll Committed by Commit Bot

[Nearby] Correctly set is_final_status

The final status flag is determined by the transfer status. Additionally
this CL adds a Clone() method to TransferMetadataBuilder to be able to
update fields from already build TransferMetadata objects.

Bug: 1085067
Change-Id: Ie4a3cb335897f477329bc21189c33530ee7848ec
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2349848Reviewed-by: default avatarAlex Chau <alexchau@chromium.org>
Commit-Queue: Richard Knoll <knollr@chromium.org>
Cr-Commit-Position: refs/heads/master@{#797243}
parent ac08cb5c
...@@ -623,7 +623,6 @@ TEST_F(NearbyNotificationManagerTest, ProgressNotification_Cancelled) { ...@@ -623,7 +623,6 @@ TEST_F(NearbyNotificationManagerTest, ProgressNotification_Cancelled) {
manager()->OnTransferUpdate( manager()->OnTransferUpdate(
share_target, TransferMetadataBuilder() share_target, TransferMetadataBuilder()
.set_status(TransferMetadata::Status::kCancelled) .set_status(TransferMetadata::Status::kCancelled)
.set_is_final_status(true)
.build()); .build());
// Notification should be closed. // Notification should be closed.
......
...@@ -44,6 +44,12 @@ void NearbyPerSessionDiscoveryManager::OnTransferUpdate( ...@@ -44,6 +44,12 @@ void NearbyPerSessionDiscoveryManager::OnTransferUpdate(
/*token=*/base::nullopt, mojo::NullRemote()); /*token=*/base::nullopt, mojo::NullRemote());
break; break;
default: default:
if (transfer_metadata.is_final_status() &&
select_share_target_callback_) {
std::move(select_share_target_callback_)
.Run(nearby_share::mojom::SelectShareTargetResult::kError,
/*token=*/base::nullopt, mojo::NullRemote());
}
break; break;
} }
} }
...@@ -64,29 +70,29 @@ void NearbyPerSessionDiscoveryManager::OnShareTargetLost( ...@@ -64,29 +70,29 @@ void NearbyPerSessionDiscoveryManager::OnShareTargetLost(
void NearbyPerSessionDiscoveryManager::StartDiscovery( void NearbyPerSessionDiscoveryManager::StartDiscovery(
mojo::PendingRemote<nearby_share::mojom::ShareTargetListener> listener, mojo::PendingRemote<nearby_share::mojom::ShareTargetListener> listener,
StartDiscoveryCallback callback) { StartDiscoveryCallback callback) {
DCHECK(!share_target_listener_.is_bound()); share_target_listener_.Bind(std::move(listener));
// |share_target_listener_| owns the callbacks and is guaranteed to be
// destroyed before |this|, therefore making base::Unretained() safe to use.
share_target_listener_.set_disconnect_handler(
base::BindOnce(&NearbyPerSessionDiscoveryManager::UnregisterSendSurface,
base::Unretained(this)));
if (nearby_sharing_service_->RegisterSendSurface( if (nearby_sharing_service_->RegisterSendSurface(
this, this, NearbySharingService::SendSurfaceState::kForeground) != this, this, NearbySharingService::SendSurfaceState::kForeground) !=
NearbySharingService::StatusCodes::kOk) { NearbySharingService::StatusCodes::kOk) {
NS_LOG(WARNING) << "Failed to register send surface"; NS_LOG(WARNING) << "Failed to register send surface";
share_target_listener_.reset();
std::move(callback).Run(/*success=*/false); std::move(callback).Run(/*success=*/false);
return; return;
} }
share_target_listener_.Bind(std::move(listener));
// |share_target_listener_| owns the callbacks and is guaranteed to be
// destroyed before |this|, therefore making base::Unretained() safe to use.
share_target_listener_.set_disconnect_handler(
base::BindOnce(&NearbyPerSessionDiscoveryManager::UnregisterSendSurface,
base::Unretained(this)));
std::move(callback).Run(/*success=*/true); std::move(callback).Run(/*success=*/true);
} }
void NearbyPerSessionDiscoveryManager::SelectShareTarget( void NearbyPerSessionDiscoveryManager::SelectShareTarget(
const base::UnguessableToken& share_target_id, const base::UnguessableToken& share_target_id,
SelectShareTargetCallback callback) { SelectShareTargetCallback callback) {
DCHECK(share_target_listener_.is_bound());
DCHECK(!select_share_target_callback_); DCHECK(!select_share_target_callback_);
auto iter = discovered_share_targets_.find(share_target_id); auto iter = discovered_share_targets_.find(share_target_id);
...@@ -108,7 +114,10 @@ void NearbyPerSessionDiscoveryManager::SelectShareTarget( ...@@ -108,7 +114,10 @@ void NearbyPerSessionDiscoveryManager::SelectShareTarget(
void NearbyPerSessionDiscoveryManager::OnSend( void NearbyPerSessionDiscoveryManager::OnSend(
NearbySharingService::StatusCodes status) { NearbySharingService::StatusCodes status) {
DCHECK(select_share_target_callback_); // Nothing to do if the result has been returned already.
if (!select_share_target_callback_)
return;
// If the send call succeeded, we expect OnTransferUpdate() to be called next. // If the send call succeeded, we expect OnTransferUpdate() to be called next.
if (status == NearbySharingService::StatusCodes::kOk) if (status == NearbySharingService::StatusCodes::kOk)
return; return;
......
...@@ -146,6 +146,12 @@ TEST_F(NearbyPerSessionDiscoveryManagerTest, OnShareTargetLost) { ...@@ -146,6 +146,12 @@ TEST_F(NearbyPerSessionDiscoveryManagerTest, OnShareTargetLost) {
} }
TEST_F(NearbyPerSessionDiscoveryManagerTest, SelectShareTarget_Invalid) { TEST_F(NearbyPerSessionDiscoveryManagerTest, SelectShareTarget_Invalid) {
MockShareTargetListener listener;
EXPECT_CALL(sharing_service(),
RegisterSendSurface(testing::_, testing::_, testing::_))
.WillOnce(testing::Return(NearbySharingService::StatusCodes::kOk));
manager().StartDiscovery(listener.Bind(), base::DoNothing());
MockSelectShareTargetCallback callback; MockSelectShareTargetCallback callback;
EXPECT_CALL( EXPECT_CALL(
callback, callback,
......
...@@ -1129,7 +1129,10 @@ void NearbySharingServiceImpl::OnIncomingTransferUpdate( ...@@ -1129,7 +1129,10 @@ void NearbySharingServiceImpl::OnIncomingTransferUpdate(
TransferMetadata metadata) { TransferMetadata metadata) {
if (metadata.status() != TransferMetadata::Status::kCancelled && if (metadata.status() != TransferMetadata::Status::kCancelled &&
metadata.status() != TransferMetadata::Status::kRejected) { metadata.status() != TransferMetadata::Status::kRejected) {
last_incoming_metadata_ = std::make_pair(share_target, metadata); last_incoming_metadata_ =
std::make_pair(share_target, TransferMetadataBuilder::Clone(metadata)
.set_is_original(false)
.build());
} else { } else {
last_incoming_metadata_ = base::nullopt; last_incoming_metadata_ = base::nullopt;
} }
......
...@@ -6,6 +6,25 @@ ...@@ -6,6 +6,25 @@
#include "chrome/browser/nearby_sharing/transfer_metadata.h" #include "chrome/browser/nearby_sharing/transfer_metadata.h"
// static
bool TransferMetadata::IsFinalStatus(Status status) {
switch (status) {
case Status::kAwaitingRemoteAcceptanceFailed:
case Status::kComplete:
case Status::kFailed:
case Status::kRejected:
case Status::kCancelled:
case Status::kTimedOut:
case Status::kMediaUnavailable:
case Status::kNotEnoughSpace:
case Status::kUnsupportedAttachmentType:
case Status::kExternalProviderLaunched:
return true;
default:
return false;
}
}
TransferMetadata::TransferMetadata(Status status, TransferMetadata::TransferMetadata(Status status,
float progress, float progress,
base::Optional<std::string> token, base::Optional<std::string> token,
......
...@@ -34,6 +34,8 @@ class TransferMetadata { ...@@ -34,6 +34,8 @@ class TransferMetadata {
kMaxValue = kExternalProviderLaunched kMaxValue = kExternalProviderLaunched
}; };
static bool IsFinalStatus(Status status);
TransferMetadata(Status status, TransferMetadata(Status status,
float progress, float progress,
base::Optional<std::string> token, base::Optional<std::string> token,
......
...@@ -4,13 +4,30 @@ ...@@ -4,13 +4,30 @@
#include "chrome/browser/nearby_sharing/transfer_metadata_builder.h" #include "chrome/browser/nearby_sharing/transfer_metadata_builder.h"
// static
TransferMetadataBuilder TransferMetadataBuilder::Clone(
const TransferMetadata& metadata) {
TransferMetadataBuilder builder;
builder.is_original_ = metadata.is_original();
builder.progress_ = metadata.progress();
builder.status_ = metadata.status();
builder.token_ = metadata.token();
return builder;
}
TransferMetadataBuilder::TransferMetadataBuilder() = default; TransferMetadataBuilder::TransferMetadataBuilder() = default;
TransferMetadataBuilder::TransferMetadataBuilder(TransferMetadataBuilder&&) =
default;
TransferMetadataBuilder& TransferMetadataBuilder::operator=(
TransferMetadataBuilder&&) = default;
TransferMetadataBuilder::~TransferMetadataBuilder() = default; TransferMetadataBuilder::~TransferMetadataBuilder() = default;
TransferMetadataBuilder& TransferMetadataBuilder::set_is_final_status( TransferMetadataBuilder& TransferMetadataBuilder::set_is_original(
bool is_final_status) { bool is_original) {
is_final_status_ = is_final_status; is_original_ = is_original;
return *this; return *this;
} }
...@@ -33,6 +50,6 @@ TransferMetadataBuilder& TransferMetadataBuilder::set_token( ...@@ -33,6 +50,6 @@ TransferMetadataBuilder& TransferMetadataBuilder::set_token(
} }
TransferMetadata TransferMetadataBuilder::build() const { TransferMetadata TransferMetadataBuilder::build() const {
return TransferMetadata(status_, progress_, token_, return TransferMetadata(status_, progress_, token_, is_original_,
/*is_original=*/false, is_final_status_); TransferMetadata::IsFinalStatus(status_));
} }
...@@ -12,10 +12,14 @@ ...@@ -12,10 +12,14 @@
class TransferMetadataBuilder { class TransferMetadataBuilder {
public: public:
static TransferMetadataBuilder Clone(const TransferMetadata& metadata);
TransferMetadataBuilder(); TransferMetadataBuilder();
TransferMetadataBuilder(TransferMetadataBuilder&&);
TransferMetadataBuilder& operator=(TransferMetadataBuilder&&);
~TransferMetadataBuilder(); ~TransferMetadataBuilder();
TransferMetadataBuilder& set_is_final_status(bool is_final_status); TransferMetadataBuilder& set_is_original(bool is_original);
TransferMetadataBuilder& set_progress(double progress); TransferMetadataBuilder& set_progress(double progress);
...@@ -26,7 +30,7 @@ class TransferMetadataBuilder { ...@@ -26,7 +30,7 @@ class TransferMetadataBuilder {
TransferMetadata build() const; TransferMetadata build() const;
private: private:
bool is_final_status_ = false; bool is_original_ = false;
double progress_ = 0; double progress_ = 0;
TransferMetadata::Status status_ = TransferMetadata::Status::kInProgress; TransferMetadata::Status status_ = TransferMetadata::Status::kInProgress;
base::Optional<std::string> token_; base::Optional<std::string> token_;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment