diff --git a/apps/theming/css/theming.scss b/apps/theming/css/theming.scss index f12ce4d907..b1b8896d0c 100644 --- a/apps/theming/css/theming.scss +++ b/apps/theming/css/theming.scss @@ -98,20 +98,21 @@ background-image: url(./img/core/filetypes/folder-drag-accept.svg?v=#{$theming-cachebuster}) !important; } +#theming-preview-logo, +#header .logo { + background-image: $image-logo; +} + /* override styles for login screen in guest.css */ @if variable_exists('theming-logo-mime') and $theming-logo-mime != '' { #theming-preview-logo, #header .logo { - background-image: $image-logo; background-size: contain; } + #body-login #header .logo { margin-bottom: 22px; } -} @else { - #theming-preview-logo { - background-image: $image-logo; - } } @if variable_exists('theming-background-mime') and $theming-background-mime != '' { diff --git a/apps/theming/lib/ImageManager.php b/apps/theming/lib/ImageManager.php index dfbdb582da..6a42c22aba 100644 --- a/apps/theming/lib/ImageManager.php +++ b/apps/theming/lib/ImageManager.php @@ -84,6 +84,8 @@ class ImageManager { case 'logoheader': case 'favicon': return $this->urlGenerator->imagePath('core', 'logo.png') . '?v=' . $cacheBusterCounter; + case 'logo-blue': + return $this->urlGenerator->imagePath('core', 'logo-blue.png') . '?v=' . $cacheBusterCounter; case 'background': return $this->urlGenerator->imagePath('core', 'background.png') . '?v=' . $cacheBusterCounter; } diff --git a/apps/theming/lib/ThemingDefaults.php b/apps/theming/lib/ThemingDefaults.php index 1df7a9f17b..5a14e8a790 100644 --- a/apps/theming/lib/ThemingDefaults.php +++ b/apps/theming/lib/ThemingDefaults.php @@ -275,7 +275,7 @@ class ThemingDefaults extends \OC_Defaults { 'theming-favicon-mime' => "'" . $this->config->getAppValue('theming', 'faviconMime') . "'" ]; - $variables['image-logo'] = "url('".$this->imageManager->getImageUrl('logo')."')"; + $variables['image-logo'] = "url('". $this->getLogoUrl() ."')"; $variables['image-logoheader'] = "'".$this->imageManager->getImageUrl('logoheader')."'"; $variables['image-favicon'] = "'".$this->imageManager->getImageUrl('favicon')."'"; $variables['image-login-background'] = "url('".$this->imageManager->getImageUrl('background')."')"; @@ -300,6 +300,24 @@ class ThemingDefaults extends \OC_Defaults { return $variables; } + /** + * Returns the logo url. + * If there is a custom logo, it just returns it. + * For the default logo it returns the white or blue one depending on the color luminance. + * + * @return string + */ + private function getLogoUrl() { + $logoMime = $this->config->getAppValue('theming', 'logoMime'); + $primaryColor = $this->getColorPrimary(); + $luminance = $this->util->calculateLuminance($primaryColor); + if ($logoMime === '' & $luminance > 0.8) { + return $this->imageManager->getImageUrl('logo-blue'); + } else { + return $this->imageManager->getImageUrl('logo'); + } + } + /** * Check if the image should be replaced by the theming app * and return the new image location then diff --git a/apps/theming/tests/ThemingDefaultsTest.php b/apps/theming/tests/ThemingDefaultsTest.php index 5d075709dc..fc3a737c3c 100644 --- a/apps/theming/tests/ThemingDefaultsTest.php +++ b/apps/theming/tests/ThemingDefaultsTest.php @@ -632,6 +632,66 @@ class ThemingDefaultsTest extends TestCase { $this->assertEquals(['foo'=>'bar'], $this->template->getScssVariables()); } + /** + * Provides test data for the get logo scss variable test. + * + * @return array + */ + public function provideTestGetImageLogoScssVariableTestData(): array { + return [ + // default logo + ['', '#000000', 0.0, 'logo'], + ['', '#cccccc', 0.8, 'logo'], + ['', '#dddddd', 0.81, 'logo-blue'], + ['', '#ffffff', 1.0, 'logo-blue'], + + // custom logo + ['image/png', '#000000', 0.0, 'logo'], + ['image/png', '#cccccc', 0.8, 'logo'], + ['image/png', '#dddddd', 0.81, 'logo'], + ['image/png', '#ffffff', 1.0, 'logo'], + ]; + } + + /** + * Tests chat the logo url scss variable has the expected value + * depending on color and custom logo presence. + * + * @dataProvider provideTestGetImageLogoScssVariableTestData + * @param string $themingLogoMime The custom logo mime type + * @param string $primaryColor The primary theme color + * @param float $luminance The calculated luminance + * @param string $expected The expected requested logo + * @return void + */ + public function testGetImageLogoScssVariable( + string $themingLogoMime, + string $primaryColor, + float $luminance, + string $expected + ) { + $this->config->expects($this->at(5)) + ->method('getAppValue') + ->with('theming', 'logoMime') + ->willReturn($themingLogoMime); + $this->config->expects($this->at(6)) + ->method('getAppValue') + ->with('theming', 'color', $this->defaults->getColorPrimary()) + ->willReturn($primaryColor); + + $this->util + ->method('calculateLuminance') + ->with($primaryColor) + ->willReturn($luminance); + + $this->imageManager->expects($this->at(0)) + ->method('getImageUrl') + ->with($expected) + ->willReturn('custom-logo?v=0'); + + $this->template->getScssVariables(); + } + public function testGetScssVariables() { $this->config->expects($this->at(0))->method('getAppValue')->with('theming', 'cachebuster', '0')->willReturn('0'); $this->config->expects($this->at(1))->method('getAppValue')->with('theming', 'logoMime', false)->willReturn('jpeg'); @@ -639,10 +699,13 @@ class ThemingDefaultsTest extends TestCase { $this->config->expects($this->at(3))->method('getAppValue')->with('theming', 'logoheaderMime', false)->willReturn('jpeg'); $this->config->expects($this->at(4))->method('getAppValue')->with('theming', 'faviconMime', false)->willReturn('jpeg'); - $this->config->expects($this->at(5))->method('getAppValue')->with('theming', 'color', null)->willReturn($this->defaults->getColorPrimary()); + $this->config->expects($this->at(5))->method('getAppValue')->with('theming', 'logoMime', false)->willReturn('jpeg'); $this->config->expects($this->at(6))->method('getAppValue')->with('theming', 'color', $this->defaults->getColorPrimary())->willReturn($this->defaults->getColorPrimary()); - $this->config->expects($this->at(7))->method('getAppValue')->with('theming', 'color', $this->defaults->getColorPrimary())->willReturn($this->defaults->getColorPrimary()); + + $this->config->expects($this->at(7))->method('getAppValue')->with('theming', 'color', null)->willReturn($this->defaults->getColorPrimary()); $this->config->expects($this->at(8))->method('getAppValue')->with('theming', 'color', $this->defaults->getColorPrimary())->willReturn($this->defaults->getColorPrimary()); + $this->config->expects($this->at(9))->method('getAppValue')->with('theming', 'color', $this->defaults->getColorPrimary())->willReturn($this->defaults->getColorPrimary()); + $this->config->expects($this->at(10))->method('getAppValue')->with('theming', 'color', $this->defaults->getColorPrimary())->willReturn($this->defaults->getColorPrimary()); $this->util->expects($this->any())->method('invertTextColor')->with($this->defaults->getColorPrimary())->willReturn(false); $this->util->expects($this->any())->method('elementColor')->with($this->defaults->getColorPrimary())->willReturn('#aaaaaa'); diff --git a/core/img/logo-blue.png b/core/img/logo-blue.png new file mode 100644 index 0000000000..e1b7352b3f Binary files /dev/null and b/core/img/logo-blue.png differ diff --git a/core/img/logo-blue.svg b/core/img/logo-blue.svg new file mode 100644 index 0000000000..66b17330d1 --- /dev/null +++ b/core/img/logo-blue.svg @@ -0,0 +1,76 @@ + + + + + + image/svg+xml + + + + + + + + + + + + +