[go: nahoru, domu]

Help app: Add Welcome tour as a launch source for the Help app.

The welcome tour currently launches Help app with ChromeInternal as the
launch source. However, we want to track launches via the Welcome tour
as its own launch source.

Bug: b/322267508
Change-Id: If5ecfb15c918a6b3acd1d92391b261f57b4de16d
Cq-Include-Trybots: luci.chromium.try:linux-chromeos-rel;luci.chrome.try:linux-chromeos-chrome
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/5298477
Reviewed-by: Tim Sergeant <tsergeant@chromium.org>
Reviewed-by: David Black <dmblack@google.com>
Commit-Queue: Callistus Tan <callistus@google.com>
Reviewed-by: Dominick Ng <dominickn@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1262238}
diff --git a/ash/user_education/mock_user_education_delegate.h b/ash/user_education/mock_user_education_delegate.h
index 0464d58..ba78567 100644
--- a/ash/user_education/mock_user_education_delegate.h
+++ b/ash/user_education/mock_user_education_delegate.h
@@ -12,6 +12,7 @@
 #include "ash/ash_export.h"
 #include "ash/user_education/user_education_delegate.h"
 #include "components/account_id/account_id.h"
+#include "components/services/app_service/public/cpp/app_launch_util.h"
 #include "components/user_education/common/help_bubble.h"
 #include "components/user_education/common/tutorial_description.h"
 #include "testing/gmock/include/gmock/gmock.h"
