]> source.dussan.org Git - nextcloud-server.git/commitdiff
Show local time in avatar menu
authorJoas Schilling <coding@schilljs.com>
Wed, 4 Jan 2023 09:41:31 +0000 (10:41 +0100)
committerJoas Schilling <coding@schilljs.com>
Wed, 4 Jan 2023 10:09:58 +0000 (11:09 +0100)
Signed-off-by: Joas Schilling <coding@schilljs.com>
lib/composer/composer/autoload_classmap.php
lib/composer/composer/autoload_static.php
lib/private/Contacts/ContactsMenu/ActionProviderStore.php
lib/private/Contacts/ContactsMenu/Providers/LocalTimeProvider.php [new file with mode: 0644]
tests/lib/Contacts/ContactsMenu/Providers/LocalTimeProviderTest.php [new file with mode: 0644]

index 5d9a90a3f0280d63126c39056231ee50a33c5935..635318d4fcbd49f08fef5118ab44900c44e27592 100644 (file)
@@ -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',
index 15bcc0f4843f487bcaef00f45dd0c7f4c63a0f10..fe105e680515fc796f6e5d1d284849d932f19156 100644 (file)
@@ -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',
index c93879afa5b730d7001893bec5935a6a888f6eb2..485895de646a03cb516eca8b12bf43c804a2f87b 100644 (file)
@@ -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 (file)
index 0000000..17e30e8
--- /dev/null
@@ -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/Providers/LocalTimeProviderTest.php b/tests/lib/Contacts/ContactsMenu/Providers/LocalTimeProviderTest.php
new file mode 100644 (file)
index 0000000..b87b404
--- /dev/null
@@ -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);
+       }
+}