blob: ae9b7ea3ba72617ae57f880cc16fd4be943c7289 [file] [log] [blame]
// Copyright 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chromeos/components/tether/keep_alive_scheduler.h"
#include "base/bind.h"
#include "chromeos/components/tether/device_id_tether_network_guid_map.h"
#include "chromeos/components/tether/host_scan_cache.h"
#include "chromeos/services/secure_channel/public/cpp/client/secure_channel_client.h"
namespace chromeos {
namespace tether {
// static
const uint32_t KeepAliveScheduler::kKeepAliveIntervalMinutes = 4;
KeepAliveScheduler::KeepAliveScheduler(
device_sync::DeviceSyncClient* device_sync_client,
secure_channel::SecureChannelClient* secure_channel_client,
ActiveHost* active_host,
HostScanCache* host_scan_cache,
DeviceIdTetherNetworkGuidMap* device_id_tether_network_guid_map)
: KeepAliveScheduler(device_sync_client,
secure_channel_client,
active_host,
host_scan_cache,
device_id_tether_network_guid_map,
std::make_unique<base::RepeatingTimer>()) {}
KeepAliveScheduler::KeepAliveScheduler(
device_sync::DeviceSyncClient* device_sync_client,
secure_channel::SecureChannelClient* secure_channel_client,
ActiveHost* active_host,
HostScanCache* host_scan_cache,
DeviceIdTetherNetworkGuidMap* device_id_tether_network_guid_map,
std::unique_ptr<base::RepeatingTimer> timer)
: device_sync_client_(device_sync_client),
secure_channel_client_(secure_channel_client),
active_host_(active_host),
host_scan_cache_(host_scan_cache),
device_id_tether_network_guid_map_(device_id_tether_network_guid_map),
timer_(std::move(timer)),
weak_ptr_factory_(this) {
active_host_->AddObserver(this);
}
KeepAliveScheduler::~KeepAliveScheduler() {
active_host_->RemoveObserver(this);
}
void KeepAliveScheduler::OnActiveHostChanged(
const ActiveHost::ActiveHostChangeInfo& change_info) {
if (change_info.new_status == ActiveHost::ActiveHostStatus::DISCONNECTED) {
DCHECK(!change_info.new_active_host);
DCHECK(change_info.new_wifi_network_guid.empty());
keep_alive_operation_.reset();
active_host_device_ = base::nullopt;
timer_->Stop();
return;
}
if (change_info.new_status == ActiveHost::ActiveHostStatus::CONNECTED) {
DCHECK(change_info.new_active_host);
active_host_device_ = change_info.new_active_host;
timer_->Start(FROM_HERE,
base::TimeDelta::FromMinutes(kKeepAliveIntervalMinutes),
base::Bind(&KeepAliveScheduler::SendKeepAliveTickle,
weak_ptr_factory_.GetWeakPtr()));
SendKeepAliveTickle();
}
}
void KeepAliveScheduler::OnOperationFinished(
multidevice::RemoteDeviceRef remote_device,
std::unique_ptr<DeviceStatus> device_status) {
// Make a copy before destroying the operation below.
const multidevice::RemoteDeviceRef device_copy = remote_device;
keep_alive_operation_->RemoveObserver(this);
keep_alive_operation_.reset();
if (!device_status) {
// If the operation did not complete successfully, there is no new
// information with which to update the cache.
return;
}
std::string carrier;
int32_t battery_percentage;
int32_t signal_strength;
NormalizeDeviceStatus(*device_status, &carrier, &battery_percentage,
&signal_strength);
// Update the cache. Note that SetSetupRequired(false) is called because it is
// assumed that setup is no longer required for an active connection attempt.
host_scan_cache_->SetHostScanResult(
*HostScanCacheEntry::Builder()
.SetTetherNetworkGuid(
device_id_tether_network_guid_map_
->GetTetherNetworkGuidForDeviceId(device_copy.GetDeviceId()))
.SetDeviceName(device_copy.name())
.SetCarrier(carrier)
.SetBatteryPercentage(battery_percentage)
.SetSignalStrength(signal_strength)
.SetSetupRequired(false)
.Build());
}
void KeepAliveScheduler::SendKeepAliveTickle() {
DCHECK(active_host_device_);
keep_alive_operation_ = KeepAliveOperation::Factory::NewInstance(
*active_host_device_, device_sync_client_, secure_channel_client_);
keep_alive_operation_->AddObserver(this);
keep_alive_operation_->Initialize();
}
} // namespace tether
} // namespace chromeos