@@ -75,6 +76,7 @@
               LaunchSystemWebAppAsync,
               (const AccountId& account_id,
                SystemWebAppType system_web_app_type,
+               apps::LaunchSource launch_source,
                int64_t display_id),
               (override));
   MOCK_METHOD(bool,
diff --git a/ash/user_education/user_education_controller.cc b/ash/user_education/user_education_controller.cc
index b7169ef..7a14141 100644
--- a/ash/user_education/user_education_controller.cc
+++ b/ash/user_education/user_education_controller.cc
@@ -16,6 +16,7 @@
 #include "ash/user_education/welcome_tour/welcome_tour_prefs.h"
 #include "base/check_op.h"
 #include "components/account_id/account_id.h"
+#include "components/services/app_service/public/cpp/app_launch_util.h"
 
 namespace ash {
 namespace {
@@ -78,13 +79,14 @@
 void UserEducationController::LaunchSystemWebAppAsync(
     UserEducationPrivateApiKey,
     SystemWebAppType system_web_app_type,
+    apps::LaunchSource launch_source,
     int64_t display_id) {
   // NOTE: User education in Ash is currently only supported for the primary
   // user profile. This is a self-imposed restriction.
   auto account_id = Shell::Get()->session_controller()->GetActiveAccountId();
   CHECK(user_education_util::IsPrimaryAccountId(account_id));
   delegate_->LaunchSystemWebAppAsync(account_id, system_web_app_type,
-                                     display_id);
+                                     launch_source, display_id);
 }
 
 }  // namespace ash
diff --git a/ash/user_education/user_education_controller.h b/ash/user_education/user_education_controller.h
index 96e1bf0..9071aab 100644
--- a/ash/user_education/user_education_controller.h
+++ b/ash/user_education/user_education_controller.h
@@ -18,6 +18,10 @@
 
 class PrefRegistrySimple;
 
+namespace apps {
+enum class LaunchSource;
+}  // namespace apps
+
 namespace ui {
 class ElementIdentifier;
 }  // namespace ui
@@ -64,6 +68,7 @@
   // NOTE: Currently only the primary user profile is supported.
   void LaunchSystemWebAppAsync(UserEducationPrivateApiKey,
                                SystemWebAppType system_web_app_type,
+                               apps::LaunchSource launch_source,
                                int64_t display_id);
 
  private:
diff --git a/ash/user_education/user_education_delegate.h b/ash/user_education/user_education_delegate.h
index 93418bc..edd0810 100644
--- a/ash/user_education/user_education_delegate.h
+++ b/ash/user_education/user_education_delegate.h
@@ -14,6 +14,10 @@
 
 class AccountId;
 
+namespace apps {
+enum class LaunchSource;
+}  // namespace apps
+
 namespace ui {
 class ElementContext;
 class ElementIdentifier;
@@ -105,6 +109,7 @@
   // NOTE: Currently only the primary user profile is supported.
   virtual void LaunchSystemWebAppAsync(const AccountId& account_id,
                                        SystemWebAppType system_web_app_type,
+                                       apps::LaunchSource launch_source,
                                        int64_t display_id) = 0;
 
   // Returns true if there is a currently running tutorial for the user
diff --git a/ash/user_education/welcome_tour/welcome_tour_controller.cc b/ash/user_education/welcome_tour/welcome_tour_controller.cc
index 476a34d..23dbfef 100644
--- a/ash/user_education/welcome_tour/welcome_tour_controller.cc
+++ b/ash/user_education/welcome_tour/welcome_tour_controller.cc
@@ -93,7 +93,7 @@
 
 void LaunchExploreAppAsync(UserEducationPrivateApiKey key) {
   UserEducationController::Get()->LaunchSystemWebAppAsync(
-      key, ash::SystemWebAppType::HELP,
+      key, ash::SystemWebAppType::HELP, apps::LaunchSource::kFromWelcomeTour,
       display::Screen::GetScreen()->GetPrimaryDisplay().id());
 }
 
diff --git a/ash/user_education/welcome_tour/welcome_tour_controller_unittest.cc b/ash/user_education/welcome_tour/welcome_tour_controller_unittest.cc
index 2d49dc7..d9265e2 100644
--- a/ash/user_education/welcome_tour/welcome_tour_controller_unittest.cc
+++ b/ash/user_education/welcome_tour/welcome_tour_controller_unittest.cc
@@ -48,6 +48,7 @@
 #include "base/test/scoped_feature_list.h"
 #include "base/test/test_future.h"
 #include "components/account_id/account_id.h"
+#include "components/services/app_service/public/cpp/app_launch_util.h"
 #include "components/user_education/common/tutorial_description.h"
 #include "components/user_manager/user_type.h"
 #include "testing/gmock/include/gmock/gmock.h"
@@ -447,6 +448,7 @@
     EXPECT_CALL(*user_education_delegate,
                 LaunchSystemWebAppAsync(
                     Eq(primary_account_id), Eq(ash::SystemWebAppType::HELP),
+                    Eq(apps::LaunchSource::kFromWelcomeTour),
                     Eq(display::Screen::GetScreen()->GetPrimaryDisplay().id())))
         .Times(display::Screen::GetScreen()->InTabletMode() ? 0u : 1u);
     std::move(ended_callback).Run();
@@ -503,6 +505,7 @@
   EXPECT_CALL(*user_education_delegate(),
               LaunchSystemWebAppAsync(
                   Eq(primary_account_id), Eq(ash::SystemWebAppType::HELP),
+                  Eq(apps::LaunchSource::kFromWelcomeTour),
                   Eq(display::Screen::GetScreen()->GetPrimaryDisplay().id())));
 
   // Click the `cancel_button` and verify the Welcome Tour is ended.
@@ -538,6 +541,7 @@
   EXPECT_CALL(*user_education_delegate(),
               LaunchSystemWebAppAsync(
                   Eq(primary_account_id), Eq(ash::SystemWebAppType::HELP),
+                  Eq(apps::LaunchSource::kFromWelcomeTour),
                   Eq(display::Screen::GetScreen()->GetPrimaryDisplay().id())));
 
   auto* const a11y_controller = Shell::Get()->accessibility_controller();
@@ -570,6 +574,7 @@
   EXPECT_CALL(*user_education_delegate(),
               LaunchSystemWebAppAsync(
                   Eq(primary_account_id), Eq(ash::SystemWebAppType::HELP),
+                  Eq(apps::LaunchSource::kFromWelcomeTour),
                   Eq(display::Screen::GetScreen()->GetPrimaryDisplay().id())));
   session->SetSessionState(SessionState::ACTIVE);
   Mock::VerifyAndClearExpectations(user_education_delegate());
@@ -633,6 +638,7 @@
   EXPECT_CALL(*user_education_delegate(),
               LaunchSystemWebAppAsync(
                   Eq(primary_account_id), Eq(ash::SystemWebAppType::HELP),
+                  Eq(apps::LaunchSource::kFromWelcomeTour),
                   Eq(display::Screen::GetScreen()->GetPrimaryDisplay().id())))
       .Times(IsCounterfactual().value_or(false) ? 1u : 0u);
 
@@ -767,6 +773,7 @@
   EXPECT_CALL(*user_education_delegate(),
               LaunchSystemWebAppAsync(
                   Eq(primary_account_id()), Eq(ash::SystemWebAppType::HELP),
+                  Eq(apps::LaunchSource::kFromWelcomeTour),
                   Eq(display::Screen::GetScreen()->GetPrimaryDisplay().id())))
       .Times(0);
 
@@ -863,6 +870,7 @@
         *user_education_delegate(),
         LaunchSystemWebAppAsync(
             Eq(primary_account_id), Eq(ash::SystemWebAppType::HELP),
+            Eq(apps::LaunchSource::kFromWelcomeTour),
             Eq(display::Screen::GetScreen()->GetPrimaryDisplay().id())));
 
     // Click `accept_button` to close the Welcome Tour dialog.
@@ -1333,6 +1341,7 @@
   EXPECT_CALL(*user_education_delegate(),
               LaunchSystemWebAppAsync(
                   Eq(primary_account_id), Eq(ash::SystemWebAppType::HELP),
+                  Eq(apps::LaunchSource::kFromWelcomeTour),
                   Eq(display::Screen::GetScreen()->GetPrimaryDisplay().id())))
       .Times(0);
   SimulateNewUserFirstLogin(primary_account_id.GetUserEmail());
@@ -1375,6 +1384,7 @@
   EXPECT_CALL(*user_education_delegate(),
               LaunchSystemWebAppAsync(
                   Eq(primary_account_id), Eq(ash::SystemWebAppType::HELP),
+                  Eq(apps::LaunchSource::kFromWelcomeTour),
                   Eq(display::Screen::GetScreen()->GetPrimaryDisplay().id())))
       .Times(0);
   EXPECT_CALL(*observer(), OnWelcomeTourEnded);
diff --git a/chrome/browser/apps/app_service/launch_utils.cc b/chrome/browser/apps/app_service/launch_utils.cc
index 84d987fc..205692fb0 100644
--- a/chrome/browser/apps/app_service/launch_utils.cc
+++ b/chrome/browser/apps/app_service/launch_utils.cc
@@ -296,6 +296,7 @@
     case LaunchSource::kFromSmartTextContextMenu:
     case LaunchSource::kFromDiscoverTabNotification:
     case LaunchSource::kFromFirstRun:
+    case LaunchSource::kFromWelcomeTour:
       return extensions::AppLaunchSource::kSourceChromeInternal;
     case LaunchSource::kFromInstalledNotification:
       return extensions::AppLaunchSource::kSourceInstalledNotification;
diff --git a/chrome/browser/apps/app_service/metrics/app_service_metrics.cc b/chrome/browser/apps/app_service/metrics/app_service_metrics.cc
index 9f21430..521b915 100644
--- a/chrome/browser/apps/app_service/metrics/app_service_metrics.cc
+++ b/chrome/browser/apps/app_service/metrics/app_service_metrics.cc
@@ -160,6 +160,10 @@
       base::UmaHistogramEnumeration("Apps.DefaultAppLaunch.FromFirstRun",
                                     default_app_name);
       break;
+    case apps::LaunchSource::kFromWelcomeTour:
+      base::UmaHistogramEnumeration("Apps.DefaultAppLaunch.FromWelcomeTour",
+                                    default_app_name);
+      break;
     case apps::LaunchSource::kFromCommandLine:
     case apps::LaunchSource::kFromBackgroundMode:
     case apps::LaunchSource::kFromAppHomePage:
@@ -173,9 +177,11 @@
 #if BUILDFLAG(IS_CHROMEOS_ASH)
 void RecordWelcomeTourInteraction(apps::DefaultAppName default_app_name,
                                   apps::LaunchSource launch_source) {
-  // This metric is intended to capture user actions. Do not log automatically
-  // launched apps.
-  if (launch_source == apps::LaunchSource::kFromChromeInternal) {
+  // This metric is intended to capture actual user actions after the user
+  // completed the Welcome tour. Do not log automatically launched apps,
+  // including apps that were automatically launched by the Welcome Tour.
+  if (launch_source == apps::LaunchSource::kFromChromeInternal ||
+      launch_source == apps::LaunchSource::kFromWelcomeTour) {
     return;
   }
 
diff --git a/chrome/browser/apps/app_service/publishers/extension_apps_base.cc b/chrome/browser/apps/app_service/publishers/extension_apps_base.cc
index 7cf1438..c2dfedc 100644
--- a/chrome/browser/apps/app_service/publishers/extension_apps_base.cc
+++ b/chrome/browser/apps/app_service/publishers/extension_apps_base.cc
@@ -351,6 +351,7 @@
     case apps::LaunchSource::kFromSysTrayCalendar:
     case apps::LaunchSource::kFromInstaller:
     case apps::LaunchSource::kFromFirstRun:
+    case apps::LaunchSource::kFromWelcomeTour:
       break;
   }
 
diff --git a/chrome/browser/apps/app_service/publishers/extension_apps_chromeos.cc b/chrome/browser/apps/app_service/publishers/extension_apps_chromeos.cc
index 20c2a35..5286bea 100644
--- a/chrome/browser/apps/app_service/publishers/extension_apps_chromeos.cc
+++ b/chrome/browser/apps/app_service/publishers/extension_apps_chromeos.cc
@@ -172,6 +172,7 @@
     case apps::LaunchSource::kFromSysTrayCalendar:
     case apps::LaunchSource::kFromInstaller:
     case apps::LaunchSource::kFromFirstRun:
+    case apps::LaunchSource::kFromWelcomeTour:
       return ash::LAUNCH_FROM_UNKNOWN;
   }
 }
