From 7e76c91677f9ebdf51554bc38f7df90f671801ef Mon Sep 17 00:00:00 2001 From: Ferdinand Thiessen Date: Wed, 6 Aug 2025 12:23:40 +0200 Subject: [PATCH] fix: resolve psalm errors Signed-off-by: Ferdinand Thiessen --- lib/private/Avatar/Avatar.php | 27 +++++++++++++++--------- lib/private/Avatar/AvatarManager.php | 6 +++--- lib/private/Avatar/GuestAvatar.php | 4 +++- lib/private/Avatar/PlaceholderAvatar.php | 4 +++- lib/private/Avatar/UserAvatar.php | 9 ++++++-- tests/lib/Avatar/AvatarManagerTest.php | 2 +- tests/lib/Avatar/GuestAvatarTest.php | 5 +++-- tests/lib/Avatar/UserAvatarTest.php | 20 ++++++------------ 8 files changed, 44 insertions(+), 33 deletions(-) diff --git a/lib/private/Avatar/Avatar.php b/lib/private/Avatar/Avatar.php index d11c0f394dc..dc65c9d5743 100644 --- a/lib/private/Avatar/Avatar.php +++ b/lib/private/Avatar/Avatar.php @@ -10,19 +10,17 @@ declare(strict_types=1); namespace OC\Avatar; use Imagick; +use OC\User\User; use OCP\Color; use OCP\Files\NotFoundException; use OCP\IAvatar; -use Psr\Log\LoggerInterface; -use OC\User\User; use OCP\IConfig; +use Psr\Log\LoggerInterface; /** * This class gets and sets users avatars. */ abstract class Avatar implements IAvatar { - protected LoggerInterface $logger; - /** * https://github.com/sebdesign/cap-height -- for 500px height * Automated check: https://codepen.io/skjnldsv/pen/PydLBK/ @@ -37,8 +35,10 @@ abstract class Avatar implements IAvatar { {letter} '; - public function __construct(LoggerInterface $logger) { - $this->logger = $logger; + public function __construct( + protected IConfig $config, + protected LoggerInterface $logger, + ) { } /** @@ -97,12 +97,11 @@ abstract class Avatar implements IAvatar { } /** - * Select the rendering font based on the user's display name and language + * Select the rendering font based on the user's display name and language */ private function getFont(string $userDisplayName): string { if (preg_match('/\p{Han}/u', $userDisplayName) === 1) { - $userlang = $this->config->getUserValue($this->user->getUID(), 'core', 'lang', ''); - switch ($userlang) { + switch ($this->getAvatarLanguage()) { case 'zh_TW': return __DIR__ . '/../../../core/fonts/NotoSansTC-Regular.ttf'; case 'zh_HK': @@ -129,7 +128,7 @@ abstract class Avatar implements IAvatar { // Avatar generation breaks if RSVG format is enabled. Fall back to gd in that case if (in_array('RSVG', $formats, true)) { return null; - } + } $text = $this->getAvatarText(); try { $font = $this->getFont($text); @@ -282,4 +281,12 @@ abstract class Avatar implements IAvatar { return $finalPalette[$this->hashToInt($hash, $steps * 3)]; } + + /** + * Get the language to be used for avatar generation. + * This is used to determine the font to use for the avatar text (e.g. CJK characters). + */ + protected function getAvatarLanguage(): string { + return $this->config->getSystemValueString('default_language', 'en'); + } } diff --git a/lib/private/Avatar/AvatarManager.php b/lib/private/Avatar/AvatarManager.php index 60a3d358bf4..c68467085f0 100644 --- a/lib/private/Avatar/AvatarManager.php +++ b/lib/private/Avatar/AvatarManager.php @@ -92,10 +92,10 @@ class AvatarManager implements IAvatarManager { return new UserAvatar($folder, $this->l, $user, $this->logger, $this->config); default: // use a placeholder avatar which caches the generated images - return new PlaceholderAvatar($folder, $user, $this->logger); + return new PlaceholderAvatar($folder, $user, $this->config, $this->logger); } - return new PlaceholderAvatar($folder, $user, $this->logger); + return new PlaceholderAvatar($folder, $user, $this->config, $this->logger); } /** @@ -129,6 +129,6 @@ class AvatarManager implements IAvatarManager { * @param string $name The guest name, e.g. "Albert". */ public function getGuestAvatar(string $name): IAvatar { - return new GuestAvatar($name, $this->logger); + return new GuestAvatar($name, $this->config, $this->logger); } } diff --git a/lib/private/Avatar/GuestAvatar.php b/lib/private/Avatar/GuestAvatar.php index 7ae633f1260..c0c7de0c078 100644 --- a/lib/private/Avatar/GuestAvatar.php +++ b/lib/private/Avatar/GuestAvatar.php @@ -10,6 +10,7 @@ namespace OC\Avatar; use OCP\Files\SimpleFS\InMemoryFile; use OCP\Files\SimpleFS\ISimpleFile; +use OCP\IConfig; use Psr\Log\LoggerInterface; /** @@ -23,9 +24,10 @@ class GuestAvatar extends Avatar { */ public function __construct( private string $userDisplayName, + IConfig $config, LoggerInterface $logger, ) { - parent::__construct($logger); + parent::__construct($config, $logger); } /** diff --git a/lib/private/Avatar/PlaceholderAvatar.php b/lib/private/Avatar/PlaceholderAvatar.php index c2120e37f22..f5f49fb7cb2 100644 --- a/lib/private/Avatar/PlaceholderAvatar.php +++ b/lib/private/Avatar/PlaceholderAvatar.php @@ -14,6 +14,7 @@ use OCP\Files\NotFoundException; use OCP\Files\NotPermittedException; use OCP\Files\SimpleFS\ISimpleFile; use OCP\Files\SimpleFS\ISimpleFolder; +use OCP\IConfig; use OCP\IImage; use Psr\Log\LoggerInterface; @@ -27,9 +28,10 @@ class PlaceholderAvatar extends Avatar { public function __construct( private ISimpleFolder $folder, private User $user, + IConfig $config, LoggerInterface $logger, ) { - parent::__construct($logger); + parent::__construct($config, $logger); } /** diff --git a/lib/private/Avatar/UserAvatar.php b/lib/private/Avatar/UserAvatar.php index 4506a654b8e..aca2aa574bc 100644 --- a/lib/private/Avatar/UserAvatar.php +++ b/lib/private/Avatar/UserAvatar.php @@ -28,9 +28,9 @@ class UserAvatar extends Avatar { private IL10N $l, protected User $user, LoggerInterface $logger, - protected IConfig $config, + IConfig $config, ) { - parent::__construct($logger); + parent::__construct($config, $logger); } /** @@ -295,4 +295,9 @@ class UserAvatar extends Avatar { public function isCustomAvatar(): bool { return $this->config->getUserValue($this->user->getUID(), 'avatar', 'generated', 'false') !== 'true'; } + + #[\Override] + protected function getAvatarLanguage(): string { + return $this->config->getUserValue($this->user->getUID(), 'core', 'lang', parent::getAvatarLanguage()); + } } diff --git a/tests/lib/Avatar/AvatarManagerTest.php b/tests/lib/Avatar/AvatarManagerTest.php index 23d3b9d1c2a..495d7099d59 100644 --- a/tests/lib/Avatar/AvatarManagerTest.php +++ b/tests/lib/Avatar/AvatarManagerTest.php @@ -269,7 +269,7 @@ class AvatarManagerTest extends \Test\TestCase { } if ($expectedPlaceholder) { - $expected = new PlaceholderAvatar($folder, $user, $this->createMock(LoggerInterface::class)); + $expected = new PlaceholderAvatar($folder, $user, $this->config, $this->logger); } else { $expected = new UserAvatar($folder, $this->l10n, $user, $this->logger, $this->config); } diff --git a/tests/lib/Avatar/GuestAvatarTest.php b/tests/lib/Avatar/GuestAvatarTest.php index 8188684b51f..b49fcea6ed2 100644 --- a/tests/lib/Avatar/GuestAvatarTest.php +++ b/tests/lib/Avatar/GuestAvatarTest.php @@ -34,8 +34,9 @@ class GuestAvatarTest extends TestCase { */ public function setupGuestAvatar() { /* @var MockObject|LoggerInterface $logger */ - $logger = $this->getMockBuilder(LoggerInterface::class)->getMock(); - $this->guestAvatar = new GuestAvatar('einstein', $logger); + $logger = $this->createMock(LoggerInterface::class); + $config = $this->createMock(\OCP\IConfig::class); + $this->guestAvatar = new GuestAvatar('einstein', $config, $logger); } /** diff --git a/tests/lib/Avatar/UserAvatarTest.php b/tests/lib/Avatar/UserAvatarTest.php index 03a868c7854..940a15dd162 100644 --- a/tests/lib/Avatar/UserAvatarTest.php +++ b/tests/lib/Avatar/UserAvatarTest.php @@ -18,21 +18,16 @@ use OCP\Files\SimpleFS\ISimpleFile; use OCP\IConfig; use OCP\IL10N; use OCP\Image; +use PHPUnit\Framework\MockObject\MockObject; use Psr\Log\LoggerInterface; class UserAvatarTest extends \Test\TestCase { - /** @var SimpleFolder | \PHPUnit\Framework\MockObject\MockObject */ - private $folder; - - /** @var \OC\Avatar\UserAvatar */ - private $avatar; - - /** @var User|\PHPUnit\Framework\MockObject\MockObject $user */ - private $user; - - /** @var IConfig|\PHPUnit\Framework\MockObject\MockObject */ - private $config; + private UserAvatar $avatar; + private SimpleFolder&MockObject $folder; + private IConfig&MockObject $config; + private User&MockObject $user; + protected function setUp(): void { parent::setUp(); @@ -236,7 +231,7 @@ class UserAvatarTest extends \Test\TestCase { } public function testGenerateSvgAvatar(): void { - $avatar = $this->invokePrivate($this->avatar, 'getAvatarVector', [64, false]); + $avatar = $this->invokePrivate($this->avatar, 'getAvatarVector', [$this->user->getDisplayName(), 64, false]); $svg = ' @@ -246,7 +241,6 @@ class UserAvatarTest extends \Test\TestCase { $this->assertEquals($avatar, $svg); } - #[\PHPUnit\Framework\Attributes\DataProvider('avatarTextData')] public function testGetAvatarText($displayName, $expectedAvatarText): void { $user = $this->getUserWithDisplayName($displayName);