chromium/chromeos/ash/components/scalable_iph/config.cc

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

#include "chromeos/ash/components/scalable_iph/config.h"

#include "ash/constants/ash_features.h"
#include "components/feature_engagement/public/feature_constants.h"

namespace scalable_iph {

namespace {

// This ID is from //chrome/browser/web_applications/web_app_id_constants.h. We
// cannot include the file from this directory as //chromeos should not depend
// on //chrome.
constexpr char kHelpAppId[] = "nbljnnecbjbmifnoehiemkgefbnpoeak";

constexpr char kWelcomeTips[] = "Welcome Tips";

std::unique_ptr<Config> GetBaseConfig() {
  std::unique_ptr<Config> config = std::make_unique<Config>();
  config->params[kCustomConditionNetworkConnectionParamName] =
      kCustomConditionNetworkConnectionOnline;
  config->params[kCustomConditionClientAgeInDaysParamName] = "6";
  return config;
}

void AddWelcomeTipsBubbleParams(Config* config) {
  config->ui_type = UiType::kBubble;

  CHECK(!config->bubble_params) << "Bubble params is already set";
  config->bubble_params = std::make_unique<ScalableIphDelegate::BubbleParams>();
  config->bubble_params->title = kWelcomeTips;
}

std::unique_ptr<Config> GetUnlockedBasedConfig(const base::Feature& feature) {
  if (&feature == &feature_engagement::kIPHScalableIphUnlockedBasedOneFeature) {
    std::unique_ptr<Config> config = GetBaseConfig();
    AddWelcomeTipsBubbleParams(config.get());
    config->bubble_params->bubble_id = "scalable_iph_unlocked_based_one";
    config->bubble_params->text =
        "Connect to the world on your Chromebook with Chrome browser";
    config->bubble_params->icon = ScalableIphDelegate::BubbleIcon::kChromeIcon;
    config->bubble_params->button.text = "Open Chrome";
    config->bubble_params->button.action.action_type = ActionType::kOpenChrome;
    return config;
  }

  if (&feature == &feature_engagement::kIPHScalableIphUnlockedBasedTwoFeature) {
    std::unique_ptr<Config> config = GetBaseConfig();
    AddWelcomeTipsBubbleParams(config.get());
    config->bubble_params->bubble_id = "scalable_iph_unlocked_based_two";
    config->bubble_params->text = "Search and find your apps in the Launcher ◉";
    return config;
  }

  if (&feature ==
      &feature_engagement::kIPHScalableIphUnlockedBasedThreeFeature) {
    std::unique_ptr<Config> config = GetBaseConfig();
    AddWelcomeTipsBubbleParams(config.get());
    config->bubble_params->bubble_id = "scalable_iph_unlocked_based_three";
    config->bubble_params->text =
        "Make your Chromebook uniquely yours with a new wallpaper";
    config->bubble_params->button.text = "Select wallpaper";
    config->bubble_params->button.action.action_type =
        ActionType::kOpenPersonalizationApp;
    return config;
  }

  if (&feature ==
      &feature_engagement::kIPHScalableIphUnlockedBasedFourFeature) {
    std::unique_ptr<Config> config = GetBaseConfig();
    AddWelcomeTipsBubbleParams(config.get());
    config->bubble_params->bubble_id = "scalable_iph_unlocked_based_four";
    config->bubble_params->text = "Get your favorite apps from the Play Store";
    config->bubble_params->icon =
        ScalableIphDelegate::BubbleIcon::kPlayStoreIcon;
    config->bubble_params->button.text = "Open Play Store";
    config->bubble_params->button.action.action_type =
        ActionType::kOpenPlayStore;
    return config;
  }

  if (&feature ==
      &feature_engagement::kIPHScalableIphUnlockedBasedFiveFeature) {
    std::unique_ptr<Config> config = GetBaseConfig();
    AddWelcomeTipsBubbleParams(config.get());
    config->bubble_params->bubble_id = "scalable_iph_unlocked_based_five";
    config->bubble_params->text =
        "Create, edit, and collaborate with Google Docs";
    config->bubble_params->icon =
        ScalableIphDelegate::BubbleIcon::kGoogleDocsIcon;
    config->bubble_params->button.text = "Open Docs";
    config->bubble_params->button.action.action_type =
        ActionType::kOpenGoogleDocs;
    return config;
  }

  if (&feature == &feature_engagement::kIPHScalableIphUnlockedBasedSixFeature) {
    std::unique_ptr<Config> config = GetBaseConfig();
    AddWelcomeTipsBubbleParams(config.get());
    config->bubble_params->bubble_id = "scalable_iph_unlocked_based_six";
    config->bubble_params->text =
        "Explore your favorite memories in Google Photos";
    config->bubble_params->icon =
        ScalableIphDelegate::BubbleIcon::kGooglePhotosIcon;
    config->bubble_params->button.text = "Open Photos";
    config->bubble_params->button.action.action_type =
        ActionType::kOpenGooglePhotos;
    return config;
  }

  if (&feature ==
      &feature_engagement::kIPHScalableIphUnlockedBasedSevenFeature) {
    std::unique_ptr<Config> config = GetBaseConfig();

    config->params[kCustomConditionHasSavedPrintersParamName] =
        kCustomConditionHasSavedPrintersValueFalse;

    AddWelcomeTipsBubbleParams(config.get());
    config->bubble_params->bubble_id = "scalable_iph_unlocked_based_seven";
    config->bubble_params->text = "Easily add a printer to your Chromebook";
    config->bubble_params->icon =
        ScalableIphDelegate::BubbleIcon::kPrintJobsIcon;
    config->bubble_params->button.text = "Add printer";
    config->bubble_params->button.action.action_type =
        ActionType::kOpenSettingsPrinter;
    return config;
  }

  if (&feature ==
      &feature_engagement::kIPHScalableIphUnlockedBasedEightFeature) {
    std::unique_ptr<Config> config = GetBaseConfig();

    config->params[kCustomConditionPhoneHubOnboardingEligibleParamName] =
        kCustomConditionPhoneHubOnboardingEligibleValueTrue;

    AddWelcomeTipsBubbleParams(config.get());
    config->bubble_params->bubble_id = "scalable_iph_unlocked_based_eight";
    config->bubble_params->text =
        "Quickly reply to your messages from your Android phone";
    config->bubble_params->button.text = "Connect phone";
    config->bubble_params->button.action.action_type =
        ActionType::kOpenPhoneHub;
    return config;
  }

  if (&feature ==
      &feature_engagement::kIPHScalableIphUnlockedBasedNineFeature) {
    std::unique_ptr<Config> config = GetBaseConfig();
    AddWelcomeTipsBubbleParams(config.get());
    config->bubble_params->bubble_id = "scalable_iph_unlocked_based_nine";
    config->bubble_params->text = "Watch your favorite content on YouTube";
    config->bubble_params->icon = ScalableIphDelegate::BubbleIcon::kYouTubeIcon;
    config->bubble_params->button.text = "Open YouTube";
    config->bubble_params->button.action.action_type = ActionType::kOpenYouTube;
    return config;
  }

  if (&feature == &feature_engagement::kIPHScalableIphUnlockedBasedTenFeature) {
    std::unique_ptr<Config> config = GetBaseConfig();
    AddWelcomeTipsBubbleParams(config.get());
    config->bubble_params->bubble_id = "scalable_iph_unlocked_based_ten";
    config->bubble_params->text = "Printing is easy with your Chromebook";
    config->bubble_params->icon =
        ScalableIphDelegate::BubbleIcon::kPrintJobsIcon;
    config->bubble_params->button.text = "Select file";
    config->bubble_params->button.action.action_type =
        ActionType::kOpenFileManager;
    return config;
  }

  return nullptr;
}

std::unique_ptr<Config> GetTimerBasedConfig(const base::Feature& feature) {
  // TODO(b/308010596): Move other config.

  return nullptr;
}

std::unique_ptr<Config> GetHelpAppBasedConfig(const base::Feature& feature) {
  if (&feature == &feature_engagement::kIPHScalableIphHelpAppBasedOneFeature ||
      &feature == &feature_engagement::kIPHScalableIphHelpAppBasedTwoFeature ||
      &feature ==
          &feature_engagement::kIPHScalableIphHelpAppBasedThreeFeature ||
      &feature == &feature_engagement::kIPHScalableIphHelpAppBasedFourFeature ||
      &feature == &feature_engagement::kIPHScalableIphHelpAppBasedFiveFeature ||
      &feature == &feature_engagement::kIPHScalableIphHelpAppBasedSixFeature ||
      &feature ==
          &feature_engagement::kIPHScalableIphHelpAppBasedSevenFeature ||
      &feature ==
          &feature_engagement::kIPHScalableIphHelpAppBasedEightFeature ||
      &feature == &feature_engagement::kIPHScalableIphHelpAppBasedNineFeature ||
      &feature == &feature_engagement::kIPHScalableIphHelpAppBasedTenFeature) {
    std::unique_ptr<Config> config = GetBaseConfig();
    config->ui_type = UiType::kNone;
    return config;
  }

  if (&feature ==
      &feature_engagement::kIPHScalableIphHelpAppBasedNudgeFeature) {
    std::unique_ptr<Config> config = GetBaseConfig();
    config->ui_type = UiType::kBubble;
    config->bubble_params =
        std::make_unique<ScalableIphDelegate::BubbleParams>();
    config->bubble_params->bubble_id = "scalable_iph_help_app_bubble";
    config->bubble_params->text = "Continue learning about your Chromebook";
    config->bubble_params->anchor_view_app_id = kHelpAppId;
    return config;
  }

  return nullptr;
}

}  // namespace

Config::Config() = default;
Config::~Config() = default;

std::unique_ptr<Config> GetConfig(const base::Feature& feature) {
  if (!ash::features::IsScalableIphClientConfigEnabled()) {
    return nullptr;
  }

  std::unique_ptr<Config> help_app_based = GetHelpAppBasedConfig(feature);
  if (help_app_based) {
    return help_app_based;
  }

  std::unique_ptr<Config> unlocked_based = GetUnlockedBasedConfig(feature);
  if (unlocked_based) {
    return unlocked_based;
  }

  std::unique_ptr<Config> timer_based = GetTimerBasedConfig(feature);
  if (timer_based) {
    return timer_based;
  }

  return nullptr;
}

}  // namespace scalable_iph