diff --git a/chrome/browser/ui/ash/user_education/chrome_user_education_delegate.cc b/chrome/browser/ui/ash/user_education/chrome_user_education_delegate.cc
index 24c7d5cd..65fef2f 100644
--- a/chrome/browser/ui/ash/user_education/chrome_user_education_delegate.cc
+++ b/chrome/browser/ui/ash/user_education/chrome_user_education_delegate.cc
@@ -23,6 +23,7 @@
 #include "chrome/browser/web_applications/web_app_id_constants.h"
 #include "chromeos/ash/components/browser_context_helper/browser_context_helper.h"
 #include "components/account_id/account_id.h"
+#include "components/services/app_service/public/cpp/app_launch_util.h"
 #include "components/user_education/common/help_bubble.h"
 #include "components/user_education/common/help_bubble_factory_registry.h"
 #include "components/user_education/common/help_bubble_params.h"
@@ -184,13 +185,16 @@
 void ChromeUserEducationDelegate::LaunchSystemWebAppAsync(
     const AccountId& account_id,
     ash::SystemWebAppType system_web_app_type,
+    apps::LaunchSource launch_source,
     int64_t display_id) {
   // NOTE: User education in Ash is currently only supported for the primary
   // user profile. This is a self-imposed restriction.
   auto* const profile = GetProfile(account_id);
   CHECK(IsPrimaryProfile(profile));
-  ash::LaunchSystemWebAppAsync(profile, system_web_app_type,
-                               ash::SystemAppLaunchParams(),
+
+  ash::SystemAppLaunchParams launch_params;
+  launch_params.launch_source = launch_source;
+  ash::LaunchSystemWebAppAsync(profile, system_web_app_type, launch_params,
                                std::make_unique<apps::WindowInfo>(display_id));
 }
 
diff --git a/chrome/browser/ui/ash/user_education/chrome_user_education_delegate.h b/chrome/browser/ui/ash/user_education/chrome_user_education_delegate.h
index 7e692b1..cc788e9 100644
--- a/chrome/browser/ui/ash/user_education/chrome_user_education_delegate.h
+++ b/chrome/browser/ui/ash/user_education/chrome_user_education_delegate.h
@@ -56,6 +56,7 @@
       std::optional<ash::TutorialId> tutorial_id = std::nullopt) override;
   void LaunchSystemWebAppAsync(const AccountId& account_id,
                                ash::SystemWebAppType system_web_app_type,
+                               apps::LaunchSource launch_source,
                                int64_t display_id) override;
   bool IsRunningTutorial(
       const AccountId& account_id,
diff --git a/chrome/browser/ui/ash/user_education/chrome_user_education_delegate_browsertest.cc b/chrome/browser/ui/ash/user_education/chrome_user_education_delegate_browsertest.cc
index 26a8f8e..d38e1ff 100644
--- a/chrome/browser/ui/ash/user_education/chrome_user_education_delegate_browsertest.cc
+++ b/chrome/browser/ui/ash/user_education/chrome_user_education_delegate_browsertest.cc
@@ -9,6 +9,7 @@
 
 #include "ash/webui/system_apps/public/system_web_app_type.h"
 #include "base/test/run_until.h"
+#include "chrome/browser/apps/app_service/metrics/app_service_metrics.h"
 #include "chrome/browser/ash/system_web_apps/test_support/system_web_app_browsertest_base.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/browser.h"
@@ -16,6 +17,7 @@
 #include "chrome/browser/ui/web_applications/app_browser_controller.h"
 #include "chrome/browser/web_applications/web_app_id_constants.h"
 #include "chromeos/ash/components/browser_context_helper/browser_context_helper.h"
+#include "components/services/app_service/public/cpp/app_launch_util.h"
 #include "components/user_manager/user.h"
 #include "content/public/test/browser_test.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -52,13 +54,15 @@
                        LaunchSystemWebAppAsync) {
   // Wait for Explore app installation.
   WaitForTestSystemAppInstall();
+  base::HistogramTester histogram_tester;
 
   // Attempt to launch Explore app.
   delegate()->LaunchSystemWebAppAsync(
       ash::BrowserContextHelper::Get()
           ->GetUserByBrowserContext(browser()->profile())
           ->GetAccountId(),
-      ash::SystemWebAppType::HELP, display::kDefaultDisplayId);
+      ash::SystemWebAppType::HELP, apps::LaunchSource::kFromWelcomeTour,
+      display::kDefaultDisplayId);
 
   // Expect Explore app to launch asynchronously.
   EXPECT_TRUE(base::test::RunUntil([]() {
@@ -66,4 +70,6 @@
     return browser && web_app::AppBrowserController::IsForWebApp(
                           browser, web_app::kHelpAppId);
   }));
