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);
|
||||
|
||||
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>
|
||||
|
Reference in New Issue
Block a user