0

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:
Hongyu Long
2024-07-15 19:44:33 +00:00
committed by Chromium LUCI CQ
parent 888313c597
commit cb52777891
7 changed files with 108 additions and 0 deletions

@ -55,6 +55,10 @@ class ASH_EXPORT MediaControllerImpl
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.
bool AreLockScreenMediaKeysEnabled() const;
void SetMediaControlsDismissed(bool media_controls_dismissed);

@ -10,6 +10,7 @@
#include "ash/api/tasks/tasks_types.h"
#include "ash/constants/ash_pref_names.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/shell_window_ids.h"
#include "ash/public/cpp/system/anchored_nudge_data.h"
@ -509,6 +510,15 @@ void FocusModeController::RequestTasksUpdateForTesting() {
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(
focus_mode_histogram_names::ToggleSource source) {
focus_mode_metrics_recorder_ =

@ -205,6 +205,12 @@ class ASH_EXPORT FocusModeController
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:
// Starts a focus session by updating UI elements, starting `timer_`, and
// 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_;
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_;
base::ScopedObservation<FocusModeTasksModel, FocusModeController>

@ -50,6 +50,22 @@ AnchoredNudge* GetShownEndingMomentNudge() {
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
class FocusModeControllerMultiUserTest : public NoSessionAshTestBase {
@ -934,4 +950,45 @@ TEST_F(FocusModeControllerMultiUserTest, CheckStartedWithTaskHistogram) {
/*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

@ -20,6 +20,8 @@ constexpr char kStartSessionSourceHistogramName[] =
"Ash.FocusMode.StartSession.ToggleSource";
constexpr char kStartedWithTaskStatekHistogramName[] =
"Ash.FocusMode.StartSession.TaskState";
constexpr char kStartedWithExistingMediaPlayingHistogramName[] =
"Ash.FocusMode.StartSession.ExistingMediaPlaying";
// Histograms recorded during a session.
constexpr char kToggleEndButtonDuringSessionHistogramName[] =

@ -212,6 +212,17 @@ void RecordSoundsPlayedDuringSessionHistogram(bool has_selected_soundscapes,
/*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
FocusModeMetricsRecorder::FocusModeMetricsRecorder(
@ -269,8 +280,10 @@ void FocusModeMetricsRecorder::RecordHistogramsOnStart(
RecordInitialDurationHistogram(
/*session_duration=*/initial_session_duration_);
RecordStartSessionSourceHistogram(source);
// TODO(b/344594740): Remove `RecordHasSelectedTaskOnSessionStartHistogram()`.
RecordHasSelectedTaskOnSessionStartHistogram();
RecordStartedWithTaskHistogram(selected_task_id);
RecordExistingMediaPlayingOnStartHistogram();
}
void FocusModeMetricsRecorder::RecordHistogramsOnEnd() {

@ -3845,6 +3845,18 @@ chromium-metrics-reviews@google.com.
</summary>
</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"
expires_after="2025-02-01">
<owner>hongyulong@chromium.org</owner>