blob: d793af8253acca98c74de815c48f874fc22d06ab [file] [log] [blame]
// Copyright 2014 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 BLINK_MODULES_BATTERY_BATTERY_STATUS_H_
#define BLINK_MODULES_BATTERY_BATTERY_STATUS_H_
#include "third_party/blink/renderer/modules/modules_export.h"
#include "third_party/blink/renderer/platform/wtf/assertions.h"
#include <cmath>
#include <limits>
namespace blink {
// Simple struct to hold the battery status. This class is copyable.
class MODULES_EXPORT BatteryStatus final {
public:
BatteryStatus()
: charging_(true),
charging_time_(0),
discharging_time_(std::numeric_limits<double>::infinity()),
level_(1) {}
BatteryStatus(bool charging,
double charging_time,
double discharging_time,
double level)
: charging_(charging),
charging_time_(charging_time),
discharging_time_(discharging_time),
level_(EnsureTwoSignificantDigits(level)) {}
BatteryStatus(const BatteryStatus&) = default;
BatteryStatus& operator=(const BatteryStatus&) = default;
bool Charging() const { return charging_; }
double charging_time() const { return charging_time_; }
double discharging_time() const { return discharging_time_; }
double Level() const { return level_; }
private:
double EnsureTwoSignificantDigits(double level) {
// Convert battery level value which should be in [0, 1] to a value in
// [0, 1] with 2 digits of precision. This is to provide a consistent
// experience across platforms (e.g. on Mac and Android the battery changes
// are generally reported with 1% granularity). It also serves the purpose
// of reducing the possibility of fingerprinting and triggers less level
// change events on platforms where the granularity is high.
DCHECK(level >= 0 && level <= 1);
return std::round(level * 100) / 100.f;
}
bool charging_;
double charging_time_;
double discharging_time_;
double level_;
};
} // namespace blink
#endif // BLINK_MODULES_BATTERY_BATTERY_STATUS_H_