| // Copyright 2018 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "ash/media/media_controller_impl.h" |
| |
| #include <memory> |
| |
| #include "ash/public/cpp/ash_features.h" |
| #include "ash/public/cpp/ash_pref_names.h" |
| #include "ash/session/session_controller_impl.h" |
| #include "ash/shell.h" |
| #include "ash/test/ash_test_base.h" |
| #include "base/macros.h" |
| #include "base/test/scoped_feature_list.h" |
| #include "components/prefs/testing_pref_service.h" |
| #include "services/media_session/public/cpp/test/test_media_controller.h" |
| |
| namespace ash { |
| |
| class MediaControllerTest : public AshTestBase { |
| public: |
| MediaControllerTest() = default; |
| ~MediaControllerTest() override = default; |
| |
| // AshTestBase |
| void SetUp() override { |
| AshTestBase::SetUp(); |
| |
| controller_ = std::make_unique<media_session::test::TestMediaController>(); |
| |
| MediaControllerImpl* media_controller = Shell::Get()->media_controller(); |
| media_controller->SetMediaSessionControllerForTest( |
| controller_->CreateMediaControllerPtr()); |
| media_controller->FlushForTesting(); |
| |
| { |
| std::vector<media_session::mojom::MediaSessionAction> actions; |
| actions.push_back(media_session::mojom::MediaSessionAction::kPlay); |
| controller_->SimulateMediaSessionActionsChanged(actions); |
| } |
| |
| { |
| media_session::mojom::MediaSessionInfoPtr session_info( |
| media_session::mojom::MediaSessionInfo::New()); |
| |
| session_info->state = |
| media_session::mojom::MediaSessionInfo::SessionState::kActive; |
| session_info->playback_state = |
| media_session::mojom::MediaPlaybackState::kPlaying; |
| controller_->SimulateMediaSessionInfoChanged(std::move(session_info)); |
| } |
| |
| Flush(); |
| } |
| |
| media_session::test::TestMediaController* controller() const { |
| return controller_.get(); |
| } |
| |
| void SimulateSessionLock() { |
| SessionInfo info; |
| info.state = session_manager::SessionState::LOCKED; |
| Shell::Get()->session_controller()->SetSessionInfo(info); |
| } |
| |
| void Flush() { |
| controller_->Flush(); |
| Shell::Get()->media_controller()->FlushForTesting(); |
| } |
| |
| void HandleMediaKeys() { |
| Shell::Get()->media_controller()->HandleMediaPlayPause(); |
| Flush(); |
| Shell::Get()->media_controller()->HandleMediaPrevTrack(); |
| Flush(); |
| Shell::Get()->media_controller()->HandleMediaNextTrack(); |
| Flush(); |
| } |
| |
| private: |
| std::unique_ptr<media_session::test::TestMediaController> controller_; |
| |
| DISALLOW_COPY_AND_ASSIGN(MediaControllerTest); |
| }; |
| |
| TEST_F(MediaControllerTest, EnableMediaKeysWhenUnlocked) { |
| EXPECT_EQ(0, controller()->suspend_count()); |
| EXPECT_EQ(0, controller()->previous_track_count()); |
| EXPECT_EQ(0, controller()->next_track_count()); |
| |
| HandleMediaKeys(); |
| |
| EXPECT_EQ(1, controller()->suspend_count()); |
| EXPECT_EQ(1, controller()->previous_track_count()); |
| EXPECT_EQ(1, controller()->next_track_count()); |
| } |
| |
| TEST_F(MediaControllerTest, EnableLockScreenMediaKeys) { |
| base::test::ScopedFeatureList feature_list; |
| feature_list.InitAndEnableFeature(features::kLockScreenMediaKeys); |
| |
| PrefService* prefs = |
| Shell::Get()->session_controller()->GetLastActiveUserPrefService(); |
| prefs->SetBoolean(prefs::kLockScreenMediaKeysEnabled, true); |
| |
| EXPECT_TRUE( |
| Shell::Get()->media_controller()->AreLockScreenMediaKeysEnabled()); |
| } |
| |
| TEST_F(MediaControllerTest, DisableLockScreenMediaKeysIfFeatureDisabled) { |
| base::test::ScopedFeatureList feature_list; |
| feature_list.InitAndDisableFeature(features::kLockScreenMediaKeys); |
| |
| PrefService* prefs = |
| Shell::Get()->session_controller()->GetPrimaryUserPrefService(); |
| prefs->SetBoolean(prefs::kLockScreenMediaKeysEnabled, true); |
| |
| EXPECT_FALSE( |
| Shell::Get()->media_controller()->AreLockScreenMediaKeysEnabled()); |
| |
| prefs->SetBoolean(prefs::kLockScreenMediaKeysEnabled, false); |
| |
| EXPECT_FALSE( |
| Shell::Get()->media_controller()->AreLockScreenMediaKeysEnabled()); |
| } |
| |
| TEST_F(MediaControllerTest, DisableLockScreenMediaKeysIfPreferenceDisabled) { |
| base::test::ScopedFeatureList feature_list; |
| feature_list.InitAndEnableFeature(features::kLockScreenMediaKeys); |
| |
| PrefService* prefs = |
| Shell::Get()->session_controller()->GetPrimaryUserPrefService(); |
| prefs->SetBoolean(prefs::kLockScreenMediaKeysEnabled, false); |
| |
| EXPECT_FALSE( |
| Shell::Get()->media_controller()->AreLockScreenMediaKeysEnabled()); |
| } |
| |
| TEST_F(MediaControllerTest, EnableMediaKeysWhenLockedAndKeysEnabled) { |
| base::test::ScopedFeatureList feature_list; |
| feature_list.InitAndEnableFeature(features::kLockScreenMediaKeys); |
| |
| PrefService* prefs = |
| Shell::Get()->session_controller()->GetPrimaryUserPrefService(); |
| prefs->SetBoolean(prefs::kLockScreenMediaKeysEnabled, true); |
| |
| EXPECT_EQ(0, controller()->suspend_count()); |
| EXPECT_EQ(0, controller()->previous_track_count()); |
| EXPECT_EQ(0, controller()->next_track_count()); |
| |
| SimulateSessionLock(); |
| |
| HandleMediaKeys(); |
| |
| EXPECT_EQ(1, controller()->suspend_count()); |
| EXPECT_EQ(1, controller()->previous_track_count()); |
| EXPECT_EQ(1, controller()->next_track_count()); |
| } |
| |
| TEST_F(MediaControllerTest, DisableMediaKeysWhenLockedAndKeysDisabled) { |
| PrefService* prefs = |
| Shell::Get()->session_controller()->GetPrimaryUserPrefService(); |
| prefs->SetBoolean(prefs::kLockScreenMediaKeysEnabled, false); |
| |
| EXPECT_EQ(0, controller()->suspend_count()); |
| EXPECT_EQ(0, controller()->previous_track_count()); |
| EXPECT_EQ(0, controller()->next_track_count()); |
| |
| SimulateSessionLock(); |
| |
| HandleMediaKeys(); |
| |
| EXPECT_EQ(0, controller()->suspend_count()); |
| EXPECT_EQ(0, controller()->previous_track_count()); |
| EXPECT_EQ(0, controller()->next_track_count()); |
| } |
| |
| } // namespace ash |