chromium/chrome/browser/ash/hats/hats_config.cc

// Copyright 2021 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "chrome/browser/ash/hats/hats_config.h"

#include "base/time/time.h"
#include "chrome/common/chrome_features.h"
#include "chrome/common/pref_names.h"

namespace ash {

namespace {
constexpr int kMinDaysThreshold = 0;  // HaTS Onboarding Experience is immediate
}  // namespace

HatsConfig::HatsConfig(const base::Feature& feature,
                       const base::TimeDelta& new_device_threshold,
                       const char* const is_selected_pref_name,
                       const char* const cycle_end_timestamp_pref_name)
    : feature(feature),
      new_device_threshold(new_device_threshold),
      is_selected_pref_name(is_selected_pref_name),
      cycle_end_timestamp_pref_name(cycle_end_timestamp_pref_name),
      survey_last_interaction_timestamp_pref_name(nullptr),
      threshold_time(base::TimeDelta()),
      prioritized(false) {
  DCHECK(new_device_threshold.InDaysFloored() >= kMinDaysThreshold);
}

HatsConfig::HatsConfig(
    const base::Feature& feature,
    const base::TimeDelta& new_device_threshold,
    const char* const is_selected_pref_name,
    const char* const cycle_end_timestamp_pref_name,
    const char* const survey_last_interaction_timestamp_pref_name,
    const base::TimeDelta& threshold_time)
    : feature(feature),
      new_device_threshold(new_device_threshold),
      is_selected_pref_name(is_selected_pref_name),
      cycle_end_timestamp_pref_name(cycle_end_timestamp_pref_name),
      survey_last_interaction_timestamp_pref_name(
          survey_last_interaction_timestamp_pref_name),
      threshold_time(threshold_time),
      prioritized(true) {
  DCHECK(new_device_threshold.InDaysFloored() >= kMinDaysThreshold);
}

// General Survey -- shown after login
const HatsConfig kHatsGeneralSurvey = {
    ::features::kHappinessTrackingSystem,  // feature
    base::Days(7),                         // new_device_threshold
    prefs::kHatsDeviceIsSelected,          // is_selected_pref_name
    prefs::kHatsSurveyCycleEndTimestamp,   // cycle_end_timestamp_pref_name
};

// ENT Survey -- shown after login, along with the General Survey
const HatsConfig kHatsEntSurvey = {
    ::features::kHappinessTrackingSystemEnt,  // feature
    base::Days(7),                            // new_device_threshold
    prefs::kHatsEntDeviceIsSelected,          // is_selected_pref_name
    prefs::kHatsEntSurveyCycleEndTs,          // cycle_end_timestamp_pref_name
};

// Stability Survey -- shown after login, along with the General Survey
const HatsConfig kHatsStabilitySurvey = {
    ::features::kHappinessTrackingSystemStability,  // feature
    base::Days(7),                                  // new_device_threshold
    prefs::kHatsStabilityDeviceIsSelected,          // is_selected_pref_name
    prefs::kHatsStabilitySurveyCycleEndTs,  // cycle_end_timestamp_pref_name
};

// Performance Survey -- shown after login, along with the General Survey
const HatsConfig kHatsPerformanceSurvey = {
    ::features::kHappinessTrackingSystemPerformance,  // feature
    base::Days(7),                                    // new_device_threshold
    prefs::kHatsPerformanceDeviceIsSelected,          // is_selected_pref_name
    prefs::kHatsPerformanceSurveyCycleEndTs,  // cycle_end_timestamp_pref_name
};

// Onboarding Experience Survey -- shown after completing the Onboarding Dialog
const HatsConfig kHatsOnboardingSurvey = {
    ::features::kHappinessTrackingSystemOnboarding,  // feature
    base::Minutes(30),                               // new_device_threshold
    prefs::kHatsOnboardingDeviceIsSelected,          // is_selected_pref_name
    prefs::kHatsOnboardingSurveyCycleEndTs,  // cycle_end_timestamp_pref_name
};

// ARC++ Games Survey -- shown after a user played a top XX ARC++ game
const HatsConfig kHatsArcGamesSurvey = {
    ::features::kHappinessTrackingSystemArcGames,  // feature
    base::Days(7),                                 // new_device_threshold
    prefs::kHatsArcGamesDeviceIsSelected,          // is_selected_pref_name
    prefs::kHatsArcGamesSurveyCycleEndTs,  // cycle_end_timestamp_pref_name
};

// Audio Survey -- shown after a user closed an audio stream living for more
// than 3 minutes
const HatsConfig kHatsAudioSurvey = {
    ::features::kHappinessTrackingSystemAudio,  // feature
    base::Days(90),                             // new_device_threshold
    prefs::kHatsAudioDeviceIsSelected,          // is_selected_pref_name
    prefs::kHatsAudioSurveyCycleEndTs,          // cycle_end_timestamp_pref_name
};

const HatsConfig kHatsAudioOutputProcSurvey = {
    ::features::kHappinessTrackingSystemAudioOutputProc,  // feature
    base::Days(7),                                // new_device_threshold
    prefs::kHatsAudioOutputProcDeviceIsSelected,  // is_selected_pref_name
    prefs::
        kHatsAudioOutputProcSurveyCycleEndTs,  // cycle_end_timestamp_pref_name
};

// Bluetooth Audio Survey -- shown after the user closed an audio stream
// sent to a Bluetooth device after listening for more than one minute.
const HatsConfig kHatsBluetoothAudioSurvey = {
    ::features::kHappinessTrackingSystemBluetoothAudio,  // feature
    base::Days(90),                                      // new_device_threshold
    prefs::kHatsBluetoothAudioDeviceIsSelected,  // is_selected_pref_name
    prefs::
        kHatsBluetoothAudioSurveyCycleEndTs,  // cycle_end_timestamp_pref_name
};
// Personalization Avatar Survey -- shown 60 seconds after a user closes the
// Avatar selection page of either OS Settings or Personalization Hub, depending
// on whether PersonalizationHub feature is enabled.
const HatsConfig kHatsPersonalizationAvatarSurvey = {
    ::features::kHappinessTrackingPersonalizationAvatar,  // feature
    base::Days(1),                                      // new_device_threshold
    prefs::kHatsPersonalizationAvatarSurveyIsSelected,  // is_selected_pref_name
    prefs::
        kHatsPersonalizationAvatarSurveyCycleEndTs,  // cycle_end_timestamp_pref_name
};

// Personalization Screensaver Survey -- shown 60 seconds after a user closes
// the Screensaver settings page of either OS Settings or Personalization Hub,
// depending on whether PersonalizationHub feature is enabled.
const HatsConfig kHatsPersonalizationScreensaverSurvey = {
    ::features::kHappinessTrackingPersonalizationScreensaver,  // feature
    base::Days(1),  // new_device_threshold
    prefs::
        kHatsPersonalizationScreensaverSurveyIsSelected,  // is_selected_pref_name
    prefs::
        kHatsPersonalizationScreensaverSurveyCycleEndTs,  // cycle_end_timestamp_pref_name
};

// Personalization Wallpaper Survey -- shown 60 seconds after a user closes the
// Wallpaper subpage of the Personalization App.
const HatsConfig kHatsPersonalizationWallpaperSurvey = {
    ::features::kHappinessTrackingPersonalizationWallpaper,  // feature
    base::Days(1),  // new_device_threshold
    prefs::
        kHatsPersonalizationWallpaperSurveyIsSelected,  // is_selected_pref_name
    prefs::
        kHatsPersonalizationWallpaperSurveyCycleEndTs,  // cycle_end_timestamp_pref_name
};

// MediaApp PDF Editing experience survey -- shown after a user clicks `Save`
// after editing a PDF in the MediaApp (Gallery), and the save is complete.
const HatsConfig kHatsMediaAppPdfSurvey = {
    ::features::kHappinessTrackingMediaAppPdf,  // feature
    base::Days(7),                              // new_device_threshold
    prefs::kHatsMediaAppPdfIsSelected,          // hatsIsSelectedPrefName
    prefs::kHatsMediaAppPdfCycleEndTs,          // hatsCycleEndTimestampPrefName
};

// Camera App Survey -- shown after an user captured a photo/video or left the
// app with session > 15 seconds.
const HatsConfig kHatsCameraAppSurvey = {
    ::features::kHappinessTrackingSystemCameraApp,  // feature
    base::Days(90),                                 // new_device_threshold
    prefs::kHatsCameraAppDeviceIsSelected,          // is_selected_pref_name
    prefs::kHatsCameraAppSurveyCycleEndTs,  // cycle_end_timestamp_pref_name
};

// Chromebook Video/Image Editing/Viewing experience survey -- shown after a
// user opens and then subsequently closes the Google Photos Android App.
const HatsConfig kHatsPhotosExperienceSurvey = {
    ::features::kHappinessTrackingPhotosExperience,  // feature
    base::Days(7),                                   // new_device_threshold
    prefs::kHatsPhotosExperienceIsSelected,          // hatsIsSelectedPrefName
    prefs::kHatsPhotosExperienceCycleEndTs,  // hatsCycleEndTimestampPrefName
};

// General Camera Survey -- shown after camera is closed after being open for
// at least 3 minutes by using any app (e.g. Chrome or Android app).
const HatsConfig kHatsGeneralCameraSurvey = {
    ::features::kHappinessTrackingGeneralCamera,  // feature
    base::Days(90),                               // new_device_threshold
    prefs::kHatsGeneralCameraIsSelected,          // is_selected_pref_name
    prefs::kHatsGeneralCameraSurveyCycleEndTs,  // cycle_end_timestamp_pref_name
};

// Prioritized General Camera Survey -- shown after camera is closed after being
// open for at least 15 seconds by using any app (e.g. Chrome or Android app).
const HatsConfig kHatsGeneralCameraPrioritizedSurvey = {
    // feature
    ::features::kHappinessTrackingGeneralCameraPrioritized,
    // new_device_threshold
    base::Days(7),
    // is_selected_pref_name
    prefs::kHatsGeneralCameraPrioritizedIsSelected,
    // cycle_end_timestamp_pref_name
    prefs::kHatsGeneralCameraPrioritizedSurveyCycleEndTs,
    // survey_last_interaction_timestamp_pref_name
    prefs::kHatsGeneralCameraPrioritizedLastInteractionTimestamp,
    // threshold_time
    base::Days(120),
};

// Bluetooth revamp experience survey -- shown 5 mins after interacting with new
// Bluetooth UI surfaces.
const HatsConfig kHatsBluetoothRevampSurvey = {
    ::features::kHappinessTrackingSystemBluetoothRevamp,  // feature
    base::Days(1),                          // new_device_threshold
    prefs::kHatsBluetoothRevampIsSelected,  // is_selected_pref_name
    prefs::kHatsBluetoothRevampCycleEndTs,  // cycle_end_timestamp_pref_name
};

// Battery life experience survey -- shown after login.
const HatsConfig kHatsBatteryLifeSurvey = {
    ::features::kHappinessTrackingSystemBatteryLife,  // feature
    base::Days(7),                                    // new_device_threshold
    prefs::kHatsBatteryLifeIsSelected,                // is_selected_pref_name
    prefs::kHatsBatteryLifeCycleEndTs,  // cycle_end_timestamp_pref_name
};

// Peripherals experience survey -- shown after login.
const HatsConfig kHatsPeripheralsSurvey = {
    ::features::kHappinessTrackingSystemPeripherals,  // feature
    base::Days(7),                                    // new_device_threshold
    prefs::kHatsPeripheralsIsSelected,                // is_selected_pref_name
    prefs::kHatsPeripheralsCycleEndTs,  // cycle_end_timestamp_pref_name
};

// Privacy Hub post launch experience survey -- shown 40 seconds after the user
// leaves the Privacy controls page after staying there for 5 seconds.
const HatsConfig kPrivacyHubPostLaunchSurvey = {
    ::features::kHappinessTrackingPrivacyHubPostLaunch,  // feature
    base::Days(1),                                       // new_device_threshold
    prefs::kHatsPrivacyHubPostLaunchIsSelected,  // is_selected_pref_name
    prefs::
        kHatsPrivacyHubPostLaunchCycleEndTs,  // cycle_end_timestamp_pref_name
};

// OS Settings Survey -- shown [5-30] seconds after a user removes focus from
// Settings or closes the Settings app, if user has used Search, it will add it
// as a Product Specific Data (PSD).
const HatsConfig kHatsOsSettingsSearchSurvey = {
    ::features::kHappinessTrackingOsSettingsSearch,  // feature
    base::Days(1),                                   // new_device_threshold
    prefs::kHatsOsSettingsSearchSurveyIsSelected,    // is_selected_pref_name
    prefs::
        kHatsOsSettingsSearchSurveyCycleEndTs,  // cycle_end_timestamp_pref_name
};

// Borealis games survey -- Shown after a Steam game exits.
const HatsConfig kHatsBorealisGamesSurvey = {
    ::features::kHappinessTrackingBorealisGames,  // feature
    base::Days(1),                                // new_device_threshold
    prefs::kHatsBorealisGamesSurveyIsSelected,    // is_selected_pref_name
    prefs::kHatsBorealisGamesSurveyCycleEndTs,  // cycle_end_timestamp_pref_name
    prefs::kHatsBorealisGamesLastInteractionTimestamp,
    // survey_last_interaction_timestamp_pref_name
    base::Days(7),  // threshold_time
};

// Launcher survey -- Shown after a user opens the launcher for the first time.
// This survey is enabled for 25% of users.
const HatsConfig kHatsLauncherAppsFindingSurvey = {
    ::features::kHappinessTrackingLauncherAppsFinding,  // feature
    base::Hours(2),                                     // new_device_threshold
    prefs::kHatsLauncherAppsSurveyIsSelected,           // is_selected_pref_name
    prefs::kHatsLauncherAppsSurveyCycleEndTs,  // cycle_end_timestamp_pref_name
};

// Launcher survey -- Shown after a user opens the launcher for the first time.
// This survey is enabled for 75% of users.
const HatsConfig kHatsLauncherAppsNeedingSurvey = {
    ::features::kHappinessTrackingLauncherAppsNeeding,  // feature
    base::Hours(2),                                     // new_device_threshold
    prefs::kHatsLauncherAppsSurveyIsSelected,           // is_selected_pref_name
    prefs::kHatsLauncherAppsSurveyCycleEndTs,  // cycle_end_timestamp_pref_name
};

// Office integration survey -- Shown after the user opens an Office file:
// For MS365 and Docs/Sheets/Slides, shown when the app is inactive or closed.
// For QuickOffice, shown 1 minute after launch.
const HatsConfig kHatsOfficeSurvey = {
    ::features::kHappinessTrackingOffice,  // feature
    base::Days(1),                         // new_device_threshold
    prefs::kHatsOfficeSurveyIsSelected,    // is_selected_pref_name
    prefs::kHatsOfficeSurveyCycleEndTs,    // cycle_end_timestamp_pref_name
};

}  // namespace ash