diff options
Diffstat (limited to 'apps/theming/lib/Service/ThemesService.php')
-rw-r--r-- | apps/theming/lib/Service/ThemesService.php | 120 |
1 files changed, 68 insertions, 52 deletions
diff --git a/apps/theming/lib/Service/ThemesService.php b/apps/theming/lib/Service/ThemesService.php index 01ebc3fb504..f49524cb62c 100644 --- a/apps/theming/lib/Service/ThemesService.php +++ b/apps/theming/lib/Service/ThemesService.php @@ -1,24 +1,8 @@ <?php + /** - * @copyright Copyright (c) 2022 John Molakvoæ <skjnldsv@protonmail.com> - * - * @author John Molakvoæ <skjnldsv@protonmail.com> - * - * @license GNU AGPL version 3 or any later version - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - * + * SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later */ namespace OCA\Theming\Service; @@ -29,49 +13,73 @@ use OCA\Theming\Themes\DarkTheme; use OCA\Theming\Themes\DefaultTheme; use OCA\Theming\Themes\DyslexiaFont; use OCA\Theming\Themes\HighContrastTheme; +use OCA\Theming\Themes\LightTheme; 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, - DarkTheme $darkTheme, - HighContrastTheme $highContrastTheme, - DarkHighContrastTheme $darkHighContrastTheme, - DyslexiaFont $dyslexiaFont) { - $this->userSession = $userSession; - $this->config = $config; + public function __construct( + private IUserSession $userSession, + private IConfig $config, + private LoggerInterface $logger, + private DefaultTheme $defaultTheme, + LightTheme $lightTheme, + private DarkTheme $darkTheme, + HighContrastTheme $highContrastTheme, + DarkHighContrastTheme $darkHighContrastTheme, + DyslexiaFont $dyslexiaFont, + ) { // Register themes $this->themesProviders = [ - $defaultTheme->getId() => $defaultTheme, - $darkTheme->getId() => $darkTheme, - $highContrastTheme->getId() => $highContrastTheme, - $darkHighContrastTheme->getId() => $darkHighContrastTheme, - $dyslexiaFont->getId() => $dyslexiaFont, + $defaultTheme->getId() => $defaultTheme, + $lightTheme->getId() => $lightTheme, + $darkTheme->getId() => $darkTheme, + $highContrastTheme->getId() => $highContrastTheme, + $darkHighContrastTheme->getId() => $darkHighContrastTheme, + $dyslexiaFont->getId() => $dyslexiaFont, ]; } /** * Get the list of all registered themes - * + * * @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()]; + $darkTheme = $this->themesProviders[$this->darkTheme->getId()]; + $theme = $this->themesProviders[$enforcedTheme]; + return [ + // Leave the default theme as a fallback + $defaultTheme->getId() => $defaultTheme, + // Make sure we also have the dark theme to allow apps + // to scope sections of their UI to the dark theme + $darkTheme->getId() => $darkTheme, + // Finally, the enforced theme + $theme->getId() => $theme, + ]; + } + return $this->themesProviders; } /** * Enable a theme for the logged-in user - * + * * @param ITheme $theme the theme to enable * @return string[] the enabled themes */ @@ -84,18 +92,18 @@ class ThemesService { } /** @var ITheme[] */ - $themes = array_map(function($themeId) { + $themes = array_filter(array_map(function ($themeId) { return $this->getThemes()[$themeId]; - }, $themesIds); + }, $themesIds)); // Filtering all themes with the same type - $filteredThemes = array_filter($themes, function(ITheme $t) use ($theme) { + $filteredThemes = array_filter($themes, function (ITheme $t) use ($theme) { return $theme->getType() === $t->getType(); }); // Retrieve IDs only /** @var string[] */ - $filteredThemesIds = array_map(function(ITheme $t) { + $filteredThemesIds = array_map(function (ITheme $t) { return $t->getId(); }, array_values($filteredThemes)); @@ -107,7 +115,7 @@ class ThemesService { /** * Disable a theme for the logged-in user - * + * * @param ITheme $theme the theme to disable * @return string[] the enabled themes */ @@ -120,14 +128,14 @@ class ThemesService { $this->setEnabledThemes($enabledThemes); return $enabledThemes; } - + return $themesIds; } /** * Check whether a theme is enabled or not * for the logged-in user - * + * * @return bool */ public function isEnabled(ITheme $theme): bool { @@ -141,32 +149,40 @@ class ThemesService { } /** - * Get the list of all enabled themes IDs - * for the logged-in user - * + * Get the list of all enabled themes IDs for the current user. + * * @return string[] */ public function getEnabledThemes(): array { + $enforcedTheme = $this->config->getSystemValueString('enforce_theme', ''); $user = $this->userSession->getUser(); if ($user === null) { + if ($enforcedTheme !== '') { + return [$enforcedTheme]; + } return []; } + $enabledThemes = json_decode($this->config->getUserValue($user->getUID(), Application::APP_ID, 'enabled-themes', '["default"]')); + if ($enforcedTheme !== '') { + return array_merge([$enforcedTheme], $enabledThemes); + } + try { - return json_decode($this->config->getUserValue($user->getUID(), Application::APP_ID, 'enabled-themes', '[]')); + return $enabledThemes; } catch (\Exception $e) { return []; } } /** - * Set the list of enabled themes + * Set the list of enabled themes * for the logged-in user - * + * * @param string[] $themes the list of enabled themes IDs */ private function setEnabledThemes(array $themes): void { $user = $this->userSession->getUser(); - $this->config->setUserValue($user->getUID(), Application::APP_ID, 'enabled-themes', json_encode(array_unique(array_values($themes)))); + $this->config->setUserValue($user->getUID(), Application::APP_ID, 'enabled-themes', json_encode(array_values(array_unique($themes)))); } } |