// Copyright 2016 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_ASH_HATS_HATS_FINCH_HELPER_H_
#define CHROME_BROWSER_ASH_HATS_HATS_FINCH_HELPER_H_
#include <limits.h>
#include "base/gtest_prod_util.h"
#include "base/memory/raw_ptr.h"
#include "base/memory/raw_ref.h"
#include "base/time/time.h"
#include "chrome/common/chrome_features.h"
class Profile;
namespace ash {
struct HatsConfig;
// Provides an API for HatsNotificationController to retrieve processed
// information related to the hats finch experiment.
class HatsFinchHelper {
public:
static std::string GetTriggerID(const HatsConfig& config);
// New histogram entries must be added to
// tools/metrics/histograms/metadata/browser/histograms.xml, as a variant of
// "ChromeOS.HaTS".
static std::string GetHistogramName(const HatsConfig& config);
// Returns a client-specific custom data as a string from the finch seed. If
// the config contains no data, then an empty string is returned. The data is
// provided as a param via the finch seed under the key "custom_client_data".
static std::string GetCustomClientDataAsString(const HatsConfig& config);
// Returns true if and only if the finch parameter "enabled_for_googlers"
// is set to "true".
static bool IsEnabledForGooglers(const HatsConfig& config);
explicit HatsFinchHelper(Profile* profile, const HatsConfig& config);
~HatsFinchHelper();
bool IsDeviceSelectedForCurrentCycle() const {
return device_is_selected_for_cycle_;
}
private:
friend class HatsFinchHelperTest;
FRIEND_TEST_ALL_PREFIXES(HatsFinchHelperTest, InitFinchSeed_ValidValues);
FRIEND_TEST_ALL_PREFIXES(HatsFinchHelperTest, InitFinchSeed_Invalidalues);
FRIEND_TEST_ALL_PREFIXES(HatsFinchHelperTest, TestComputeNextDate);
FRIEND_TEST_ALL_PREFIXES(HatsFinchHelperTest, ResetSurveyCycle);
FRIEND_TEST_ALL_PREFIXES(HatsFinchHelperTest, ResetHats);
static const char kEnabledForGooglersParam[];
static const char kCustomClientDataParam[];
static const char kProbabilityParam[];
static const char kResetAllParam[];
static const char kResetSurveyCycleParam[];
static const char kSurveyCycleLengthParam[];
static const char kSurveyStartDateMsParam[];
static const char kTriggerIdParam[];
static const char kHistogramNameParam[];
// Loads all the param values from the finch seed and initializes the member
// variables.
void LoadFinchParamValues(const HatsConfig& hats_config);
// Returns true if the survey cycle that was active most recently has passed
// its end date.
bool HasPreviousCycleEnded();
// Computes the end date of the survey cycle that is currently active.
base::Time ComputeNextEndDate();
// Using the params provided in the finch seed, compute and check if the
// current device is seleted for the current survey cycle. This is computed
// only once per survey cycle.
void CheckForDeviceSelection();
// The probability that the device is picked for the current suvey cycle. This
// is provided as a param in the finch seed under the key "prob".
double probability_of_pick_ = 0;
// Time period in days after which the dice will be rolled again to decide if
// the device is selected for the survey cycle. This is provided as a param
// via the finch seed under the key "survey_cycle_length".
int survey_cycle_length_ = INT_MAX;
// The timestamp for the date when the experiment started with the current
// set of parameters. This is provided as a param via the finch seed under the
// key "survey_start_date_ms".
base::Time first_survey_start_date_;
// The survey's trigger id. This is used by the Hats server to identify its
// client, Chrome OS in this case. Different Chrome OS surveys can have
// different trigger ids. This is provided as a param via the finch seed under
// the key "trigger_id".
std::string trigger_id_;
// Indicates that the survey cycle needs to be reset if set to true.
bool reset_survey_cycle_ = false;
// If true, indicates that all hats related state on the device needs to be
// reset.
bool reset_hats_ = false;
// If true, indicates that the device has been selected for the survey in the
// current survey cycle. This is set by |CheckForDeviceSelection()|.
bool device_is_selected_for_cycle_ = false;
const raw_ptr<Profile> profile_;
const raw_ref<const HatsConfig> hats_config_;
};
} // namespace ash
#endif // CHROME_BROWSER_ASH_HATS_HATS_FINCH_HELPER_H_