blob: dcd7762edb3177e47dba65509c7806d625ee21b0 [file] [log] [blame]
// Copyright 2021 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 SERVICES_NETWORK_RADIO_MONITOR_ANDROID_H_
#define SERVICES_NETWORK_RADIO_MONITOR_ANDROID_H_
#include "base/android/radio_utils.h"
#include "base/component_export.h"
#include "base/no_destructor.h"
#include "net/traffic_annotation/network_traffic_annotation.h"
#include "services/network/public/mojom/host_resolver.mojom-forward.h"
#include "third_party/abseil-cpp/absl/types/optional.h"
namespace network {
constexpr char kUmaNamePossibleWakeupTriggerURLLoader[] =
"Network.Radio.PossibleWakeupTrigger.URLLoaderAnnotationId";
constexpr char kUmaNamePossibleWakeupTriggerResolveHost[] =
"Network.Radio.PossibleWakeupTrigger.ResolveHostPurpose";
// Checks radio states and records histograms when network activities may
// trigger power-consuming radio state changes like wake-ups.
class COMPONENT_EXPORT(NETWORK_SERVICE) RadioMonitorAndroid {
public:
static RadioMonitorAndroid& GetInstance();
RadioMonitorAndroid(const RadioMonitorAndroid&) = delete;
RadioMonitorAndroid& operator=(const RadioMonitorAndroid&) = delete;
RadioMonitorAndroid(RadioMonitorAndroid&&) = delete;
RadioMonitorAndroid& operator=(RadioMonitorAndroid&&) = delete;
// Records a traffic annotation hash ID when a network request annotated with
// `traffic_annotation` likely wake-ups radio.
void MaybeRecordURLLoaderAnnotationId(
const net::NetworkTrafficAnnotationTag& traffic_annotation);
// Records a host resolve request when the request likely wake-ups radio.
void MaybeRecordResolveHost(
const mojom::ResolveHostParametersPtr& parameters);
// These override radio states for testing.
void OverrideRadioActivityForTesting(
absl::optional<base::android::RadioDataActivity> radio_activity) {
radio_activity_override_for_testing_ = radio_activity;
}
void OverrideRadioTypeForTesting(
absl::optional<base::android::RadioConnectionType> radio_type) {
radio_type_override_for_testing_ = radio_type;
}
private:
friend class base::NoDestructor<RadioMonitorAndroid>;
RadioMonitorAndroid();
~RadioMonitorAndroid() = delete;
// Returns true when RadioUtils is available or any radio states are
// overridden for testing.
bool IsRadioUtilsSupported();
// Returns true when radio data activity is dormant.
// TODO(crbug.com/1232623): Consider optimizing this function. This function
// uses Android's platform APIs which add non-negligible overheads.
bool ShouldRecordRadioWakeupTrigger();
// Radio state overrides for testing.
absl::optional<base::android::RadioDataActivity>
radio_activity_override_for_testing_;
absl::optional<base::android::RadioConnectionType>
radio_type_override_for_testing_;
};
} // namespace network
#endif // SERVICES_NETWORK_RADIO_MONITOR_ANDROID_H_