+  histogram_tester.ExpectUniqueSample("Apps.DefaultAppLaunch.FromWelcomeTour",
+                                      apps::DefaultAppName::kHelpApp, 1);
 }
diff --git a/chromeos/crosapi/mojom/app_service_types.mojom b/chromeos/crosapi/mojom/app_service_types.mojom
index 93f065b..cabd1f1 100644
--- a/chromeos/crosapi/mojom/app_service_types.mojom
+++ b/chromeos/crosapi/mojom/app_service_types.mojom
@@ -479,6 +479,7 @@
   [MinVersion=11] kFromSysTrayCalendar,          // System Tray Calendar.
   [MinVersion=12] kFromInstaller,                // Installation UI.
   [MinVersion=13] kFromFirstRun,                 // First Run.
+  [MinVersion=14] kFromWelcomeTour,              // Welcome Tour.
 };
 
 [Stable, Extensible]
diff --git a/chromeos/crosapi/mojom/app_service_types_mojom_traits.cc b/chromeos/crosapi/mojom/app_service_types_mojom_traits.cc
index 50be59f..5b6d642 100644
--- a/chromeos/crosapi/mojom/app_service_types_mojom_traits.cc
+++ b/chromeos/crosapi/mojom/app_service_types_mojom_traits.cc
@@ -990,6 +990,8 @@
       return crosapi::mojom::LaunchSource::kFromInstaller;
     case apps::LaunchSource::kFromFirstRun:
       return crosapi::mojom::LaunchSource::kFromFirstRun;
