From 2bef7631aec8363b5a266a96eae04100e57183db Mon Sep 17 00:00:00 2001 From: Seraphima Date: Wed, 12 Feb 2020 13:03:40 +0300 Subject: [PATCH] Add telemetry event for general settings (#1269) * telemetry for general settings --- src/runner/general_settings.cpp | 83 ++++++++++++++++++++++----------- src/runner/general_settings.h | 15 ++++++ src/runner/main.cpp | 9 ++-- src/runner/trace.cpp | 34 +++++++++++++- src/runner/trace.h | 5 +- 5 files changed, 114 insertions(+), 32 deletions(-) diff --git a/src/runner/general_settings.cpp b/src/runner/general_settings.cpp index 5893ae153f..24f6f9b80b 100644 --- a/src/runner/general_settings.cpp +++ b/src/runner/general_settings.cpp @@ -8,6 +8,8 @@ #include #include +#include "trace.h" + static std::wstring settings_theme = L"system"; static bool run_as_elevated = false; @@ -18,6 +20,33 @@ namespace localized_strings const std::wstring_view STARTUP_DISABLED_BY_USER = LR"(This setting has been disabled manually via Startup Settings.)"; } +json::JsonObject GeneralSettings::to_json() +{ + json::JsonObject result; + + result.SetNamedValue(L"packaged", json::value(isPackaged)); + result.SetNamedValue(L"startup", json::value(isStartupEnabled)); + if (!startupDisabledReason.empty()) + { + result.SetNamedValue(L"startup_disabled_reason", json::value(startupDisabledReason)); + } + + json::JsonObject enabled; + for (const auto& [name, isEnabled] : isModulesEnabledMap) + { + enabled.SetNamedValue(name, json::value(isEnabled)); + } + result.SetNamedValue(L"enabled", std::move(enabled)); + + result.SetNamedValue(L"is_elevated", json::value(isElevated)); + result.SetNamedValue(L"run_elevated", json::value(isRunElevated)); + result.SetNamedValue(L"theme", json::value(theme)); + result.SetNamedValue(L"system_theme", json::value(systemTheme)); + result.SetNamedValue(L"powertoys_version", json::value(powerToysVersion)); + + return result; +} + json::JsonObject load_general_settings() { auto loaded = PTSettingsHelper::load_general_settings(); @@ -30,14 +59,17 @@ json::JsonObject load_general_settings() return loaded; } -json::JsonObject get_general_settings() +GeneralSettings get_settings() { - json::JsonObject result; + GeneralSettings settings{ + .isPackaged = winstore::running_as_packaged(), + .isElevated = is_process_elevated(), + .isRunElevated = run_as_elevated, + .theme = settings_theme, + .systemTheme = WindowsColors::is_dark_mode() ? L"dark" : L"light", + .powerToysVersion = get_product_version(), + }; - const bool packaged = winstore::running_as_packaged(); - result.SetNamedValue(L"packaged", json::value(packaged)); - - bool startup{}; if (winstore::running_as_packaged()) { using namespace localized_strings; @@ -45,41 +77,38 @@ json::JsonObject get_general_settings() switch (task_state) { case winstore::StartupTaskState::Disabled: - startup = false; + settings.isStartupEnabled = false; break; case winstore::StartupTaskState::Enabled: - startup = true; + settings.isStartupEnabled = true; break; case winstore::StartupTaskState::DisabledByPolicy: - result.SetNamedValue(L"startup_disabled_reason", json::value(STARTUP_DISABLED_BY_POLICY)); - startup = false; + settings.startupDisabledReason = STARTUP_DISABLED_BY_POLICY; + settings.isStartupEnabled = false; break; case winstore::StartupTaskState::DisabledByUser: - result.SetNamedValue(L"startup_disabled_reason", json::value(STARTUP_DISABLED_BY_USER)); - startup = false; + settings.startupDisabledReason = STARTUP_DISABLED_BY_USER; + settings.isStartupEnabled = false; break; } } else { - startup = is_auto_start_task_active_for_this_user(); + settings.isStartupEnabled = is_auto_start_task_active_for_this_user(); } - result.SetNamedValue(L"startup", json::value(startup)); - json::JsonObject enabled; for (auto& [name, powertoy] : modules()) { - enabled.SetNamedValue(name, json::value(powertoy.is_enabled())); + settings.isModulesEnabledMap[name] = powertoy.is_enabled(); } - result.SetNamedValue(L"enabled", std::move(enabled)); - bool is_elevated = is_process_elevated(); - result.SetNamedValue(L"is_elevated", json::value(is_elevated)); - result.SetNamedValue(L"run_elevated", json::value(run_as_elevated)); - result.SetNamedValue(L"theme", json::value(settings_theme)); - result.SetNamedValue(L"system_theme", json::value(WindowsColors::is_dark_mode() ? L"dark" : L"light")); - result.SetNamedValue(L"powertoys_version", json::value(get_product_version())); - return result; + return settings; +} + +json::JsonObject get_general_settings() +{ + auto settings = get_settings(); + return settings.to_json(); } void apply_general_settings(const json::JsonObject& general_configs) @@ -143,8 +172,10 @@ void apply_general_settings(const json::JsonObject& general_configs) { settings_theme = general_configs.GetNamedString(L"theme"); } - json::JsonObject save_settings = get_general_settings(); - PTSettingsHelper::save_general_settings(save_settings); + + GeneralSettings save_settings = get_settings(); + PTSettingsHelper::save_general_settings(save_settings.to_json()); + Trace::SettingsChanged(save_settings); } void start_initial_powertoys() diff --git a/src/runner/general_settings.h b/src/runner/general_settings.h index d35a1125b1..a83ca0df67 100644 --- a/src/runner/general_settings.h +++ b/src/runner/general_settings.h @@ -2,6 +2,21 @@ #include +struct GeneralSettings +{ + bool isPackaged; + bool isStartupEnabled; + std::wstring startupDisabledReason; + std::unordered_map isModulesEnabledMap; + bool isElevated; + bool isRunElevated; + std::wstring theme; + std::wstring systemTheme; + std::wstring powerToysVersion; + + json::JsonObject to_json(); +}; + json::JsonObject load_general_settings(); json::JsonObject get_general_settings(); void apply_general_settings(const json::JsonObject& general_configs); diff --git a/src/runner/main.cpp b/src/runner/main.cpp index 2f562ccba6..20e48bcb21 100644 --- a/src/runner/main.cpp +++ b/src/runner/main.cpp @@ -34,7 +34,7 @@ void chdir_current_executable() } } -int runner() +int runner(bool isProcessElevated) { DPIAware::EnableDPIAwarenessForThisProcess(); @@ -79,7 +79,7 @@ int runner() // Start initial powertoys start_initial_powertoys(); - Trace::EventLaunch(get_product_version()); + Trace::EventLaunch(get_product_version(), isProcessElevated); result = run_message_loop(); } @@ -115,11 +115,12 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine auto general_settings = load_general_settings(); int rvalue = 0; - if (is_process_elevated() || + bool isProcessElevated = is_process_elevated(); + if (isProcessElevated || general_settings.GetNamedBoolean(L"run_elevated", false) == false || strcmp(lpCmdLine, "--dont-elevate") == 0) { - result = runner(); + result = runner(isProcessElevated); } else { diff --git a/src/runner/trace.cpp b/src/runner/trace.cpp index 4d5f902ca0..26c0597371 100644 --- a/src/runner/trace.cpp +++ b/src/runner/trace.cpp @@ -1,6 +1,8 @@ #include "pch.h" #include "trace.h" +#include "general_settings.h" + TRACELOGGING_DEFINE_PROVIDER( g_hProvider, "Microsoft.PowerToys", @@ -18,12 +20,42 @@ void Trace::UnregisterProvider() TraceLoggingUnregister(g_hProvider); } -void Trace::EventLaunch(const std::wstring& versionNumber) +void Trace::EventLaunch(const std::wstring& versionNumber, bool isProcessElevated) { TraceLoggingWrite( g_hProvider, "Runner_Launch", TraceLoggingWideString(versionNumber.c_str(), "Version"), + TraceLoggingBoolean(isProcessElevated, "Elevated"), + ProjectTelemetryPrivacyDataTag(ProjectTelemetryTag_ProductAndServicePerformance), + TraceLoggingBoolean(TRUE, "UTCReplace_AppSessionGuid"), + TraceLoggingKeyword(PROJECT_KEYWORD_MEASURE)); +} + +void Trace::SettingsChanged(const GeneralSettings& settings) +{ + std::wstring enabledModules; + for (const auto& [name, isEnabled] : settings.isModulesEnabledMap) + { + if (isEnabled) + { + if (!enabledModules.empty()) + { + enabledModules += L", "; + } + + enabledModules += name; + } + } + + TraceLoggingWrite( + g_hProvider, + "GeneralSettingsChanged", + TraceLoggingBoolean(settings.isStartupEnabled, "RunAtStartup"), + TraceLoggingWideString(settings.startupDisabledReason.c_str(), "StartupDisabledReason"), + TraceLoggingWideString(enabledModules.c_str(), "ModulesEnabled"), + TraceLoggingBoolean(settings.isRunElevated, "AlwaysRunElevated"), + TraceLoggingWideString(settings.theme.c_str(), "Theme"), ProjectTelemetryPrivacyDataTag(ProjectTelemetryTag_ProductAndServicePerformance), TraceLoggingBoolean(TRUE, "UTCReplace_AppSessionGuid"), TraceLoggingKeyword(PROJECT_KEYWORD_MEASURE)); diff --git a/src/runner/trace.h b/src/runner/trace.h index 66390378bd..fe337723d7 100644 --- a/src/runner/trace.h +++ b/src/runner/trace.h @@ -1,9 +1,12 @@ #pragma once +struct GeneralSettings; + class Trace { public: static void RegisterProvider(); static void UnregisterProvider(); - static void EventLaunch(const std::wstring& versionNumber); + static void EventLaunch(const std::wstring& versionNumber, bool isProcessElevated); + static void SettingsChanged(const GeneralSettings& settings); };