diff options
Diffstat (limited to 'lib/private/Contacts/ContactsMenu/Providers')
3 files changed, 108 insertions, 94 deletions
diff --git a/lib/private/Contacts/ContactsMenu/Providers/EMailProvider.php b/lib/private/Contacts/ContactsMenu/Providers/EMailProvider.php index d69f219e84c..266125f5ed5 100644 --- a/lib/private/Contacts/ContactsMenu/Providers/EMailProvider.php +++ b/lib/private/Contacts/ContactsMenu/Providers/EMailProvider.php @@ -1,24 +1,8 @@ <?php + /** - * @copyright 2017 Christoph Wurst <christoph@winzerhof-wurst.at> - * - * @author Christoph Wurst <christoph@winzerhof-wurst.at> - * - * @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/>. - * + * SPDX-FileCopyrightText: 2017 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later */ namespace OC\Contacts\ContactsMenu\Providers; @@ -28,26 +12,13 @@ use OCP\Contacts\ContactsMenu\IProvider; use OCP\IURLGenerator; class EMailProvider implements IProvider { - - /** @var IActionFactory */ - private $actionFactory; - - /** @var IURLGenerator */ - private $urlGenerator; - - /** - * @param IActionFactory $actionFactory - * @param IURLGenerator $urlGenerator - */ - public function __construct(IActionFactory $actionFactory, IURLGenerator $urlGenerator) { - $this->actionFactory = $actionFactory; - $this->urlGenerator = $urlGenerator; + public function __construct( + private IActionFactory $actionFactory, + private IURLGenerator $urlGenerator, + ) { } - /** - * @param IEntry $entry - */ - public function process(IEntry $entry) { + public function process(IEntry $entry): void { $iconUrl = $this->urlGenerator->getAbsoluteURL($this->urlGenerator->imagePath('core', 'actions/mail.svg')); foreach ($entry->getEMailAddresses() as $address) { if (empty($address)) { diff --git a/lib/private/Contacts/ContactsMenu/Providers/LocalTimeProvider.php b/lib/private/Contacts/ContactsMenu/Providers/LocalTimeProvider.php new file mode 100644 index 00000000000..f62e989fd64 --- /dev/null +++ b/lib/private/Contacts/ContactsMenu/Providers/LocalTimeProvider.php @@ -0,0 +1,91 @@ +<?php + +declare(strict_types=1); + +/** + * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later + */ + +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\IUserSession; +use OCP\L10N\IFactory as IL10NFactory; + +class LocalTimeProvider implements IProvider { + public function __construct( + private IActionFactory $actionFactory, + private IL10NFactory $l10nFactory, + private IURLGenerator $urlGenerator, + private IUserManager $userManager, + private ITimeFactory $timeFactory, + private IDateTimeFormatter $dateTimeFormatter, + private IConfig $config, + private IUserSession $currentSession, + ) { + } + + public function process(IEntry $entry): void { + $targetUserId = $entry->getProperty('UID'); + $targetUser = $this->userManager->get($targetUserId); + if (!empty($targetUser)) { + $timezoneStringTarget = $this->config->getUserValue($targetUser->getUID(), 'core', 'timezone') ?: $this->config->getSystemValueString('default_timezone', 'UTC'); + $timezoneTarget = new \DateTimeZone($timezoneStringTarget); + $localTimeTarget = $this->timeFactory->getDateTime('now', $timezoneTarget); + $localTimeString = $this->dateTimeFormatter->formatTime($localTimeTarget, 'short', $timezoneTarget); + + $l = $this->l10nFactory->get('lib'); + $currentUser = $this->currentSession->getUser(); + if ($currentUser !== null) { + $timezoneStringCurrent = $this->config->getUserValue($currentUser->getUID(), 'core', 'timezone') ?: $this->config->getSystemValueString('default_timezone', 'UTC'); + $timezoneCurrent = new \DateTimeZone($timezoneStringCurrent); + $localTimeCurrent = $this->timeFactory->getDateTime('now', $timezoneCurrent); + + // Get the timezone offsets to GMT on this very time (needed to handle daylight saving time) + $timeOffsetCurrent = $timezoneCurrent->getOffset($localTimeCurrent); + $timeOffsetTarget = $timezoneTarget->getOffset($localTimeTarget); + // Get the difference between the current users offset to GMT and then targets user to GMT + $timeOffset = $timeOffsetTarget - $timeOffsetCurrent; + if ($timeOffset === 0) { + // No offset means both users are in the same timezone + $timeOffsetString = $l->t('same time'); + } else { + // We need to cheat here as the offset could be up to 26h we can not use formatTime. + $hours = abs((int)($timeOffset / 3600)); + $minutes = abs(($timeOffset / 60) % 60); + // TRANSLATORS %n hours in a short form + $hoursString = $l->n('%nh', '%nh', $hours); + // TRANSLATORS %n minutes in a short form + $minutesString = $l->n('%nm', '%nm', $minutes); + + $timeOffsetString = ($hours > 0 ? $hoursString : '') . ($minutes > 0 ? $minutesString : ''); + + if ($timeOffset > 0) { + // TRANSLATORS meaning the user is %s time ahead - like 1h30m + $timeOffsetString = $l->t('%s ahead', [$timeOffsetString]); + } else { + // TRANSLATORS meaning the user is %s time behind - like 1h30m + $timeOffsetString = $l->t('%s behind', [$timeOffsetString]); + } + } + $profileActionText = "{$localTimeString} • {$timeOffsetString}"; + } else { + $profileActionText = $l->t('Local time: %s', [$localTimeString]); + } + + $iconUrl = $this->urlGenerator->getAbsoluteURL($this->urlGenerator->imagePath('core', 'actions/recent.svg')); + $action = $this->actionFactory->newLinkAction($iconUrl, $profileActionText, '#', 'timezone'); + // Order after the profile page + $action->setPriority(19); + $entry->addAction($action); + } + } +} diff --git a/lib/private/Contacts/ContactsMenu/Providers/ProfileProvider.php b/lib/private/Contacts/ContactsMenu/Providers/ProfileProvider.php index e654319c3fa..d00573aaa96 100644 --- a/lib/private/Contacts/ContactsMenu/Providers/ProfileProvider.php +++ b/lib/private/Contacts/ContactsMenu/Providers/ProfileProvider.php @@ -1,25 +1,8 @@ <?php /** - * @copyright 2017 Christoph Wurst <christoph@winzerhof-wurst.at> - * - * @author Christoph Wurst <christoph@winzerhof-wurst.at> - * - * @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/>. - * + * SPDX-FileCopyrightText: 2017 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later */ namespace OC\Contacts\ContactsMenu\Providers; @@ -33,54 +16,23 @@ use OCP\IUserManager; use OCP\L10N\IFactory as IL10NFactory; class ProfileProvider implements IProvider { - - /** @var IActionFactory */ - private $actionFactory; - - /** @var ProfileManager */ - private $profileManager; - - /** @var IL10NFactory */ - private $l10nFactory; - - /** @var IURLGenerator */ - private $urlGenerator; - - /** @var IUserManager */ - private $userManager; - - /** - * @param IActionFactory $actionFactory - * @param ProfileManager $profileManager - * @param IL10NFactory $l10nFactory - * @param IURLGenerator $urlGenerator - * @param IUserManager $userManager - */ public function __construct( - IActionFactory $actionFactory, - ProfileManager $profileManager, - IL10NFactory $l10nFactory, - IURLGenerator $urlGenerator, - IUserManager $userManager + private IActionFactory $actionFactory, + private ProfileManager $profileManager, + private IL10NFactory $l10nFactory, + private IURLGenerator $urlGenerator, + private IUserManager $userManager, ) { - $this->actionFactory = $actionFactory; - $this->profileManager = $profileManager; - $this->l10nFactory = $l10nFactory; - $this->urlGenerator = $urlGenerator; - $this->userManager = $userManager; } - /** - * @param IEntry $entry - */ - public function process(IEntry $entry) { + public function process(IEntry $entry): void { $targetUserId = $entry->getProperty('UID'); $targetUser = $this->userManager->get($targetUserId); if (!empty($targetUser)) { if ($this->profileManager->isProfileEnabled($targetUser)) { $iconUrl = $this->urlGenerator->getAbsoluteURL($this->urlGenerator->imagePath('core', 'actions/profile.svg')); $profileActionText = $this->l10nFactory->get('lib')->t('View profile'); - $profileUrl = $this->urlGenerator->linkToRouteAbsolute('core.ProfilePage.index', ['targetUserId' => $targetUserId]); + $profileUrl = $this->urlGenerator->linkToRouteAbsolute('profile.ProfilePage.index', ['targetUserId' => $targetUserId]); $action = $this->actionFactory->newLinkAction($iconUrl, $profileActionText, $profileUrl, 'profile'); // Set highest priority (by descending order), other actions have the default priority 10 as defined in lib/private/Contacts/ContactsMenu/Actions/LinkAction.php $action->setPriority(20); |