[go: nahoru, domu]

blob: 2ca069916086d9dffe3c8d1a06b44ac5fb1676fb [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.
#ifndef COMPONENTS_DOWNLOAD_INTERNAL_BACKGROUND_SERVICE_SCHEDULER_DEVICE_STATUS_LISTENER_H_
#define COMPONENTS_DOWNLOAD_INTERNAL_BACKGROUND_SERVICE_SCHEDULER_DEVICE_STATUS_LISTENER_H_
#include <memory>
#include "base/memory/raw_ptr.h"
#include "base/time/time.h"
#include "base/timer/timer.h"
#include "components/download/internal/background_service/scheduler/battery_status_listener.h"
#include "components/download/internal/background_service/scheduler/device_status.h"
#include "components/download/network/network_status_listener.h"
namespace download {
// Listens to network and battery status change and notifies the observer.
class DeviceStatusListener : public NetworkStatusListener::Observer,
public BatteryStatusListener::Observer {
public:
class Observer {
public:
// Called when device status is changed.
virtual void OnDeviceStatusChanged(const DeviceStatus& device_status) = 0;
};
explicit DeviceStatusListener(
const base::TimeDelta& startup_delay,
const base::TimeDelta& online_delay,
std::unique_ptr<BatteryStatusListener> battery_listener,
std::unique_ptr<NetworkStatusListener> network_listener);
DeviceStatusListener(const DeviceStatusListener&) = delete;
DeviceStatusListener& operator=(const DeviceStatusListener&) = delete;
~DeviceStatusListener() override;
bool is_valid_state() { return is_valid_state_; }
// Returns the current device status for download scheduling. May update
// internal device status when called.
const DeviceStatus& CurrentDeviceStatus();
void SetObserver(DeviceStatusListener::Observer* observer);
// Starts/stops to listen network and battery change events, virtual for
// testing.
virtual void Start(const base::TimeDelta& start_delay);
virtual void Stop();
protected:
// NetworkStatusListener::Observer implementation. Visible for testing.
void OnNetworkStatusReady(network::mojom::ConnectionType type) override;
void OnNetworkChanged(network::mojom::ConnectionType type) override;
// Used to listen to network connectivity changes.
std::unique_ptr<NetworkStatusListener> network_listener_;
// The current device status.
DeviceStatus status_;
// The observer that listens to device status change events.
raw_ptr<Observer> observer_;
// If device status listener is started.
bool listening_;
bool is_valid_state_;
private:
// Start after a delay to wait for potential network stack setup.
void StartAfterDelay();
// BatteryStatusListener::Observer implementation.
void OnPowerStateChange(bool on_battery_power) override;
// Notifies the observer about device status change.
void NotifyStatusChange();
// Called after a delay to notify the observer. See |delay_|.
void NotifyNetworkChange();
// Used to start the device listener or notify network change after a delay.
base::OneShotTimer timer_;
// The delay used when network status becomes online.
base::TimeDelta online_delay_;
// Pending network status used to update the current network status.
NetworkStatus pending_network_status_ = NetworkStatus::DISCONNECTED;
// Used to listen to battery status.
std::unique_ptr<BatteryStatusListener> battery_listener_;
};
} // namespace download
#endif // COMPONENTS_DOWNLOAD_INTERNAL_BACKGROUND_SERVICE_SCHEDULER_DEVICE_STATUS_LISTENER_H_