+    case apps::LaunchSource::kFromWelcomeTour:
+      return crosapi::mojom::LaunchSource::kFromWelcomeTour;
     // TODO(crbug.com/1343692): Make lock screen apps use lacros browser.
     case apps::LaunchSource::kFromLockScreen:
     case apps::LaunchSource::kFromCommandLine:
@@ -1106,6 +1108,9 @@
     case crosapi::mojom::LaunchSource::kFromFirstRun:
       *output = apps::LaunchSource::kFromFirstRun;
       return true;
+    case crosapi::mojom::LaunchSource::kFromWelcomeTour:
+      *output = apps::LaunchSource::kFromWelcomeTour;
+      return true;
   }
 
   NOTREACHED();
diff --git a/components/services/app_service/public/cpp/app_launch_util.cc b/components/services/app_service/public/cpp/app_launch_util.cc
index 1a75bb0..263cf5a4 100644
--- a/components/services/app_service/public/cpp/app_launch_util.cc
+++ b/components/services/app_service/public/cpp/app_launch_util.cc
@@ -99,6 +99,8 @@
       return ApplicationLaunchSource::APPLICATION_LAUNCH_SOURCE_INSTALLER;
     case LaunchSource::kFromFirstRun:
       return ApplicationLaunchSource::APPLICATION_LAUNCH_SOURCE_FIRST_RUN;
