From 92049c3ceb4121c6e424e8ba902cc6ebc663c690 Mon Sep 17 00:00:00 2001 From: Michael Weimann Date: Tue, 28 Aug 2018 12:01:32 +0200 Subject: [PATCH] Switches the default logo color depending on the primary color Signed-off-by: Michael Weimann --- apps/theming/css/theming.scss | 11 +-- apps/theming/lib/ImageManager.php | 2 + apps/theming/lib/ThemingDefaults.php | 20 +++++- apps/theming/tests/ThemingDefaultsTest.php | 67 +++++++++++++++++- core/img/logo-blue.png | Bin 0 -> 6112 bytes core/img/logo-blue.svg | 76 +++++++++++++++++++++ 6 files changed, 168 insertions(+), 8 deletions(-) create mode 100644 core/img/logo-blue.png create mode 100644 core/img/logo-blue.svg 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 0000000000000000000000000000000000000000..e1b7352b3f670df14fbc7ddc841744bda21f848e GIT binary patch literal 6112 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 m!otGB!otGB!otEL*Z6;g&ZJ(eTxSyi0000 + + + + + image/svg+xml + + + + + + + + + + + + +