// Copyright 2021 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef ASH_WEBUI_ECHE_APP_UI_ECHE_SIGNALER_H_
#define ASH_WEBUI_ECHE_APP_UI_ECHE_SIGNALER_H_
#include "ash/system/eche/eche_tray.h"
#include "ash/webui/eche_app_ui/apps_launch_info_provider.h"
#include "ash/webui/eche_app_ui/eche_connection_status_handler.h"
#include "ash/webui/eche_app_ui/eche_connector.h"
#include "ash/webui/eche_app_ui/mojom/eche_app.mojom.h"
#include "ash/webui/eche_app_ui/system_info_provider.h"
#include "base/gtest_prod_util.h"
#include "base/memory/raw_ptr.h"
#include "chromeos/ash/services/secure_channel/public/cpp/client/connection_manager.h"
#include "mojo/public/cpp/bindings/pending_receiver.h"
#include "mojo/public/cpp/bindings/pending_remote.h"
#include "mojo/public/cpp/bindings/receiver.h"
#include "mojo/public/cpp/bindings/receiver_set.h"
#include "mojo/public/cpp/bindings/remote.h"
#include "mojo/public/cpp/bindings/remote_set.h"
namespace ash::eche_app {
class EcheSignaler : public mojom::SignalingMessageExchanger,
public secure_channel::ConnectionManager::Observer,
public EcheConnectionStatusHandler::Observer {
public:
EcheSignaler(EcheConnector* eche_connector,
secure_channel::ConnectionManager* connection_manager,
AppsLaunchInfoProvider* apps_launch_info_provider,
EcheConnectionStatusHandler* eche_connection_status_handler);
~EcheSignaler() override;
EcheSignaler(const EcheSignaler&) = delete;
EcheSignaler& operator=(const EcheSignaler&) = delete;
// mojom::SignalingMessageExchanger:
void SendSignalingMessage(const std::vector<uint8_t>& signal) override;
void SetSignalingMessageObserver(
mojo::PendingRemote<mojom::SignalingMessageObserver> observer) override;
void SetSystemInfoProvider(SystemInfoProvider* system_info_provider);
void TearDownSignaling() override;
void Bind(mojo::PendingReceiver<mojom::SignalingMessageExchanger> receiver);
// Visible for testing.
// secure_channel::ConnectionManager::Observer:
void OnMessageReceived(const std::string& payload) override;
base::DelayTimer* signaling_timeout_timer_for_test() {
return signaling_timeout_timer_.get();
}
private:
FRIEND_TEST_ALL_PREFIXES(EcheSignalerTest,
TestConnectionFailWhenNoReceiveAnyMessage);
FRIEND_TEST_ALL_PREFIXES(EcheSignalerTest,
TestConnectionFailWhenSignalingHasLateRequest);
FRIEND_TEST_ALL_PREFIXES(EcheSignalerTest,
TestConnectionFailWhenSignalingHasLateResponse);
FRIEND_TEST_ALL_PREFIXES(EcheSignalerTest,
TestConnectionFailWhenSecurityChannelDisconnected);
FRIEND_TEST_ALL_PREFIXES(EcheSignalerTest,
TestConnectionFailWhenWiFiNetworksDifferent);
FRIEND_TEST_ALL_PREFIXES(EcheSignalerTest,
TestConnectionFailWhenWiFiNetworksSame);
FRIEND_TEST_ALL_PREFIXES(EcheSignalerTest,
TestConnectionFailWhenRemoteDeviceOnCellular);
FRIEND_TEST_ALL_PREFIXES(EcheSignalerTest,
OnRequestCloseConnectionDoesNotStreamEventFailures);
// EcheConnectionStatusHandler::Observer
void OnConnectionClosed() override;
void RecordSignalingTimeout();
void ProcessAndroidNetworkInfo(const proto::ExoMessage& message);
// The signaling timer to log fail reason in case response timeout.
std::unique_ptr<base::DelayTimer> signaling_timeout_timer_;
// This is for identify the timeout reason.
EcheTray::ConnectionFailReason probably_connection_failed_reason_ =
EcheTray::ConnectionFailReason::kUnknown;
raw_ptr<SystemInfoProvider, DanglingUntriaged> system_info_provider_ =
nullptr;
raw_ptr<EcheConnector> eche_connector_ = nullptr;
raw_ptr<AppsLaunchInfoProvider> apps_launch_info_provider_ = nullptr;
raw_ptr<EcheConnectionStatusHandler> eche_connection_status_handler_ =
nullptr;
raw_ptr<secure_channel::ConnectionManager> connection_manager_ = nullptr;
mojo::Remote<mojom::SignalingMessageObserver> observer_;
mojo::Receiver<mojom::SignalingMessageExchanger> exchanger_{this};
};
std::ostream& operator<<(std::ostream& stream,
EcheTray::ConnectionFailReason connection_fail_reason);
} // namespace ash::eche_app
#endif // ASH_WEBUI_ECHE_APP_UI_ECHE_SIGNALER_H_