focus-mode: Add Ash.FocusMode.SessionStartedWithSounds
This CL will add the histogram to check if there is a media playing when we start a new focus session. Bug: b/348032289 Test: unittest Change-Id: I44b621886f8875156f9cafa7463caaaf45ee6c2b Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/5649939 Reviewed-by: Xiyuan Xia <xiyuan@chromium.org> Reviewed-by: Michele Fan <michelefan@chromium.org> Commit-Queue: Hongyu Long <hongyulong@chromium.org> Reviewed-by: Sean Kau <skau@chromium.org> Cr-Commit-Position: refs/heads/main@{#1327728}
This commit is contained in:

committed by
Chromium LUCI CQ

parent
888313c597
commit
cb52777891
ash
media
system
tools/metrics/histograms/metadata/ash
@@ -55,6 +55,10 @@ class ASH_EXPORT MediaControllerImpl
|
|||||||
|
|
||||||
static void RegisterProfilePrefs(PrefRegistrySimple* registry);
|
static void RegisterProfilePrefs(PrefRegistrySimple* registry);
|
||||||
|
|
||||||
|
media_session::mojom::MediaSessionInfoPtr GetMediaSessionInfo() const {
|
||||||
|
return media_session_info_ ? media_session_info_->Clone() : nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
// Determine if lock screen media keys are enabled.
|
// Determine if lock screen media keys are enabled.
|
||||||
bool AreLockScreenMediaKeysEnabled() const;
|
bool AreLockScreenMediaKeysEnabled() const;
|
||||||
void SetMediaControlsDismissed(bool media_controls_dismissed);
|
void SetMediaControlsDismissed(bool media_controls_dismissed);
|
||||||
|
@@ -10,6 +10,7 @@
|
|||||||
#include "ash/api/tasks/tasks_types.h"
|
#include "ash/api/tasks/tasks_types.h"
|
||||||
#include "ash/constants/ash_pref_names.h"
|
#include "ash/constants/ash_pref_names.h"
|
||||||
#include "ash/constants/url_constants.h"
|
#include "ash/constants/url_constants.h"
|
||||||
|
#include "ash/media/media_controller_impl.h"
|
||||||
#include "ash/public/cpp/ash_web_view_factory.h"
|
#include "ash/public/cpp/ash_web_view_factory.h"
|
||||||
#include "ash/public/cpp/shell_window_ids.h"
|
#include "ash/public/cpp/shell_window_ids.h"
|
||||||
#include "ash/public/cpp/system/anchored_nudge_data.h"
|
#include "ash/public/cpp/system/anchored_nudge_data.h"
|
||||||
@@ -509,6 +510,15 @@ void FocusModeController::RequestTasksUpdateForTesting() {
|
|||||||
tasks_model_.RequestUpdate();
|
tasks_model_.RequestUpdate();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
media_session::mojom::MediaSessionInfoPtr
|
||||||
|
FocusModeController::GetSystemMediaSessionInfo() {
|
||||||
|
if (test_media_session_info_) {
|
||||||
|
CHECK_IS_TEST();
|
||||||
|
return std::move(test_media_session_info_);
|
||||||
|
}
|
||||||
|
return Shell::Get()->media_controller()->GetMediaSessionInfo();
|
||||||
|
}
|
||||||
|
|
||||||
void FocusModeController::StartFocusSession(
|
void FocusModeController::StartFocusSession(
|
||||||
focus_mode_histogram_names::ToggleSource source) {
|
focus_mode_histogram_names::ToggleSource source) {
|
||||||
focus_mode_metrics_recorder_ =
|
focus_mode_metrics_recorder_ =
|
||||||
|
@@ -205,6 +205,12 @@ class ASH_EXPORT FocusModeController
|
|||||||
|
|
||||||
void RequestTasksUpdateForTesting();
|
void RequestTasksUpdateForTesting();
|
||||||
|
|
||||||
|
media_session::mojom::MediaSessionInfoPtr GetSystemMediaSessionInfo();
|
||||||
|
void SetSystemMediaSessionInfoForTesting(
|
||||||
|
media_session::mojom::MediaSessionInfoPtr media_session_info) {
|
||||||
|
test_media_session_info_ = std::move(media_session_info);
|
||||||
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// Starts a focus session by updating UI elements, starting `timer_`, and
|
// Starts a focus session by updating UI elements, starting `timer_`, and
|
||||||
// setting `current_session_` to the desired session duration and end time.
|
// setting `current_session_` to the desired session duration and end time.
|
||||||
@@ -285,6 +291,10 @@ class ASH_EXPORT FocusModeController
|
|||||||
std::unique_ptr<views::Widget> media_widget_;
|
std::unique_ptr<views::Widget> media_widget_;
|
||||||
raw_ptr<AshWebView> focus_mode_media_view_ = nullptr;
|
raw_ptr<AshWebView> focus_mode_media_view_ = nullptr;
|
||||||
|
|
||||||
|
// The info about the current media session for testing. It will be null if
|
||||||
|
// there isn't a current media session.
|
||||||
|
media_session::mojom::MediaSessionInfoPtr test_media_session_info_;
|
||||||
|
|
||||||
std::unique_ptr<FocusModeDelegate> delegate_;
|
std::unique_ptr<FocusModeDelegate> delegate_;
|
||||||
|
|
||||||
base::ScopedObservation<FocusModeTasksModel, FocusModeController>
|
base::ScopedObservation<FocusModeTasksModel, FocusModeController>
|
||||||
|
@@ -50,6 +50,22 @@ AnchoredNudge* GetShownEndingMomentNudge() {
|
|||||||
focus_mode_util::kFocusModeEndingMomentNudgeId);
|
focus_mode_util::kFocusModeEndingMomentNudgeId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Simulate a system media with the state of playing or paused based on
|
||||||
|
// `is_playing`.
|
||||||
|
void SimulatePlaybackState(bool is_playing) {
|
||||||
|
media_session::mojom::MediaSessionInfoPtr session_info(
|
||||||
|
media_session::mojom::MediaSessionInfo::New());
|
||||||
|
|
||||||
|
session_info->state =
|
||||||
|
media_session::mojom::MediaSessionInfo::SessionState::kActive;
|
||||||
|
session_info->playback_state =
|
||||||
|
is_playing ? media_session::mojom::MediaPlaybackState::kPlaying
|
||||||
|
: media_session::mojom::MediaPlaybackState::kPaused;
|
||||||
|
|
||||||
|
FocusModeController::Get()->SetSystemMediaSessionInfoForTesting(
|
||||||
|
std::move(session_info));
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
class FocusModeControllerMultiUserTest : public NoSessionAshTestBase {
|
class FocusModeControllerMultiUserTest : public NoSessionAshTestBase {
|
||||||
@@ -934,4 +950,45 @@ TEST_F(FocusModeControllerMultiUserTest, CheckStartedWithTaskHistogram) {
|
|||||||
/*expected_count=*/1);
|
/*expected_count=*/1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Tests that when starting a focus session, it records if there is an existing
|
||||||
|
// media playing.
|
||||||
|
TEST_F(FocusModeControllerMultiUserTest, CheckMediaPlayingOnStartsHistogram) {
|
||||||
|
base::HistogramTester histogram_tester;
|
||||||
|
|
||||||
|
// 1. Start a focus session without a system media.
|
||||||
|
auto* controller = FocusModeController::Get();
|
||||||
|
controller->ToggleFocusMode();
|
||||||
|
EXPECT_TRUE(controller->in_focus_session());
|
||||||
|
histogram_tester.ExpectBucketCount(
|
||||||
|
/*name=*/focus_mode_histogram_names::
|
||||||
|
kStartedWithExistingMediaPlayingHistogramName,
|
||||||
|
/*sample=*/false, /*expected_count=*/1);
|
||||||
|
|
||||||
|
// End the focus session.
|
||||||
|
controller->ToggleFocusMode();
|
||||||
|
EXPECT_FALSE(controller->in_focus_session());
|
||||||
|
|
||||||
|
// 2. Start a focus session with a system media playing.
|
||||||
|
SimulatePlaybackState(/*is_playing=*/true);
|
||||||
|
controller->ToggleFocusMode();
|
||||||
|
EXPECT_TRUE(controller->in_focus_session());
|
||||||
|
histogram_tester.ExpectBucketCount(
|
||||||
|
/*name=*/focus_mode_histogram_names::
|
||||||
|
kStartedWithExistingMediaPlayingHistogramName,
|
||||||
|
/*sample=*/true, /*expected_count=*/1);
|
||||||
|
|
||||||
|
// End the focus session.
|
||||||
|
controller->ToggleFocusMode();
|
||||||
|
EXPECT_FALSE(controller->in_focus_session());
|
||||||
|
|
||||||
|
// 3. Start a focus session with a system media paused.
|
||||||
|
SimulatePlaybackState(/*is_playing=*/false);
|
||||||
|
controller->ToggleFocusMode();
|
||||||
|
EXPECT_TRUE(controller->in_focus_session());
|
||||||
|
histogram_tester.ExpectBucketCount(
|
||||||
|
/*name=*/focus_mode_histogram_names::
|
||||||
|
kStartedWithExistingMediaPlayingHistogramName,
|
||||||
|
/*sample=*/false, /*expected_count=*/2);
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace ash
|
} // namespace ash
|
||||||
|
@@ -20,6 +20,8 @@ constexpr char kStartSessionSourceHistogramName[] =
|
|||||||
"Ash.FocusMode.StartSession.ToggleSource";
|
"Ash.FocusMode.StartSession.ToggleSource";
|
||||||
constexpr char kStartedWithTaskStatekHistogramName[] =
|
constexpr char kStartedWithTaskStatekHistogramName[] =
|
||||||
"Ash.FocusMode.StartSession.TaskState";
|
"Ash.FocusMode.StartSession.TaskState";
|
||||||
|
constexpr char kStartedWithExistingMediaPlayingHistogramName[] =
|
||||||
|
"Ash.FocusMode.StartSession.ExistingMediaPlaying";
|
||||||
|
|
||||||
// Histograms recorded during a session.
|
// Histograms recorded during a session.
|
||||||
constexpr char kToggleEndButtonDuringSessionHistogramName[] =
|
constexpr char kToggleEndButtonDuringSessionHistogramName[] =
|
||||||
|
@@ -212,6 +212,17 @@ void RecordSoundsPlayedDuringSessionHistogram(bool has_selected_soundscapes,
|
|||||||
/*sample=*/type);
|
/*sample=*/type);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void RecordExistingMediaPlayingOnStartHistogram() {
|
||||||
|
const auto system_media_session_info =
|
||||||
|
FocusModeController::Get()->GetSystemMediaSessionInfo();
|
||||||
|
base::UmaHistogramBoolean(
|
||||||
|
/*name=*/focus_mode_histogram_names::
|
||||||
|
kStartedWithExistingMediaPlayingHistogramName,
|
||||||
|
/*sample=*/system_media_session_info &&
|
||||||
|
system_media_session_info->playback_state ==
|
||||||
|
media_session::mojom::MediaPlaybackState::kPlaying);
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
FocusModeMetricsRecorder::FocusModeMetricsRecorder(
|
FocusModeMetricsRecorder::FocusModeMetricsRecorder(
|
||||||
@@ -269,8 +280,10 @@ void FocusModeMetricsRecorder::RecordHistogramsOnStart(
|
|||||||
RecordInitialDurationHistogram(
|
RecordInitialDurationHistogram(
|
||||||
/*session_duration=*/initial_session_duration_);
|
/*session_duration=*/initial_session_duration_);
|
||||||
RecordStartSessionSourceHistogram(source);
|
RecordStartSessionSourceHistogram(source);
|
||||||
|
// TODO(b/344594740): Remove `RecordHasSelectedTaskOnSessionStartHistogram()`.
|
||||||
RecordHasSelectedTaskOnSessionStartHistogram();
|
RecordHasSelectedTaskOnSessionStartHistogram();
|
||||||
RecordStartedWithTaskHistogram(selected_task_id);
|
RecordStartedWithTaskHistogram(selected_task_id);
|
||||||
|
RecordExistingMediaPlayingOnStartHistogram();
|
||||||
}
|
}
|
||||||
|
|
||||||
void FocusModeMetricsRecorder::RecordHistogramsOnEnd() {
|
void FocusModeMetricsRecorder::RecordHistogramsOnEnd() {
|
||||||
|
@@ -3845,6 +3845,18 @@ chromium-metrics-reviews@google.com.
|
|||||||
</summary>
|
</summary>
|
||||||
</histogram>
|
</histogram>
|
||||||
|
|
||||||
|
<histogram name="Ash.FocusMode.StartSession.ExistingMediaPlaying"
|
||||||
|
enum="Boolean" expires_after="2025-07-01">
|
||||||
|
<owner>hongyulong@chromium.org</owner>
|
||||||
|
<owner>richui@chromium.org</owner>
|
||||||
|
<owner>skau@chromium.org</owner>
|
||||||
|
<owner>chromeos-wms@google.com</owner>
|
||||||
|
<summary>
|
||||||
|
Emits true when an existing media session is playing on the system on
|
||||||
|
session start; otherwise, emits false.
|
||||||
|
</summary>
|
||||||
|
</histogram>
|
||||||
|
|
||||||
<histogram name="Ash.FocusMode.StartSession.HasSelectedTask" enum="Boolean"
|
<histogram name="Ash.FocusMode.StartSession.HasSelectedTask" enum="Boolean"
|
||||||
expires_after="2025-02-01">
|
expires_after="2025-02-01">
|
||||||
<owner>hongyulong@chromium.org</owner>
|
<owner>hongyulong@chromium.org</owner>
|
||||||
|
Reference in New Issue
Block a user