blob: 5e11f57d45f31bcdbe42808d12912f679b87516b [file] [log] [blame]
// Copyright 2025 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_SAVE_TO_DRIVE_TIME_REMAINING_CALCULATOR_H_
#define CHROME_BROWSER_SAVE_TO_DRIVE_TIME_REMAINING_CALCULATOR_H_
#include <optional>
#include <string>
#include "base/byte_count.h"
#include "components/download/public/common/rate_estimator.h"
namespace extensions::api::pdf_viewer_private {
struct SaveToDriveProgress;
} // namespace extensions::api::pdf_viewer_private
namespace save_to_drive {
// This class is used to calculate the time remaining for a save to drive
// operation. It will only calculate the time remaining when the upload has
// started or is in progress.
class TimeRemainingCalculator {
public:
TimeRemainingCalculator() = default;
virtual ~TimeRemainingCalculator();
// Calculates and returns a human-readable string for the estimated time
// remaining for the save to drive operation. Returns std::nullopt if the
// upload speed is zero or progress is invalid. It determines the upload speed
// by using the `RateEstimator`. This should only be called when the progress
// status is `kUploadStarted` or `kUploadInProgress`.
virtual std::optional<std::u16string> CalculateTimeRemainingText(
const extensions::api::pdf_viewer_private::SaveToDriveProgress& progress);
private:
// Returns the remaining time for the save to drive operation.
std::optional<base::TimeDelta> GetRemainingTime(
const base::ByteCount& uploaded_bytes,
const base::ByteCount& file_size_bytes) const;
// The last uploaded bytes.
base::ByteCount last_uploaded_bytes_;
// Used to get a smooth estimate of the upload speed.
download::RateEstimator upload_speed_estimator_;
};
} // namespace save_to_drive
#endif // CHROME_BROWSER_SAVE_TO_DRIVE_TIME_REMAINING_CALCULATOR_H_