From acc0df1d13a082e5531acf76047ff24c85230289 Mon Sep 17 00:00:00 2001 From: Sergey Shliakhov Date: Wed, 8 Jan 2020 13:21:50 +0100 Subject: [PATCH] Change avatar placeholder from single letter to 2 letters https://github.com/nextcloud/server/issues/18717 Signed-off-by: Sergey Shliakhov --- lib/private/Avatar/Avatar.php | 20 +++++----- tests/lib/Avatar/UserAvatarTest.php | 58 ++++++++++++++++++++++------- 2 files changed, 56 insertions(+), 22 deletions(-) diff --git a/lib/private/Avatar/Avatar.php b/lib/private/Avatar/Avatar.php index b2232f2ff0..5a91a09b4b 100644 --- a/lib/private/Avatar/Avatar.php +++ b/lib/private/Avatar/Avatar.php @@ -89,13 +89,15 @@ abstract class Avatar implements IAvatar { * * @return string */ - private function getAvatarLetter(): string { + private function getAvatarText(): string { $displayName = $this->getDisplayName(); if (empty($displayName) === true) { return '?'; - } else { - return mb_strtoupper(mb_substr($displayName, 0, 1), 'UTF-8'); } + $firstTwoLetters = array_map(function ($namePart) { + return mb_strtoupper(mb_substr($namePart, 0, 1), 'UTF-8'); + }, explode(' ', $displayName, 2)); + return implode('', $firstTwoLetters); } /** @@ -130,9 +132,9 @@ abstract class Avatar implements IAvatar { $userDisplayName = $this->getDisplayName(); $bgRGB = $this->avatarBackgroundColor($userDisplayName); $bgHEX = sprintf("%02x%02x%02x", $bgRGB->r, $bgRGB->g, $bgRGB->b); - $letter = $this->getAvatarLetter(); - $toReplace = ['{size}', '{fill}', '{letter}']; - return str_replace($toReplace, [$size, $bgHEX, $letter], $this->svgTemplate); + $text = $this->getAvatarText(); + $toReplace = ['{size}', '{fill}', '{text}']; + return str_replace($toReplace, [$size, $bgHEX, $text], $this->svgTemplate); } /** @@ -168,7 +170,7 @@ abstract class Avatar implements IAvatar { * @return string */ protected function generateAvatar($userDisplayName, $size) { - $letter = $this->getAvatarLetter(); + $text = $this->getAvatarText(); $backgroundColor = $this->avatarBackgroundColor($userDisplayName); $im = imagecreatetruecolor($size, $size); @@ -185,10 +187,10 @@ abstract class Avatar implements IAvatar { $fontSize = $size * 0.4; list($x, $y) = $this->imageTTFCenter( - $im, $letter, $font, (int)$fontSize + $im, $text, $font, (int)$fontSize ); - imagettftext($im, $fontSize, 0, $x, $y, $white, $font, $letter); + imagettftext($im, $fontSize, 0, $x, $y, $white, $font, $text); ob_start(); imagepng($im); diff --git a/tests/lib/Avatar/UserAvatarTest.php b/tests/lib/Avatar/UserAvatarTest.php index ff6c63df2a..43e325b094 100644 --- a/tests/lib/Avatar/UserAvatarTest.php +++ b/tests/lib/Avatar/UserAvatarTest.php @@ -35,22 +35,20 @@ class UserAvatarTest extends \Test\TestCase { parent::setUp(); $this->folder = $this->createMock(SimpleFolder::class); - /** @var \OCP\IL10N | \PHPUnit_Framework_MockObject_MockObject $l */ - $l = $this->createMock(IL10N::class); - $l->method('t')->will($this->returnArgument(0)); - $this->user = $this->createMock(User::class); + // abcdefghi is a convenient name that our algorithm convert to our nextcloud blue 0082c9 + $this->user = $this->getUserWithDisplayName('abcdefghi'); $this->config = $this->createMock(IConfig::class); - $this->avatar = new \OC\Avatar\UserAvatar( - $this->folder, - $l, - $this->user, - $this->createMock(ILogger::class), - $this->config - ); + $this->avatar = $this->getUserAvatar($this->user); + } - // abcdefghi is a convenient name that our algorithm convert to our nextcloud blue 0082c9 - $this->user->method('getDisplayName')->willReturn('abcdefghi'); + public function avatarTextData() { + return [ + ['', '?'], + ['matchish', 'M'], + ['Firstname Lastname', 'FL'], + ['Firstname Lastname Rest', 'FL'], + ]; } public function testGetNoAvatar() { @@ -239,6 +237,18 @@ class UserAvatarTest extends \Test\TestCase { $this->assertEquals($avatar, $svg); } + + /** + * @dataProvider avatarTextData + */ + public function testGetAvatarText($displayName, $expectedAvatarText) { + $user = $this->getUserWithDisplayName($displayName); + $avatar = $this->getUserAvatar($user); + + $avatarText = $this->invokePrivate($avatar, 'getAvatarText'); + $this->assertEquals($expectedAvatarText, $avatarText); + } + public function testHashToInt() { $hashToInt = $this->invokePrivate($this->avatar, 'hashToInt', ['abcdef', 18]); $this->assertTrue(gettype($hashToInt) === 'integer'); @@ -261,4 +271,26 @@ class UserAvatarTest extends \Test\TestCase { $this->assertTrue(gettype($hashToInt) === 'integer'); } + private function getUserWithDisplayName($name) + { + $user = $this->createMock(User::class); + $user->method('getDisplayName')->willReturn($name); + return $user; + } + + private function getUserAvatar($user) + { + /** @var \OCP\IL10N | \PHPUnit_Framework_MockObject_MockObject $l */ + $l = $this->createMock(IL10N::class); + $l->method('t')->will($this->returnArgument(0)); + + return new \OC\Avatar\UserAvatar( + $this->folder, + $l, + $user, + $this->createMock(ILogger::class), + $this->config + ); + } + }