diff --git a/apps/theming/lib/Service/ThemesService.php b/apps/theming/lib/Service/ThemesService.php index d6e14b6ffcb0f..653b895be2c9f 100644 --- a/apps/theming/lib/Service/ThemesService.php +++ b/apps/theming/lib/Service/ThemesService.php @@ -16,24 +16,22 @@ use OCP\IConfig; use OCP\IUser; use OCP\IUserSession; +use Psr\Log\LoggerInterface; class ThemesService { - private IUserSession $userSession; - private IConfig $config; - /** @var ITheme[] */ private array $themesProviders; - public function __construct(IUserSession $userSession, - IConfig $config, - DefaultTheme $defaultTheme, + public function __construct( + private IUserSession $userSession, + private IConfig $config, + private LoggerInterface $logger, + private DefaultTheme $defaultTheme, LightTheme $lightTheme, DarkTheme $darkTheme, HighContrastTheme $highContrastTheme, DarkHighContrastTheme $darkHighContrastTheme, DyslexiaFont $dyslexiaFont) { - $this->userSession = $userSession; - $this->config = $config; // Register themes $this->themesProviders = [ @@ -52,6 +50,22 @@ public function __construct(IUserSession $userSession, * @return ITheme[] */ public function getThemes(): array { + // Enforced theme if configured + $enforcedTheme = $this->config->getSystemValueString('enforce_theme', ''); + if ($enforcedTheme !== '') { + if (!isset($this->themesProviders[$enforcedTheme])) { + $this->logger->error('Enforced theme not found', ['theme' => $enforcedTheme]); + return $this->themesProviders; + } + + $defaultTheme = $this->themesProviders[$this->defaultTheme->getId()]; + $theme = $this->themesProviders[$enforcedTheme]; + return [ + $defaultTheme->getId() => $defaultTheme, + $theme->getId() => $theme, + ]; + } + return $this->themesProviders; } diff --git a/apps/theming/tests/Service/ThemesServiceTest.php b/apps/theming/tests/Service/ThemesServiceTest.php index 29bc026820a4e..a670ab3a58378 100644 --- a/apps/theming/tests/Service/ThemesServiceTest.php +++ b/apps/theming/tests/Service/ThemesServiceTest.php @@ -24,6 +24,7 @@ use OCP\IUser; use OCP\IUserSession; use PHPUnit\Framework\MockObject\MockObject; +use Psr\Log\LoggerInterface; use Test\TestCase; class ThemesServiceTest extends TestCase { @@ -34,6 +35,9 @@ class ThemesServiceTest extends TestCase { private $userSession; /** @var IConfig|MockObject */ private $config; + /** @var LoggerInterface|MockObject */ + private $logger; + /** @var ThemingDefaults|MockObject */ private $themingDefaults; @@ -43,6 +47,7 @@ class ThemesServiceTest extends TestCase { protected function setUp(): void { $this->userSession = $this->createMock(IUserSession::class); $this->config = $this->createMock(IConfig::class); + $this->logger = $this->createMock(LoggerInterface::class); $this->themingDefaults = $this->createMock(ThemingDefaults::class); $this->themingDefaults->expects($this->any()) @@ -58,6 +63,7 @@ protected function setUp(): void { $this->themesService = new ThemesService( $this->userSession, $this->config, + $this->logger, ...array_values($this->themes) ); @@ -76,6 +82,42 @@ public function testGetThemes() { $this->assertEquals($expected, array_keys($this->themesService->getThemes())); } + public function testGetThemesEnforced() { + $this->config->expects($this->once()) + ->method('getSystemValueString') + ->with('enforce_theme', '') + ->willReturn('dark'); + $this->logger->expects($this->never()) + ->method('error'); + + $expected = [ + 'default', + 'dark', + ]; + + $this->assertEquals($expected, array_keys($this->themesService->getThemes())); + } + + public function testGetThemesEnforcedInvalid() { + $this->config->expects($this->once()) + ->method('getSystemValueString') + ->with('enforce_theme', '') + ->willReturn('invalid'); + $this->logger->expects($this->once()) + ->method('error') + ->with('Enforced theme not found', ['theme' => 'invalid']); + + $expected = [ + 'default', + 'light', + 'dark', + 'light-highcontrast', + 'dark-highcontrast', + 'opendyslexic', + ]; + + $this->assertEquals($expected, array_keys($this->themesService->getThemes())); + } public function dataTestEnableTheme() { return [