+    case LaunchSource::kFromWelcomeTour:
+      return ApplicationLaunchSource::APPLICATION_LAUNCH_SOURCE_WELCOME_TOUR;
   }
 }
 
diff --git a/components/services/app_service/public/cpp/app_launch_util.h b/components/services/app_service/public/cpp/app_launch_util.h
index 5e3e4a1c..987eb546 100644
--- a/components/services/app_service/public/cpp/app_launch_util.h
+++ b/components/services/app_service/public/cpp/app_launch_util.h
@@ -68,10 +68,11 @@
   kFromSysTrayCalendar = 36,  // Launches from the system tray Calendar.
   kFromInstaller = 37,        // Installation UI
   kFromFirstRun = 38,         // First Run.
+  kFromWelcomeTour = 39,      // Welcome Tour.
 
   // Add any new values above this one, and update kMaxValue to the highest
   // enumerator value.
-  kMaxValue = kFromFirstRun,
+  kMaxValue = kFromWelcomeTour,
 };
 
 // Don't remove items or change the order of this enum.  It's used in
diff --git a/components/services/app_service/public/cpp/types_util.cc b/components/services/app_service/public/cpp/types_util.cc
index d15ebd0..6ec4fef4 100644
--- a/components/services/app_service/public/cpp/types_util.cc
+++ b/components/services/app_service/public/cpp/types_util.cc
@@ -53,6 +53,7 @@
     case apps::LaunchSource::kFromProfileMenu:
     case apps::LaunchSource::kFromSysTrayCalendar:
     case apps::LaunchSource::kFromInstaller:
+    case apps::LaunchSource::kFromWelcomeTour:
       return true;
     case apps::LaunchSource::kUnknown:
     case apps::LaunchSource::kFromChromeInternal:
diff --git a/components/services/app_service/public/protos/app_types.proto b/components/services/app_service/public/protos/app_types.proto
index 685e0f62..53c44a1 100644
--- a/components/services/app_service/public/protos/app_types.proto
+++ b/components/services/app_service/public/protos/app_types.proto
@@ -109,6 +109,7 @@
   APPLICATION_LAUNCH_SOURCE_SYSTEM_TRAY_CALENDAR = 36;
   APPLICATION_LAUNCH_SOURCE_INSTALLER = 37;
   APPLICATION_LAUNCH_SOURCE_FIRST_RUN = 38;
+  APPLICATION_LAUNCH_SOURCE_WELCOME_TOUR = 39;
 }
 
 // Describes the app uninstall source. Should be kept in sync with
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml
index df1d7c41..f7b78d9 100644
--- a/tools/metrics/histograms/enums.xml
+++ b/tools/metrics/histograms/enums.xml
@@ -14987,6 +14987,7 @@
   <int value="36" label="Launch from system tray Calendar"/>
   <int value="37" label="Installer"/>
   <int value="38" label="First run"/>
+  <int value="39" label="Welcome Tour"/>
 </enum>
 
 <enum name="LcppHintStatus">
diff --git a/tools/metrics/histograms/metadata/apps/histograms.xml b/tools/metrics/histograms/metadata/apps/histograms.xml
index bb647ce..96cf4683 100644
--- a/tools/metrics/histograms/metadata/apps/histograms.xml
+++ b/tools/metrics/histograms/metadata/apps/histograms.xml
@@ -2125,6 +2125,7 @@
         summary="From Smart text selection context menu."/>
     <variant name=".FromSysTrayCalendar" summary="From system tray Calendar."/>
     <variant name=".FromUrlHandler" summary="From URL handler."/>
+    <variant name=".FromWelcomeTour" summary="From Welcome Tour."/>
   </token>
 </histogram>