// 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_RECEIVE_MANAGER_H_
#define CHROME_BROWSER_NEARBY_SHARING_NEARBY_RECEIVE_MANAGER_H_
#include "base/memory/raw_ptr.h"
#include "base/unguessable_token.h"
#include "chrome/browser/nearby_sharing/attachment.h"
#include "chrome/browser/nearby_sharing/nearby_sharing_service.h"
#include "chrome/browser/nearby_sharing/transfer_update_callback.h"
#include "chrome/browser/ui/webui/nearby_share/nearby_share.mojom.h"
#include "mojo/public/cpp/bindings/remote.h"
#include "mojo/public/cpp/bindings/remote_set.h"
// |NearbyReceiveManager| is a mojo implementation that is bound in os-settings
// to allow the user to enter high-visibility advertising and accept incoming
// connections. Entering high visibility mode causes this object to register
// itself as a foreground receive surface with the |NearbySharingService| and
// listen for incoming share attempts. The client can register an observer to
// receive notifications when high visibility mode state has changed or when a
// share request has come in. The client can then accept or reject the share.
// This is a transient object and only lives while os-settings has it bound.
class NearbyReceiveManager : public nearby_share::mojom::ReceiveManager,
public TransferUpdateCallback,
public NearbySharingService::Observer {
public:
explicit NearbyReceiveManager(NearbySharingService* nearby_sharing_service);
~NearbyReceiveManager() override;
// TransferUpdateCallback:
void OnTransferUpdate(const ShareTarget& share_target,
const TransferMetadata& transfer_metadata) override;
// nearby_share::mojom::ReceiveManager:
void AddReceiveObserver(
::mojo::PendingRemote<nearby_share::mojom::ReceiveObserver> observer)
override;
void IsInHighVisibility(IsInHighVisibilityCallback callback) override;
void RegisterForegroundReceiveSurface(
RegisterForegroundReceiveSurfaceCallback callback) override;
void UnregisterForegroundReceiveSurface(
UnregisterForegroundReceiveSurfaceCallback callback) override;
void Accept(const base::UnguessableToken& share_target_id,
AcceptCallback callback) override;
void Reject(const base::UnguessableToken& share_target_id,
RejectCallback callback) override;
void RecordFastInitiationNotificationUsage(bool success) override;
// NearbySharingService::Observer
void OnHighVisibilityChanged(bool in_high_visibility) override;
void OnShutdown() override {}
void OnNearbyProcessStopped() override;
void OnStartAdvertisingFailure() override;
private:
void NotifyOnTransferUpdate(const ShareTarget& share_target,
const TransferMetadata& metadata);
raw_ptr<NearbySharingService> nearby_sharing_service_;
base::flat_map<base::UnguessableToken, ShareTarget> share_targets_map_;
mojo::RemoteSet<nearby_share::mojom::ReceiveObserver> observers_set_;
};
#endif // CHROME_BROWSER_NEARBY_SHARING_NEARBY_RECEIVE_MANAGER_H_