// Copyright 2023 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. #include "presence/presence_client_impl.h" #include #include #include #include "absl/status/status.h" #include "internal/platform/borrowable.h" #include "internal/platform/logging.h" #include "presence/presence_device.h" #include "presence/presence_service.h" namespace nearby { namespace presence { // static PresenceClientImpl::Factory* PresenceClientImpl::Factory::g_test_factory_ = nullptr; // static std::unique_ptr PresenceClientImpl::Factory::Create( BorrowablePresenceService service) { if (g_test_factory_) { return g_test_factory_->CreateInstance(service); } return absl::WrapUnique(new PresenceClientImpl(service)); } // static void PresenceClientImpl::Factory::SetFactoryForTesting( Factory* g_test_factory) { g_test_factory_ = g_test_factory; } PresenceClientImpl::Factory::~Factory() = default; absl::StatusOr PresenceClientImpl::StartScan( ScanRequest scan_request, ScanCallback callback) { ::nearby::Borrowed borrowed = service_.Borrow(); if (!borrowed) { return absl::FailedPreconditionError( "Can't start scan, presence service is gone"); } return (*borrowed)->StartScan(scan_request, std::move(callback)); } void PresenceClientImpl::StopScan(ScanSessionId id) { ::nearby::Borrowed borrowed = service_.Borrow(); if (borrowed) { (*borrowed)->StopScan(id); } } absl::StatusOr PresenceClientImpl::StartBroadcast( BroadcastRequest broadcast_request, BroadcastCallback callback) { ::nearby::Borrowed borrowed = service_.Borrow(); if (!borrowed) { return absl::FailedPreconditionError( "Can't start broadcast, presence service is gone"); } return (*borrowed)->StartBroadcast(broadcast_request, std::move(callback)); } void PresenceClientImpl::StopBroadcast(BroadcastSessionId session_id) { ::nearby::Borrowed borrowed = service_.Borrow(); if (borrowed) { (*borrowed)->StopBroadcast(session_id); } else { VLOG(1) << "Session already finished, id: " << session_id; } } std::optional PresenceClientImpl::GetLocalDevice() { ::nearby::Borrowed borrowed = service_.Borrow(); if (borrowed) { const PresenceDevice* device = static_cast( (*borrowed)->GetLocalDeviceProvider()->GetLocalDevice()); return PresenceDevice(*device); } return std::nullopt; } } // namespace presence } // namespace nearby