aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJoas Schilling <213943+nickvergessen@users.noreply.github.com>2023-01-05 06:30:44 +0100
committerGitHub <noreply@github.com>2023-01-05 06:30:44 +0100
commit411754a12a5ac6ab244688e4910987af9f0287cd (patch)
tree5be2c6fa17a4982dd61d16c5386ff5bb5cedb6d8
parent816200867273dfecf4e4bebbfb5b938d740d1be7 (diff)
parent97e33c2bd4a00e9222a687c563047103eaa718f3 (diff)
downloadnextcloud-server-411754a12a5ac6ab244688e4910987af9f0287cd.tar.gz
nextcloud-server-411754a12a5ac6ab244688e4910987af9f0287cd.zip
Merge pull request #35979 from nextcloud/feature/talk-4657/show-local-time-in-avatar-menu
Show local time in avatar menu
-rw-r--r--lib/composer/composer/autoload_classmap.php1
-rw-r--r--lib/composer/composer/autoload_static.php1
-rw-r--r--lib/private/Contacts/ContactsMenu/ActionProviderStore.php2
-rw-r--r--lib/private/Contacts/ContactsMenu/Providers/LocalTimeProvider.php87
-rw-r--r--tests/lib/Contacts/ContactsMenu/ActionProviderStoreTest.php31
-rw-r--r--tests/lib/Contacts/ContactsMenu/Providers/LocalTimeProviderTest.php163
6 files changed, 273 insertions, 12 deletions
diff --git a/lib/composer/composer/autoload_classmap.php b/lib/composer/composer/autoload_classmap.php
index 5d9a90a3f02..635318d4fcb 100644
--- a/lib/composer/composer/autoload_classmap.php
+++ b/lib/composer/composer/autoload_classmap.php
@@ -873,6 +873,7 @@ return array(
'OC\\Contacts\\ContactsMenu\\Entry' => $baseDir . '/lib/private/Contacts/ContactsMenu/Entry.php',
'OC\\Contacts\\ContactsMenu\\Manager' => $baseDir . '/lib/private/Contacts/ContactsMenu/Manager.php',
'OC\\Contacts\\ContactsMenu\\Providers\\EMailProvider' => $baseDir . '/lib/private/Contacts/ContactsMenu/Providers/EMailProvider.php',
+ 'OC\\Contacts\\ContactsMenu\\Providers\\LocalTimeProvider' => $baseDir . '/lib/private/Contacts/ContactsMenu/Providers/LocalTimeProvider.php',
'OC\\Contacts\\ContactsMenu\\Providers\\ProfileProvider' => $baseDir . '/lib/private/Contacts/ContactsMenu/Providers/ProfileProvider.php',
'OC\\Core\\Application' => $baseDir . '/core/Application.php',
'OC\\Core\\BackgroundJobs\\BackgroundCleanupUpdaterBackupsJob' => $baseDir . '/core/BackgroundJobs/BackgroundCleanupUpdaterBackupsJob.php',
diff --git a/lib/composer/composer/autoload_static.php b/lib/composer/composer/autoload_static.php
index 15bcc0f4843..fe105e68051 100644
--- a/lib/composer/composer/autoload_static.php
+++ b/lib/composer/composer/autoload_static.php
@@ -906,6 +906,7 @@ class ComposerStaticInit749170dad3f5e7f9ca158f5a9f04f6a2
'OC\\Contacts\\ContactsMenu\\Entry' => __DIR__ . '/../../..' . '/lib/private/Contacts/ContactsMenu/Entry.php',
'OC\\Contacts\\ContactsMenu\\Manager' => __DIR__ . '/../../..' . '/lib/private/Contacts/ContactsMenu/Manager.php',
'OC\\Contacts\\ContactsMenu\\Providers\\EMailProvider' => __DIR__ . '/../../..' . '/lib/private/Contacts/ContactsMenu/Providers/EMailProvider.php',
+ 'OC\\Contacts\\ContactsMenu\\Providers\\LocalTimeProvider' => __DIR__ . '/../../..' . '/lib/private/Contacts/ContactsMenu/Providers/LocalTimeProvider.php',
'OC\\Contacts\\ContactsMenu\\Providers\\ProfileProvider' => __DIR__ . '/../../..' . '/lib/private/Contacts/ContactsMenu/Providers/ProfileProvider.php',
'OC\\Core\\Application' => __DIR__ . '/../../..' . '/core/Application.php',
'OC\\Core\\BackgroundJobs\\BackgroundCleanupUpdaterBackupsJob' => __DIR__ . '/../../..' . '/core/BackgroundJobs/BackgroundCleanupUpdaterBackupsJob.php',
diff --git a/lib/private/Contacts/ContactsMenu/ActionProviderStore.php b/lib/private/Contacts/ContactsMenu/ActionProviderStore.php
index c93879afa5b..485895de646 100644
--- a/lib/private/Contacts/ContactsMenu/ActionProviderStore.php
+++ b/lib/private/Contacts/ContactsMenu/ActionProviderStore.php
@@ -30,6 +30,7 @@ namespace OC\Contacts\ContactsMenu;
use Exception;
use OC\App\AppManager;
use OC\Contacts\ContactsMenu\Providers\EMailProvider;
+use OC\Contacts\ContactsMenu\Providers\LocalTimeProvider;
use OC\Contacts\ContactsMenu\Providers\ProfileProvider;
use OCP\AppFramework\QueryException;
use OCP\Contacts\ContactsMenu\IProvider;
@@ -83,6 +84,7 @@ class ActionProviderStore {
private function getServerProviderClasses(): array {
return [
ProfileProvider::class,
+ LocalTimeProvider::class,
EMailProvider::class,
];
}
diff --git a/lib/private/Contacts/ContactsMenu/Providers/LocalTimeProvider.php b/lib/private/Contacts/ContactsMenu/Providers/LocalTimeProvider.php
new file mode 100644
index 00000000000..17e30e89c37
--- /dev/null
+++ b/lib/private/Contacts/ContactsMenu/Providers/LocalTimeProvider.php
@@ -0,0 +1,87 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright Copyright (c) 2023, Joas Schilling <coding@schilljs.com>
+ *
+ * @author Joas Schilling <coding@schilljs.com>
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+namespace OC\Contacts\ContactsMenu\Providers;
+
+use OCP\AppFramework\Utility\ITimeFactory;
+use OCP\Contacts\ContactsMenu\IActionFactory;
+use OCP\Contacts\ContactsMenu\IEntry;
+use OCP\Contacts\ContactsMenu\IProvider;
+use OCP\IConfig;
+use OCP\IDateTimeFormatter;
+use OCP\IURLGenerator;
+use OCP\IUserManager;
+use OCP\L10N\IFactory as IL10NFactory;
+
+class LocalTimeProvider implements IProvider {
+ private IActionFactory $actionFactory;
+ private IL10NFactory $l10nFactory;
+ private IURLGenerator $urlGenerator;
+ private IUserManager $userManager;
+ private ITimeFactory $timeFactory;
+ private IDateTimeFormatter $dateTimeFormatter;
+ private IConfig $config;
+
+ public function __construct(
+ IActionFactory $actionFactory,
+ IL10NFactory $l10nFactory,
+ IURLGenerator $urlGenerator,
+ IUserManager $userManager,
+ ITimeFactory $timeFactory,
+ IDateTimeFormatter $dateTimeFormatter,
+ IConfig $config
+ ) {
+ $this->actionFactory = $actionFactory;
+ $this->l10nFactory = $l10nFactory;
+ $this->urlGenerator = $urlGenerator;
+ $this->userManager = $userManager;
+ $this->timeFactory = $timeFactory;
+ $this->dateTimeFormatter = $dateTimeFormatter;
+ $this->config = $config;
+ }
+
+ /**
+ * @param IEntry $entry
+ */
+ public function process(IEntry $entry) {
+ $targetUserId = $entry->getProperty('UID');
+ $targetUser = $this->userManager->get($targetUserId);
+ if (!empty($targetUser)) {
+ $timezone = $this->config->getUserValue($targetUser->getUID(), 'core', 'timezone') ?: date_default_timezone_get();
+ $dateTimeZone = new \DateTimeZone($timezone);
+ $localTime = $this->dateTimeFormatter->formatTime($this->timeFactory->getDateTime(), 'short', $dateTimeZone);
+
+ $iconUrl = $this->urlGenerator->getAbsoluteURL($this->urlGenerator->imagePath('core', 'actions/recent.svg'));
+ $l = $this->l10nFactory->get('lib');
+ $profileActionText = $l->t('Local time: %s', [$localTime]);
+
+ $action = $this->actionFactory->newLinkAction($iconUrl, $profileActionText, '#', 'timezone');
+ // Order after the profile page
+ $action->setPriority(19);
+ $entry->addAction($action);
+ }
+ }
+}
diff --git a/tests/lib/Contacts/ContactsMenu/ActionProviderStoreTest.php b/tests/lib/Contacts/ContactsMenu/ActionProviderStoreTest.php
index 67f84042996..2543746ddb5 100644
--- a/tests/lib/Contacts/ContactsMenu/ActionProviderStoreTest.php
+++ b/tests/lib/Contacts/ContactsMenu/ActionProviderStoreTest.php
@@ -27,6 +27,7 @@ namespace Tests\Contacts\ContactsMenu;
use OC\App\AppManager;
use OC\Contacts\ContactsMenu\ActionProviderStore;
use OC\Contacts\ContactsMenu\Providers\EMailProvider;
+use OC\Contacts\ContactsMenu\Providers\LocalTimeProvider;
use OC\Contacts\ContactsMenu\Providers\ProfileProvider;
use OCP\App\IAppManager;
use OCP\AppFramework\QueryException;
@@ -60,8 +61,9 @@ class ActionProviderStoreTest extends TestCase {
public function testGetProviders() {
$user = $this->createMock(IUser::class);
$provider1 = $this->createMock(ProfileProvider::class);
- $provider2 = $this->createMock(EMailProvider::class);
- $provider3 = $this->createMock(IProvider::class);
+ $provider2 = $this->createMock(LocalTimeProvider::class);
+ $provider3 = $this->createMock(EMailProvider::class);
+ $provider4 = $this->createMock(IProvider::class);
$this->appManager->expects($this->once())
->method('getEnabledAppsForUser')
@@ -75,25 +77,28 @@ class ActionProviderStoreTest extends TestCase {
'OCA\Contacts\Provider1',
],
]);
- $this->serverContainer->expects($this->exactly(3))
+ $this->serverContainer->expects($this->exactly(4))
->method('get')
->willReturnMap([
[ProfileProvider::class, $provider1],
- [EMailProvider::class, $provider2],
- ['OCA\Contacts\Provider1', $provider3]
+ [LocalTimeProvider::class, $provider2],
+ [EMailProvider::class, $provider3],
+ ['OCA\Contacts\Provider1', $provider4]
]);
$providers = $this->actionProviderStore->getProviders($user);
- $this->assertCount(3, $providers);
+ $this->assertCount(4, $providers);
$this->assertInstanceOf(ProfileProvider::class, $providers[0]);
- $this->assertInstanceOf(EMailProvider::class, $providers[1]);
+ $this->assertInstanceOf(LocalTimeProvider::class, $providers[1]);
+ $this->assertInstanceOf(EMailProvider::class, $providers[2]);
}
public function testGetProvidersOfAppWithIncompleInfo() {
$user = $this->createMock(IUser::class);
$provider1 = $this->createMock(ProfileProvider::class);
- $provider2 = $this->createMock(EMailProvider::class);
+ $provider2 = $this->createMock(LocalTimeProvider::class);
+ $provider3 = $this->createMock(EMailProvider::class);
$this->appManager->expects($this->once())
->method('getEnabledAppsForUser')
@@ -103,18 +108,20 @@ class ActionProviderStoreTest extends TestCase {
->method('getAppInfo')
->with('contacts')
->willReturn([/* Empty info.xml */]);
- $this->serverContainer->expects($this->exactly(2))
+ $this->serverContainer->expects($this->exactly(3))
->method('get')
->willReturnMap([
[ProfileProvider::class, $provider1],
- [EMailProvider::class, $provider2],
+ [LocalTimeProvider::class, $provider2],
+ [EMailProvider::class, $provider3],
]);
$providers = $this->actionProviderStore->getProviders($user);
- $this->assertCount(2, $providers);
+ $this->assertCount(3, $providers);
$this->assertInstanceOf(ProfileProvider::class, $providers[0]);
- $this->assertInstanceOf(EMailProvider::class, $providers[1]);
+ $this->assertInstanceOf(LocalTimeProvider::class, $providers[1]);
+ $this->assertInstanceOf(EMailProvider::class, $providers[2]);
}
diff --git a/tests/lib/Contacts/ContactsMenu/Providers/LocalTimeProviderTest.php b/tests/lib/Contacts/ContactsMenu/Providers/LocalTimeProviderTest.php
new file mode 100644
index 00000000000..b87b4047071
--- /dev/null
+++ b/tests/lib/Contacts/ContactsMenu/Providers/LocalTimeProviderTest.php
@@ -0,0 +1,163 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright Copyright (c) 2023, Joas Schilling <coding@schilljs.com>
+ *
+ * @author Joas Schilling <coding@schilljs.com>
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+namespace lib\Contacts\ContactsMenu\Providers;
+
+use OC\Contacts\ContactsMenu\Providers\LocalTimeProvider;
+use OCP\AppFramework\Utility\ITimeFactory;
+use OCP\Contacts\ContactsMenu\IActionFactory;
+use OCP\Contacts\ContactsMenu\IEntry;
+use OCP\Contacts\ContactsMenu\ILinkAction;
+use OCP\IConfig;
+use OCP\IDateTimeFormatter;
+use OCP\IL10N;
+use OCP\IURLGenerator;
+use OCP\IUser;
+use OCP\IUserManager;
+use OCP\L10N\IFactory as IL10NFactory;
+use PHPUnit\Framework\MockObject\MockObject;
+use Test\TestCase;
+
+class LocalTimeProviderTest extends TestCase {
+
+ /** @var IActionFactory|MockObject */
+ private $actionFactory;
+ /** @var IL10N|MockObject */
+ private $l;
+ /** @var IURLGenerator|MockObject */
+ private $urlGenerator;
+ /** @var IUserManager|MockObject */
+ private $userManager;
+ /** @var ITimeFactory|MockObject */
+ private $timeFactory;
+ /** @var IDateTimeFormatter|MockObject */
+ private $dateTimeFormatter;
+ /** @var IConfig|MockObject */
+ private $config;
+
+ private LocalTimeProvider $provider;
+
+ protected function setUp(): void {
+ parent::setUp();
+
+ $this->actionFactory = $this->createMock(IActionFactory::class);
+ $this->l10nFactory = $this->createMock(IL10NFactory::class);
+ $this->l = $this->createMock(IL10N::class);
+ $this->l->expects($this->any())
+ ->method('t')
+ ->will($this->returnCallback(function ($text, $parameters = []) {
+ return vsprintf($text, $parameters);
+ }));
+ $this->urlGenerator = $this->createMock(IURLGenerator::class);
+ $this->userManager = $this->createMock(IUserManager::class);
+ $this->timeFactory = $this->createMock(ITimeFactory::class);
+ $this->dateTimeFormatter = $this->createMock(IDateTimeFormatter::class);
+ $this->config = $this->createMock(IConfig::class);
+
+ $this->provider = new LocalTimeProvider(
+ $this->actionFactory,
+ $this->l10nFactory,
+ $this->urlGenerator,
+ $this->userManager,
+ $this->timeFactory,
+ $this->dateTimeFormatter,
+ $this->config
+ );
+ }
+
+ public function testProcess(): void {
+ $entry = $this->createMock(IEntry::class);
+ $entry->expects($this->once())
+ ->method('getProperty')
+ ->with('UID')
+ ->willReturn('user1');
+
+ $user = $this->createMock(IUser::class);
+ $user->method('getUID')
+ ->willReturn('user1');
+ $this->userManager->expects($this->once())
+ ->method('get')
+ ->with('user1')
+ ->willReturn($user);
+
+ $this->l10nFactory->method('get')
+ ->with('lib')
+ ->willReturn($this->l);
+
+ $this->config->method('getUserValue')
+ ->with('user1', 'core', 'timezone')
+ ->willReturn('America/Los_Angeles');
+
+ $now = new \DateTime('2023-01-04 10:24:43');
+ $this->timeFactory->method('getDateTime')
+ ->willReturn($now);
+
+ $now = new \DateTime('2023-01-04 10:24:43');
+ $this->dateTimeFormatter->method('formatTime')
+ ->with($now, 'short', $this->anything())
+ ->willReturn('01:24');
+
+ $this->urlGenerator->method('imagePath')
+ ->willReturn('actions/recent.svg');
+ $this->urlGenerator->method('getAbsoluteURL')
+ ->with('actions/recent.svg')
+ ->willReturn('https://localhost/actions/recent.svg');
+
+ $action = $this->createMock(ILinkAction::class);
+ $this->actionFactory->expects($this->once())
+ ->method('newLinkAction')
+ ->with(
+ 'https://localhost/actions/recent.svg',
+ 'Local time: 01:24',
+ '#',
+ 'timezone'
+ )
+ ->willReturn($action);
+
+ $entry->expects($this->once())
+ ->method('addAction')
+ ->with($action);
+
+ $this->provider->process($entry);
+ }
+
+ public function testProcessNoUser(): void {
+ $entry = $this->createMock(IEntry::class);
+ $entry->expects($this->once())
+ ->method('getProperty')
+ ->with('UID')
+ ->willReturn('user1');
+
+ $user = $this->createMock(IUser::class);
+ $user->method('getUID')
+ ->willReturn(null);
+
+ $entry->expects($this->never())
+ ->method('addAction');
+
+ $this->provider->process($entry);
+ }
+}