diff options
Diffstat (limited to 'apps/theming/lib/Service/ThemesService.php')
-rw-r--r-- | apps/theming/lib/Service/ThemesService.php | 172 |
1 files changed, 172 insertions, 0 deletions
diff --git a/apps/theming/lib/Service/ThemesService.php b/apps/theming/lib/Service/ThemesService.php new file mode 100644 index 00000000000..01ebc3fb504 --- /dev/null +++ b/apps/theming/lib/Service/ThemesService.php @@ -0,0 +1,172 @@ +<?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/>. + * + */ +namespace OCA\Theming\Service; + +use OCA\Theming\AppInfo\Application; +use OCA\Theming\ITheme; +use OCA\Theming\Themes\DarkHighContrastTheme; +use OCA\Theming\Themes\DarkTheme; +use OCA\Theming\Themes\DefaultTheme; +use OCA\Theming\Themes\DyslexiaFont; +use OCA\Theming\Themes\HighContrastTheme; +use OCP\IConfig; +use OCP\IUser; +use OCP\IUserSession; + +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; + + // Register themes + $this->themesProviders = [ + $defaultTheme->getId() => $defaultTheme, + $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 { + return $this->themesProviders; + } + + /** + * Enable a theme for the logged-in user + * + * @param ITheme $theme the theme to enable + * @return string[] the enabled themes + */ + public function enableTheme(ITheme $theme): array { + $themesIds = $this->getEnabledThemes(); + + // If already enabled, ignore + if (in_array($theme->getId(), $themesIds)) { + return $themesIds; + } + + /** @var ITheme[] */ + $themes = array_map(function($themeId) { + return $this->getThemes()[$themeId]; + }, $themesIds); + + // Filtering all themes with the same type + $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) { + return $t->getId(); + }, array_values($filteredThemes)); + + $enabledThemes = array_merge(array_diff($themesIds, $filteredThemesIds), [$theme->getId()]); + $this->setEnabledThemes($enabledThemes); + + return $enabledThemes; + } + + /** + * Disable a theme for the logged-in user + * + * @param ITheme $theme the theme to disable + * @return string[] the enabled themes + */ + public function disableTheme(ITheme $theme): array { + $themesIds = $this->getEnabledThemes(); + + // If enabled, removing it + if (in_array($theme->getId(), $themesIds)) { + $enabledThemes = array_diff($themesIds, [$theme->getId()]); + $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 { + $user = $this->userSession->getUser(); + if ($user instanceof IUser) { + // Using keys as it's faster + $themes = $this->getEnabledThemes(); + return in_array($theme->getId(), $themes); + } + return false; + } + + /** + * Get the list of all enabled themes IDs + * for the logged-in user + * + * @return string[] + */ + public function getEnabledThemes(): array { + $user = $this->userSession->getUser(); + if ($user === null) { + return []; + } + + try { + return json_decode($this->config->getUserValue($user->getUID(), Application::APP_ID, 'enabled-themes', '[]')); + } catch (\Exception $e) { + return []; + } + } + + /** + * 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)))); + } +} |