| // Copyright 2024 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef CHROMEOS_ASH_COMPONENTS_AUDIO_AUDIO_DEVICE_METRICS_HANDLER_H_ |
| #define CHROMEOS_ASH_COMPONENTS_AUDIO_AUDIO_DEVICE_METRICS_HANDLER_H_ |
| |
| #include <string_view> |
| |
| #include "base/component_export.h" |
| #include "base/time/time.h" |
| #include "chromeos/ash/components/audio/audio_device.h" |
| |
| namespace ash { |
| |
| // AudioDeviceMetricsHandler handles the firing of cras audio related histogram |
| // metrics. |
| class COMPONENT_EXPORT(CHROMEOS_ASH_COMPONENTS_AUDIO) |
| AudioDeviceMetricsHandler { |
| public: |
| AudioDeviceMetricsHandler(); |
| AudioDeviceMetricsHandler(const AudioDeviceMetricsHandler&) = delete; |
| AudioDeviceMetricsHandler& operator=(const AudioDeviceMetricsHandler&) = |
| delete; |
| ~AudioDeviceMetricsHandler(); |
| |
| // Minimum/maximum bucket value of user overriding system decision of |
| // switching or not switching audio device. |
| static constexpr int kMinTimeInMinuteOfUserOverrideSystemDecision = 1; |
| static constexpr int kMaxTimeInHourOfUserOverrideSystemDecision = 8; |
| |
| // The histogram bucket count of user overriding system decision. |
| static constexpr int kUserOverrideSystemDecisionTimeDeltaBucketCount = 100; |
| |
| // Maximum number of connected input or output audio devices to record |
| // histogram metrics. |
| static constexpr uint32_t kMaxAudioDevicesCount = 10; |
| |
| // An enum histogram metric to measure the performance of audio selection |
| // mechanism. |
| static constexpr char kAudioSelectionPerformance[] = |
| "ChromeOS.AudioSelection"; |
| |
| // A series of user action metrics to record when user switches the |
| // input/output audio device and if this switch overrides the system decision. |
| static constexpr char kUserActionSwitchInput[] = |
| "StatusArea_Audio_SwitchInputDevice"; |
| static constexpr char kUserActionSwitchOutput[] = |
| "StatusArea_Audio_SwitchOutputDevice"; |
| static constexpr char kUserActionSwitchInputOverridden[] = |
| "StatusArea_Audio_AutoInputSelectionOverridden"; |
| static constexpr char kUserActionSwitchOutputOverridden[] = |
| "StatusArea_Audio_AutoOutputSelectionOverridden"; |
| |
| // A series of histogram metrics to record system selection decision after |
| // audio device has changed. And the time delta if user has overridden the |
| // system selection afterwards. |
| static constexpr char kSystemSwitchInputAudio[] = |
| "ChromeOS.AudioSelection.Input.SystemSwitchAudio"; |
| static constexpr char kSystemSwitchOutputAudio[] = |
| "ChromeOS.AudioSelection.Output.SystemSwitchAudio"; |
| static constexpr char kUserOverrideSystemSwitchInputAudio[] = |
| "ChromeOS.AudioSelection.Input.UserOverrideSystemSwitchTimeElapsed"; |
| static constexpr char kUserOverrideSystemSwitchOutputAudio[] = |
| "ChromeOS.AudioSelection.Output.UserOverrideSystemSwitchTimeElapsed"; |
| static constexpr char kUserOverrideSystemNotSwitchInputAudio[] = |
| "ChromeOS.AudioSelection.Input.UserOverrideSystemNotSwitchTimeElapsed"; |
| static constexpr char kUserOverrideSystemNotSwitchOutputAudio[] = |
| "ChromeOS.AudioSelection.Output.UserOverrideSystemNotSwitchTimeElapsed"; |
| |
| // A series of histogram metrics to record the audio device count when the |
| // system selection decision is made after audio device has changed. |
| static constexpr char kSystemSwitchInputAudioDeviceCount[] = |
| "ChromeOS.AudioSelection.Input.SystemSwitchAudio.AudioDeviceCount"; |
| static constexpr char kSystemNotSwitchInputAudioDeviceCount[] = |
| "ChromeOS.AudioSelection.Input.SystemNotSwitchAudio.AudioDeviceCount"; |
| static constexpr char kSystemSwitchOutputAudioDeviceCount[] = |
| "ChromeOS.AudioSelection.Output.SystemSwitchAudio.AudioDeviceCount"; |
| static constexpr char kSystemNotSwitchOutputAudioDeviceCount[] = |
| "ChromeOS.AudioSelection.Output.SystemNotSwitchAudio.AudioDeviceCount"; |
| |
| // A series of histogram metrics to record the audio device types when the |
| // system selection decision is made after audio device has changed. |
| static constexpr char kSystemSwitchInputAudioDeviceSet[] = |
| "ChromeOS.AudioSelection.Input.SystemSwitchAudio.AudioDeviceSet"; |
| static constexpr char kSystemNotSwitchInputAudioDeviceSet[] = |
| "ChromeOS.AudioSelection.Input.SystemNotSwitchAudio.AudioDeviceSet"; |
| static constexpr char kSystemSwitchOutputAudioDeviceSet[] = |
| "ChromeOS.AudioSelection.Output.SystemSwitchAudio.AudioDeviceSet"; |
| static constexpr char kSystemNotSwitchOutputAudioDeviceSet[] = |
| "ChromeOS.AudioSelection.Output.SystemNotSwitchAudio.AudioDeviceSet"; |
| |
| // A series of histogram metrics to record the before and after condition |
| // of audio device types when the system selection decision is made after |
| // audio device has changed. |
| static constexpr char kSystemSwitchInputBeforeAndAfterAudioDeviceSet[] = |
| "ChromeOS.AudioSelection.Input.SystemSwitchAudio." |
| "BeforeAndAfterAudioDeviceSet"; |
| static constexpr char kSystemNotSwitchInputBeforeAndAfterAudioDeviceSet[] = |
| "ChromeOS.AudioSelection.Input.SystemNotSwitchAudio." |
| "BeforeAndAfterAudioDeviceSet"; |
| static constexpr char kSystemSwitchOutputBeforeAndAfterAudioDeviceSet[] = |
| "ChromeOS.AudioSelection.Output.SystemSwitchAudio." |
| "BeforeAndAfterAudioDeviceSet"; |
| static constexpr char kSystemNotSwitchOutputBeforeAndAfterAudioDeviceSet[] = |
| "ChromeOS.AudioSelection.Output.SystemNotSwitchAudio." |
| "BeforeAndAfterAudioDeviceSet"; |
| |
| // A series of histogram metrics to record the before and after condition |
| // of audio device types when users override the system selection decision. |
| static constexpr char |
| kUserOverrideSystemSwitchInputBeforeAndAfterAudioDeviceSet[] = |
| "ChromeOS.AudioSelection.Input.UserOverrideSystemSwitchAudio." |
| "BeforeAndAfterAudioDeviceSet"; |
| static constexpr char |
| kUserOverrideSystemNotSwitchInputBeforeAndAfterAudioDeviceSet[] = |
| "ChromeOS.AudioSelection.Input.UserOverrideSystemNotSwitchAudio." |
| "BeforeAndAfterAudioDeviceSet"; |
| static constexpr char |
| kUserOverrideSystemSwitchOutputBeforeAndAfterAudioDeviceSet[] = |
| "ChromeOS.AudioSelection.Output.UserOverrideSystemSwitchAudio." |
| "BeforeAndAfterAudioDeviceSet"; |
| static constexpr char |
| kUserOverrideSystemNotSwitchOutputBeforeAndAfterAudioDeviceSet[] = |
| "ChromeOS.AudioSelection.Output.UserOverrideSystemNotSwitchAudio." |
| "BeforeAndAfterAudioDeviceSet"; |
| |
| // A series of histogram metrics to record system selection decision after |
| // audio device has changed. |
| static constexpr char kSystemSwitchInputAudioChromeRestarts[] = |
| "ChromeOS.AudioSelection.Input.SystemSwitchAudio.ChromeRestarts"; |
| static constexpr char kSystemSwitchOutputAudioChromeRestarts[] = |
| "ChromeOS.AudioSelection.Output.SystemSwitchAudio.ChromeRestarts"; |
| static constexpr char kSystemSwitchInputAudioNonChromeRestarts[] = |
| "ChromeOS.AudioSelection.Input.SystemSwitchAudio.NonChromeRestarts"; |
| static constexpr char kSystemSwitchOutputAudioNonChromeRestarts[] = |
| "ChromeOS.AudioSelection.Output.SystemSwitchAudio.NonChromeRestarts"; |
| |
| // A series of histogram metrics to record the time delta if user has |
| // overridden the system selection afterwards. |
| static constexpr char kUserOverrideSystemSwitchInputAudioChromeRestarts[] = |
| "ChromeOS.AudioSelection.Input.UserOverrideSystemSwitchTimeElapsed." |
| "ChromeRestarts"; |
| static constexpr char kUserOverrideSystemSwitchOutputAudioChromeRestarts[] = |
| "ChromeOS.AudioSelection.Output.UserOverrideSystemSwitchTimeElapsed." |
| "ChromeRestarts"; |
| static constexpr char kUserOverrideSystemNotSwitchInputAudioChromeRestarts[] = |
| "ChromeOS.AudioSelection.Input.UserOverrideSystemNotSwitchTimeElapsed." |
| "ChromeRestarts"; |
| static constexpr char |
| kUserOverrideSystemNotSwitchOutputAudioChromeRestarts[] = |
| "ChromeOS.AudioSelection.Output." |
| "UserOverrideSystemNotSwitchTimeElapsed.ChromeRestarts"; |
| static constexpr char kUserOverrideSystemSwitchInputAudioNonChromeRestarts[] = |
| "ChromeOS.AudioSelection.Input.UserOverrideSystemSwitchTimeElapsed." |
| "NonChromeRestarts"; |
| static constexpr char |
| kUserOverrideSystemSwitchOutputAudioNonChromeRestarts[] = |
| "ChromeOS.AudioSelection.Output.UserOverrideSystemSwitchTimeElapsed." |
| "NonChromeRestarts"; |
| static constexpr char |
| kUserOverrideSystemNotSwitchInputAudioNonChromeRestarts[] = |
| "ChromeOS.AudioSelection.Input." |
| "UserOverrideSystemNotSwitchTimeElapsed.NonChromeRestarts"; |
| static constexpr char |
| kUserOverrideSystemNotSwitchOutputAudioNonChromeRestarts[] = |
| "ChromeOS.AudioSelection.Output." |
| "UserOverrideSystemNotSwitchTimeElapsed.NonChromeRestarts"; |
| |
| // A series of histogram metrics to record the audio device count when the |
| // system selection decision is made after audio device has changed, separated |
| // by chrome restarts or not. |
| static constexpr char kSystemSwitchInputAudioDeviceCountChromeRestarts[] = |
| "ChromeOS.AudioSelection.Input.SystemSwitchAudio.AudioDeviceCount." |
| "ChromeRestarts"; |
| static constexpr char kSystemNotSwitchInputAudioDeviceCountChromeRestarts[] = |
| "ChromeOS.AudioSelection.Input.SystemNotSwitchAudio.AudioDeviceCount." |
| "ChromeRestarts"; |
| static constexpr char kSystemSwitchOutputAudioDeviceCountChromeRestarts[] = |
| "ChromeOS.AudioSelection.Output.SystemSwitchAudio.AudioDeviceCount." |
| "ChromeRestarts"; |
| static constexpr char kSystemNotSwitchOutputAudioDeviceCountChromeRestarts[] = |
| "ChromeOS.AudioSelection.Output.SystemNotSwitchAudio.AudioDeviceCount." |
| "ChromeRestarts"; |
| static constexpr char kSystemSwitchInputAudioDeviceCountNonChromeRestarts[] = |
| "ChromeOS.AudioSelection.Input.SystemSwitchAudio.AudioDeviceCount." |
| "NonChromeRestarts"; |
| static constexpr char |
| kSystemNotSwitchInputAudioDeviceCountNonChromeRestarts[] = |
| "ChromeOS.AudioSelection.Input.SystemNotSwitchAudio.AudioDeviceCount." |
| "NonChromeRestarts"; |
| static constexpr char kSystemSwitchOutputAudioDeviceCountNonChromeRestarts[] = |
| "ChromeOS.AudioSelection.Output.SystemSwitchAudio.AudioDeviceCount." |
| "NonChromeRestarts"; |
| static constexpr char |
| kSystemNotSwitchOutputAudioDeviceCountNonChromeRestarts[] = |
| "ChromeOS.AudioSelection.Output.SystemNotSwitchAudio." |
| "AudioDeviceCount.NonChromeRestarts"; |
| |
| // A series of histogram metrics to record the audio device types when the |
| // system selection decision is made after audio device has changed, separated |
| // by chrome restarts or not. |
| static constexpr char kSystemSwitchInputAudioDeviceSetChromeRestarts[] = |
| "ChromeOS.AudioSelection.Input.SystemSwitchAudio.AudioDeviceSet." |
| "ChromeRestarts"; |
| static constexpr char kSystemNotSwitchInputAudioDeviceSetChromeRestarts[] = |
| "ChromeOS.AudioSelection.Input.SystemNotSwitchAudio.AudioDeviceSet." |
| "ChromeRestarts"; |
| static constexpr char kSystemSwitchOutputAudioDeviceSetChromeRestarts[] = |
| "ChromeOS.AudioSelection.Output.SystemSwitchAudio.AudioDeviceSet." |
| "ChromeRestarts"; |
| static constexpr char kSystemNotSwitchOutputAudioDeviceSetChromeRestarts[] = |
| "ChromeOS.AudioSelection.Output.SystemNotSwitchAudio.AudioDeviceSet." |
| "ChromeRestarts"; |
| static constexpr char kSystemSwitchInputAudioDeviceSetNonChromeRestarts[] = |
| "ChromeOS.AudioSelection.Input.SystemSwitchAudio.AudioDeviceSet." |
| "NonChromeRestarts"; |
| static constexpr char kSystemNotSwitchInputAudioDeviceSetNonChromeRestarts[] = |
| "ChromeOS.AudioSelection.Input.SystemNotSwitchAudio.AudioDeviceSet." |
| "NonChromeRestarts"; |
| static constexpr char kSystemSwitchOutputAudioDeviceSetNonChromeRestarts[] = |
| "ChromeOS.AudioSelection.Output.SystemSwitchAudio.AudioDeviceSet." |
| "NonChromeRestarts"; |
| static constexpr char |
| kSystemNotSwitchOutputAudioDeviceSetNonChromeRestarts[] = |
| "ChromeOS.AudioSelection.Output.SystemNotSwitchAudio.AudioDeviceSet." |
| "NonChromeRestarts"; |
| |
| // A series of histogram metrics to record the before and after condition |
| // of audio device types when the system selection decision is made after |
| // audio device has changed, separated |
| // by chrome restarts or not. |
| static constexpr char |
| kSystemSwitchInputBeforeAndAfterAudioDeviceSetChromeRestarts[] = |
| "ChromeOS.AudioSelection.Input.SystemSwitchAudio." |
| "BeforeAndAfterAudioDeviceSet.ChromeRestarts"; |
| static constexpr char |
| kSystemNotSwitchInputBeforeAndAfterAudioDeviceSetChromeRestarts[] = |
| "ChromeOS.AudioSelection.Input.SystemNotSwitchAudio." |
| "BeforeAndAfterAudioDeviceSet.ChromeRestarts"; |
| static constexpr char |
| kSystemSwitchOutputBeforeAndAfterAudioDeviceSetChromeRestarts[] = |
| "ChromeOS.AudioSelection.Output.SystemSwitchAudio." |
| "BeforeAndAfterAudioDeviceSet.ChromeRestarts"; |
| static constexpr char |
| kSystemNotSwitchOutputBeforeAndAfterAudioDeviceSetChromeRestarts[] = |
| "ChromeOS.AudioSelection.Output.SystemNotSwitchAudio." |
| "BeforeAndAfterAudioDeviceSet.ChromeRestarts"; |
| static constexpr char |
| kSystemSwitchInputBeforeAndAfterAudioDeviceSetNonChromeRestarts[] = |
| "ChromeOS.AudioSelection.Input.SystemSwitchAudio." |
| "BeforeAndAfterAudioDeviceSet.NonChromeRestarts"; |
| static constexpr char |
| kSystemNotSwitchInputBeforeAndAfterAudioDeviceSetNonChromeRestarts[] = |
| "ChromeOS.AudioSelection.Input.SystemNotSwitchAudio." |
| "BeforeAndAfterAudioDeviceSet.NonChromeRestarts"; |
| static constexpr char |
| kSystemSwitchOutputBeforeAndAfterAudioDeviceSetNonChromeRestarts[] = |
| "ChromeOS.AudioSelection.Output.SystemSwitchAudio." |
| "BeforeAndAfterAudioDeviceSet.NonChromeRestarts"; |
| static constexpr char |
| kSystemNotSwitchOutputBeforeAndAfterAudioDeviceSetNonChromeRestarts[] = |
| "ChromeOS.AudioSelection.Output.SystemNotSwitchAudio." |
| "BeforeAndAfterAudioDeviceSet.NonChromeRestarts"; |
| |
| // A series of histogram metrics to record consecutive devices change event |
| // time elapsed. |
| static constexpr char kConsecutiveInputDevicsChanged[] = |
| "ChromeOS.AudioSelection.Input.ConsecutiveDevicesChangeTimeElapsed.Any"; |
| static constexpr char kConsecutiveOutputDevicsChanged[] = |
| "ChromeOS.AudioSelection.Output.ConsecutiveDevicesChangeTimeElapsed.Any"; |
| static constexpr char kConsecutiveInputDevicsAdded[] = |
| "ChromeOS.AudioSelection.Input.ConsecutiveDevicesChangeTimeElapsed.Add"; |
| static constexpr char kConsecutiveOutputDevicsAdded[] = |
| "ChromeOS.AudioSelection.Output.ConsecutiveDevicesChangeTimeElapsed.Add"; |
| |
| // A histogram metric to record how often the four exception rules are met. |
| // Those rules are detailed in enum AudioSelectionExceptionRules and |
| // go/audio-io. |
| static constexpr char kAudioSelectionExceptionRuleMetrics[] = |
| "ChromeOS.AudioSelection.ExceptionRulesMet"; |
| |
| // A histogram metric to record when audio selection notification events |
| // happen. Audio selection notification events are detailed in |
| // AudioSelectionNotificationEvents. |
| static constexpr char kAudioSelectionNotification[] = |
| "ChromeOS.AudioSelection.Notification"; |
| |
| // A series of audio selection events used to record the audio selection |
| // performance. Note that these values are persisted to histograms so existing |
| // values should remain unchanged and new values should be added to the end. |
| enum class AudioSelectionEvents { |
| // The system switched the input device. |
| kSystemSwitchInput = 0, |
| // The system switched the output device. |
| kSystemSwitchOutput = 1, |
| // The system did not switch the input device. |
| kSystemNotSwitchInput = 2, |
| // The system did not switch the output device. |
| kSystemNotSwitchOutput = 3, |
| // User overrode the system decision to switch input device. |
| kUserOverrideSystemSwitchInput = 4, |
| // User overrode the system decision to switch output device. |
| kUserOverrideSystemSwitchOutput = 5, |
| // User overrode the system decision to not switch input device. |
| kUserOverrideSystemNotSwitchInput = 6, |
| // User overrode the system decision to not switch output device. |
| kUserOverrideSystemNotSwitchOutput = 7, |
| // The system switched the input device (for the first time after the system |
| // booted or chrome restarted). |
| kSystemSwitchInputChromeRestart = 8, |
| // The system switched the output device (for the first time after the |
| // system booted or chrome restarted). |
| kSystemSwitchOutputChromeRestart = 9, |
| // The system did not switch the input device (for the first time after the |
| // system booted or chrome restarted). |
| kSystemNotSwitchInputChromeRestart = 10, |
| // The system did not switch the output device (for the first time after the |
| // system booted or chrome restarted). |
| kSystemNotSwitchOutputChromeRestart = 11, |
| // User overrode the system decision to switch input device (for the first |
| // time after the system booted or chrome restarted). |
| kUserOverrideSystemSwitchInputChromeRestart = 12, |
| // User overrode the system decision to switch output device (for the first |
| // time after the system booted or chrome restarted). |
| kUserOverrideSystemSwitchOutputChromeRestart = 13, |
| // User overrode the system decision to not switch input device (for the |
| // first time after the system booted or chrome restarted). |
| kUserOverrideSystemNotSwitchInputChromeRestart = 14, |
| // User overrode the system decision to not switch output device (for the |
| // first time after the system booted or chrome restarted). |
| kUserOverrideSystemNotSwitchOutputChromeRestart = 15, |
| // The system switched the input device (for hot plug/unplug cases). |
| kSystemSwitchInputNonChromeRestart = 16, |
| // The system switched the output device (for hot plug/unplug cases). |
| kSystemSwitchOutputNonChromeRestart = 17, |
| // The system did not switch the input device (for hot plug/unplug cases). |
| kSystemNotSwitchInputNonChromeRestart = 18, |
| // The system did not switch the output device (for hot plug/unplug cases). |
| kSystemNotSwitchOutputNonChromeRestart = 19, |
| // User overrode the system decision to switch input device (for hot |
| // plug/unplug cases). |
| kUserOverrideSystemSwitchInputNonChromeRestart = 20, |
| // User overrode the system decision to switch output device (for hot |
| // plug/unplug cases). |
| kUserOverrideSystemSwitchOutputNonChromeRestart = 21, |
| // User overrode the system decision to not switch input device (for hot |
| // plug/unplug cases). |
| kUserOverrideSystemNotSwitchInputNonChromeRestart = 22, |
| // User overrode the system decision to not switch output device (for hot |
| // plug/unplug cases). |
| kUserOverrideSystemNotSwitchOutputNonChromeRestart = 23, |
| kMaxValue = kUserOverrideSystemNotSwitchOutputNonChromeRestart, |
| }; |
| |
| // A series of audio selection exception rules, detailed in go/audio-io. |
| // Note that these values are persisted to histograms so existing |
| // values should remain unchanged and new values should be added to the end. |
| enum class AudioSelectionExceptionRules { |
| // Hot plugging privileged devices. |
| kInputRule1HotPlugPrivilegedDevice = 0, |
| kOutputRule1HotPlugPrivilegedDevice = 1, |
| // Unplugging a non active device keeps current active device unchanged. |
| kInputRule2UnplugNonActiveDevice = 2, |
| kOutputRule2UnplugNonActiveDevice = 3, |
| // Hot plugging an unpreferred device keeps current active device unchanged. |
| kInputRule3HotPlugUnpreferredDevice = 4, |
| kOutputRule3HotPlugUnpreferredDevice = 5, |
| // Unplugging a device causes remaining unseen set of devices. |
| kInputRule4UnplugDeviceCausesUnseenSet = 6, |
| kOutputRule4UnplugDeviceCausesUnseenSet = 7, |
| kMaxValue = kOutputRule4UnplugDeviceCausesUnseenSet, |
| }; |
| |
| // A series of audio selection notification events used to record the audio |
| // selection notification metrics. Note that these values are persisted to |
| // histograms so existing values should remain unchanged and new values should |
| // be added to the end. |
| enum class AudioSelectionNotificationEvents { |
| // Notification with single source both input and output devices shows up. |
| kNotificationWithBothInputAndOutputDevicesShowsUp = 0, |
| // Notification with single source only input device shows up. |
| kNotificationWithInputOnlyDeviceShowsUp = 1, |
| // Notification with single source only output device shows up. |
| kNotificationWithOutputOnlyDeviceShowsUp = 2, |
| // Notification with multiple sources shows up. |
| kNotificationWithMultipleSourcesDevicesShowsUp = 3, |
| // Notification with single source both input and output devices is clicked. |
| kNotificationWithBothInputAndOutputDevicesClicked = 4, |
| // Notification with single source only input device is clicked. |
| kNotificationWithInputOnlyDeviceClicked = 5, |
| // Notification with single source only output device is clicked. |
| kNotificationWithOutputOnlyDeviceClicked = 6, |
| // Notification with multiple sources is clicked. |
| kNotificationWithMultipleSourcesDevicesClicked = 7, |
| kMaxValue = kNotificationWithMultipleSourcesDevicesClicked, |
| }; |
| |
| // Record the histogram of system decision of switching or not switching after |
| // audio device is added or removed. Only record if there are more than one |
| // available devices. |
| void MaybeRecordSystemSwitchDecisionAndContext( |
| bool is_input, |
| bool has_alternative_device, |
| bool is_switched, |
| const AudioDeviceMap& audio_devices_, |
| const AudioDeviceMap& previous_audio_devices_); |
| |
| // Record metrics when user switches audio device. |
| void RecordUserSwitchAudioDevice(bool is_input); |
| |
| // Record system selection related metrics in the case of chrome restarts, |
| // including system boots and users sign out, as well as the case of normal |
| // user hotplug or unplug. |
| void RecordAudioSelectionMetricsSeparatedByChromeRestarts( |
| bool is_input, |
| bool is_switched, |
| bool is_chrome_restarts, |
| const AudioDeviceList& previous_device_list, |
| const AudioDeviceList& current_device_list) const; |
| |
| // Record user overrides system decision metrics in the case of chrome |
| // restarts, including system boots and users sign out, as well as the case of |
| // normal user hotplug or unplug. |
| void RecordUserOverrideMetricsSeparatedByChromeRestarts( |
| bool is_input, |
| bool is_switched, |
| bool is_chrome_restarts, |
| int time_delta_since_system_decision) const; |
| |
| // Record the time elaspsed between two consecutive devices change event, |
| // including devices added/removed and devices changed. |
| void RecordConsecutiveAudioDevicsChangeTimeElapsed(bool is_input, |
| bool is_device_added); |
| |
| // Records when audio selection exception rules are met. |
| void RecordExceptionRulesMet(AudioSelectionExceptionRules rule); |
| |
| // Records when audio selection notification events happen. |
| void RecordNotificationEvents( |
| AudioSelectionNotificationEvents notification_event); |
| |
| void set_is_chrome_restarts(bool is_chrome_restarts) { |
| is_chrome_restarts_ = is_chrome_restarts; |
| } |
| |
| void set_input_device_selected_by_user(bool input_device_selected_by_user) { |
| input_device_selected_by_user_ = input_device_selected_by_user; |
| } |
| |
| void set_output_device_selected_by_user(bool output_device_selected_by_user) { |
| output_device_selected_by_user_ = output_device_selected_by_user; |
| } |
| |
| private: |
| // A helper function to record user overrides system decision metrics and |
| // directly calls uma histogram function. |
| void RecordUserOverrideMetricsHelper( |
| std::string_view histogram_name, |
| AudioSelectionEvents audio_selection_event, |
| int time_delta_since_system_decision) const; |
| |
| // Clear the timer of system switch/not switch decision. |
| void ResetSystemSwitchTimestamp(bool is_input); |
| |
| // Maybe record the histogram metrics of user overriding system decision of |
| // switching or not switching audio device. Do not record if user doesn't |
| // override system decision but override previous user action. |
| void MaybeRecordUserOverrideSystemDecision( |
| bool is_input, |
| bool is_system_decision_at_chrome_restarts, |
| std::optional<base::TimeTicks>& switched_by_system_at, |
| std::optional<base::TimeTicks>& not_switched_by_system_at); |
| |
| // The timestamp for recording the metrics of user overriding system decision |
| // of switching or not switching the active audio device. |
| std::optional<base::TimeTicks> input_switched_by_system_at_ = std::nullopt; |
| std::optional<base::TimeTicks> input_not_switched_by_system_at_ = |
| std::nullopt; |
| std::optional<base::TimeTicks> output_switched_by_system_at_ = std::nullopt; |
| std::optional<base::TimeTicks> output_not_switched_by_system_at_ = |
| std::nullopt; |
| |
| // The device set bits calculated by EncodeBeforeAndAfterAudioDeviceSets |
| // function to record the audio devices types when users override the system |
| // decision. |
| uint32_t before_and_after_input_device_set_bits_ = 0; |
| uint32_t before_and_after_output_device_set_bits_ = 0; |
| |
| // The timestamp when devices have changed, including devices added/removed |
| // and devices changed. Used for recording the time elaspsed between two |
| // consecutive devices change event. |
| std::optional<base::TimeTicks> input_devices_changed_at_ = std::nullopt; |
| std::optional<base::TimeTicks> output_devices_changed_at_ = std::nullopt; |
| std::optional<base::TimeTicks> input_devices_added_at_ = std::nullopt; |
| std::optional<base::TimeTicks> output_devices_added_at_ = std::nullopt; |
| |
| // Whether the audio device was selected by user, to track user overrides |
| bool input_device_selected_by_user_ = false; |
| bool output_device_selected_by_user_ = false; |
| |
| // A boolean flag used to tell if system audio selection happens for the first |
| // time when system boots or chrome restarts. |
| bool is_chrome_restarts_ = true; |
| |
| // A boolean indicating if the system makes the switch or not switch decision |
| // in the case of chrome restarts. Used for recording user override histogram |
| // metrics. |
| bool is_system_decision_at_chrome_restarts_ = true; |
| }; |
| |
| } // namespace ash |
| |
| #endif // CHROMEOS_ASH_COMPONENTS_AUDIO_AUDIO_DEVICE_METRICS_HANDLER_H_ |