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 = '