blob: 764829ea2c41d414e3544c95a954d9499329b494 [file] [log] [blame]
// Copyright 2011 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_UPGRADE_DETECTOR_UPGRADE_DETECTOR_IMPL_H_
#define CHROME_BROWSER_UPGRADE_DETECTOR_UPGRADE_DETECTOR_IMPL_H_
#include <array>
#include <optional>
#include "base/no_destructor.h"
#include "base/sequence_checker.h"
#include "base/time/time.h"
#include "base/timer/timer.h"
#include "base/version.h"
#include "chrome/browser/upgrade_detector/build_state_observer.h"
#include "chrome/browser/upgrade_detector/installed_version_poller.h"
#include "chrome/browser/upgrade_detector/upgrade_detector.h"
#include "components/variations/service/variations_service.h"
namespace base {
class Clock;
class TickClock;
} // namespace base
// This class contains the non-CrOS desktop implementation of the detector.
class UpgradeDetectorImpl : public UpgradeDetector,
public BuildStateObserver,
public variations::VariationsService::Observer {
public:
// Returns the global instance.
static UpgradeDetectorImpl* GetInstance();
UpgradeDetectorImpl(const UpgradeDetectorImpl&) = delete;
UpgradeDetectorImpl& operator=(const UpgradeDetectorImpl&) = delete;
// UpgradeDetector:
void Init() override;
void Shutdown() override;
base::Time GetAnnoyanceLevelDeadline(
UpgradeNotificationAnnoyanceLevel level) override;
// BuildStateObserver:
void OnUpdate(const BuildState* build_state) override;
protected:
UpgradeDetectorImpl(const base::Clock* clock,
const base::TickClock* tick_clock);
~UpgradeDetectorImpl() override;
// Sends out a notification and starts a one shot timer to wait until
// notifying the user.
void UpgradeDetected(UpgradeAvailable upgrade_available);
// variations::VariationsService::Observer:
void OnExperimentChangesDetected(Severity severity) override;
// Trigger an "on upgrade" notification based on the specified |time_passed|
// interval. Exposed as protected for testing.
void NotifyOnUpgradeWithTimePassed(base::TimeDelta time_passed);
base::TimeDelta GetThresholdForLevel(UpgradeNotificationAnnoyanceLevel level);
private:
// The index of a level in `stages_`.
enum LevelIndex {
kStagesIndexHigh = 0,
kStagesIndexGrace = 1,
kStagesIndexElevated = 2,
kStagesIndexLow = 3,
kStagesIndexVeryLow = 4,
kNumStages
};
friend class base::NoDestructor<UpgradeDetectorImpl>;
// Returns the index of |level| in |stages_|.
static LevelIndex AnnoyanceLevelToStagesIndex(
UpgradeNotificationAnnoyanceLevel level);
// Returns the annoyance level of |index| in |stages_|.
static UpgradeNotificationAnnoyanceLevel StageIndexToAnnoyanceLevel(
size_t index);
// UpgradeDetector:
void RecomputeSchedule() override;
// Starts the upgrade notification timer that will check periodically whether
// enough time has elapsed to update the severity (which maps to visual
// badging) of the notification.
void StartUpgradeNotificationTimer();
// Calculation for the various threshold deltas.
void CalculateThresholds();
void DoCalculateThresholds();
void StartOutdatedBuildDetector();
void DetectOutdatedInstall();
// The function that sends out a notification (after a certain time has
// elapsed) that lets the rest of the UI know we should start notifying the
// user that a new version is available.
void NotifyOnUpgrade();
SEQUENCE_CHECKER(sequence_checker_);
std::optional<InstalledVersionPoller> installed_version_poller_;
// A timer used to periodically check if the build has become outdated.
base::OneShotTimer outdated_build_timer_;
// A timer used to move through the various upgrade notification stages and
// schedule calls to NotifyUpgrade.
base::OneShotTimer upgrade_notification_timer_;
// True if auto update is turned on.
bool is_auto_update_enabled_;
// True if test switches that simulate an outdated install are present on the
// command line.
const bool simulating_outdated_;
// True if test switches are present on the command line.
const bool is_testing_;
// The various deltas from upgrade detection time to the different annoyance
// levels; only valid while `upgrade_notification_timer_` is running to
// advance through the annoyance levels. Must be sorted in decreasing order of
// time.
std::array<base::TimeDelta, kNumStages> stages_;
// The date the binaries were built.
base::Time build_date_;
base::WeakPtrFactory<UpgradeDetectorImpl> weak_factory_{this};
};
#endif // CHROME_BROWSER_UPGRADE_DETECTOR_UPGRADE_DETECTOR_IMPL_H_