Signed-off-by: Joas Schilling <coding@schilljs.com>tags/v26.0.0beta1
@@ -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', |
@@ -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', |
@@ -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, | |||
]; | |||
} |
@@ -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); | |||
} | |||
} | |||
} |
@@ -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); | |||
} | |||
} |