use OCP\EventDispatcher\IEventListener;
class BeforePreferenceListener implements IEventListener {
+
+ /**
+ * @var string[]
+ */
+ private const ALLOWED_KEYS = ['force_enable_blur_filter', 'shortcuts_disabled'];
+
public function __construct(
private IAppManager $appManager,
) {
}
private function handleThemingValues(BeforePreferenceSetEvent|BeforePreferenceDeletedEvent $event): void {
- if ($event->getConfigKey() !== 'shortcuts_disabled') {
+ if (!in_array($event->getConfigKey(), self::ALLOWED_KEYS)) {
// Not allowed config key
return;
}
if ($event instanceof BeforePreferenceSetEvent) {
- $event->setValid($event->getConfigValue() === 'yes');
+ switch ($event->getConfigKey()) {
+ case 'force_enable_blur_filter':
+ $event->setValid($event->getConfigValue() === 'yes' || $event->getConfigValue() === 'no');
+ break;
+ case 'shortcuts_disabled':
+ $event->setValid($event->getConfigValue() === 'yes');
+ break;
+ default:
+ $event->setValid(false);
+ }
return;
}
$this->initialStateService->provideInitialState('themes', array_values($themes));
$this->initialStateService->provideInitialState('enforceTheme', $enforcedTheme);
$this->initialStateService->provideInitialState('isUserThemingDisabled', $this->themingDefaults->isUserThemingDisabled());
+ $this->initialStateService->provideInitialState('enableBlurFilter', $this->config->getUserValue($this->userId, 'theming', 'force_enable_blur_filter', ''));
$this->initialStateService->provideInitialState('navigationBar', [
'userAppOrder' => json_decode($this->config->getUserValue($this->userId, 'core', 'apporder', '[]'), true, flags:JSON_THROW_ON_ERROR),
'enforcedDefaultApp' => $forcedDefaultApp
type="font"
@change="changeFont" />
</div>
+
+ <h3>{{ t('theming', 'Misc accessibility options') }}</h3>
+ <NcCheckboxRadioSwitch type="checkbox"
+ :checked="enableBlurFilter === 'yes'"
+ :indeterminate="enableBlurFilter === ''"
+ @update:checked="changeEnableBlurFilter">
+ {{ t('theming', 'Enable blur background filter (may increase GPU load)') }}
+ </NcCheckboxRadioSwitch>
</NcSettingsSection>
<NcSettingsSection :name="t('theming', 'Background')"
const availableThemes = loadState('theming', 'themes', [])
const enforceTheme = loadState('theming', 'enforceTheme', '')
const shortcutsDisabled = loadState('theming', 'shortcutsDisabled', false)
+const enableBlurFilter = loadState('theming', 'enableBlurFilter', '')
const isUserThemingDisabled = loadState('theming', 'isUserThemingDisabled')
enforceTheme,
shortcutsDisabled,
isUserThemingDisabled,
+
+ enableBlurFilter,
}
},
}
},
+ async changeEnableBlurFilter() {
+ this.enableBlurFilter = this.enableBlurFilter === 'no' ? 'yes' : 'no'
+ await axios({
+ url: generateOcsUrl('apps/provisioning_api/api/v1/config/users/{appId}/{configKey}', {
+ appId: 'theming',
+ configKey: 'force_enable_blur_filter',
+ }),
+ data: {
+ configValue: this.enableBlurFilter,
+ },
+ method: 'POST',
+ })
+ // Refresh the styles
+ this.$emit('update:background')
+ },
+
updateBodyAttributes() {
const enabledThemesIDs = this.themes.filter(theme => theme.enabled === true).map(theme => theme.id)
const enabledFontsIDs = this.fonts.filter(font => font.enabled === true).map(font => font.id)
use OCP\IL10N;
use OCP\IURLGenerator;
use OCP\IUserSession;
+use PHPUnit\Framework\MockObject\MockObject;
use Test\TestCase;
class PersonalTest extends TestCase {
- private IConfig $config;
- private ThemesService $themesService;
- private IInitialState $initialStateService;
- private ThemingDefaults $themingDefaults;
- private IAppManager $appManager;
+ private IConfig|MockObject $config;
+ private ThemesService|MockObject $themesService;
+ private IInitialState|MockObject $initialStateService;
+ private ThemingDefaults|MockObject $themingDefaults;
+ private IAppManager|MockObject $appManager;
private Personal $admin;
/** @var ITheme[] */
$this->initialStateService->expects($this->exactly(5))
->method('provideInitialState')
- ->withConsecutive(
+ ->willReturnMap([
['themes', $themesState],
+ ['enableBlurFilter', ''],
['enforceTheme', $enforcedTheme],
['isUserThemingDisabled', false],
['navigationBar', ['userAppOrder' => [], 'enforcedDefaultApp' => 'forcedapp']],
- );
+ ]);
$expected = new TemplateResponse('theming', 'settings-personal');
$this->assertEquals($expected, $this->admin->getForm());
$config,
$l10n,
$appManager,
+ null,
),
'light' => new LightTheme(
$util,
$config,
$l10n,
$appManager,
+ null,
),
'dark' => new DarkTheme(
$util,
$config,
$l10n,
$appManager,
+ null,
),
'light-highcontrast' => new HighContrastTheme(
$util,
$config,
$l10n,
$appManager,
+ null,
),
'dark-highcontrast' => new DarkHighContrastTheme(
$util,
$config,
$l10n,
$appManager,
+ null,
),
'opendyslexic' => new DyslexiaFont(
$util,
$config,
$l10n,
$appManager,
+ null,
),
];
}