From 5c2ec584400207308241f4e64bf1b2c563c7340a Mon Sep 17 00:00:00 2001 From: Joas Schilling <coding@schilljs.com> Date: Thu, 24 Nov 2016 15:46:38 +0100 Subject: Move ShareByMail activities to new API Signed-off-by: Joas Schilling <coding@schilljs.com> --- apps/sharebymail/appinfo/app.php | 7 - apps/sharebymail/appinfo/info.xml | 6 + apps/sharebymail/lib/Activity.php | 336 +++++++++++++++++--------------------- 3 files changed, 154 insertions(+), 195 deletions(-) (limited to 'apps') diff --git a/apps/sharebymail/appinfo/app.php b/apps/sharebymail/appinfo/app.php index 0723b2dcc5f..5ef7b6f18cb 100644 --- a/apps/sharebymail/appinfo/app.php +++ b/apps/sharebymail/appinfo/app.php @@ -22,10 +22,3 @@ $settings = new \OCA\ShareByMail\Settings(); \OCP\Util::connectHook('\OCP\Config', 'js', $settings, 'announceShareProvider'); - -\OC::$server->getActivityManager()->registerExtension(function() { - return new \OCA\ShareByMail\Activity( - \OC::$server->query('L10NFactory'), - \OC::$server->getActivityManager() - ); -}); diff --git a/apps/sharebymail/appinfo/info.xml b/apps/sharebymail/appinfo/info.xml index 6c4882d349f..1b3aa01bc67 100644 --- a/apps/sharebymail/appinfo/info.xml +++ b/apps/sharebymail/appinfo/info.xml @@ -12,4 +12,10 @@ <nextcloud min-version="11" max-version="11" /> </dependencies> <default_enable/> + + <activity> + <providers> + <provider>OCA\ShareByMail\Activity</provider> + </providers> + </activity> </info> diff --git a/apps/sharebymail/lib/Activity.php b/apps/sharebymail/lib/Activity.php index 0b73d73c04c..d80c49fc375 100644 --- a/apps/sharebymail/lib/Activity.php +++ b/apps/sharebymail/lib/Activity.php @@ -1,6 +1,6 @@ <?php /** - * @copyright Copyright (c) 2016 Bjoern Schiessle <bjoern@schiessle.org> + * @copyright Copyright (c) 2016 Joas Schilling <coding@schilljs.com> * * @license GNU AGPL version 3 or any later version * @@ -19,251 +19,211 @@ * */ - namespace OCA\ShareByMail; - -use OCP\Activity\IExtension; +use OCP\Activity\IEvent; use OCP\Activity\IManager; +use OCP\Activity\IProvider; use OCP\IL10N; -use OCP\L10N\IFactory; - -class Activity implements IExtension { +use OCP\IURLGenerator; +use OCP\IUser; +use OCP\IUserManager; - const SHARE_BY_MAIL_APP = 'sharebymail'; +class Activity implements IProvider { - const SUBJECT_SHARED_EMAIL_SELF = 'shared_with_email_self'; - const SUBJECT_SHARED_EMAIL_BY = 'shared_with_email_by'; + /** @var IL10N */ + protected $l; - /** @var IFactory */ - private $languageFactory; + /** @var IURLGenerator */ + protected $url; /** @var IManager */ - private $activityManager; + protected $activityManager; - /** - * @param IFactory $languageFactory - * @param IManager $activityManager - */ - public function __construct(IFactory $languageFactory, IManager $activityManager) { - $this->languageFactory = $languageFactory; - $this->activityManager = $activityManager; - } + /** @var IUserManager */ + protected $userManager; - /** - * The extension can return an array of additional notification types. - * If no additional types are to be added false is to be returned - * - * @param string $languageCode - * @return array|false Array "stringID of the type" => "translated string description for the setting" - * or Array "stringID of the type" => [ - * 'desc' => "translated string description for the setting" - * 'methods' => [self::METHOD_*], - * ] - * @since 8.0.0 - 8.2.0: Added support to allow limiting notifications to certain methods - */ - public function getNotificationTypes($languageCode) { - return false; - } + /** @var array */ + protected $displayNames = []; - /** - * For a given method additional types to be displayed in the settings can be returned. - * In case no additional types are to be added false is to be returned. - * - * @param string $method - * @return array|false - * @since 8.0.0 - */ - public function getDefaultTypes($method) { - return false; - } + const SUBJECT_SHARED_EMAIL_SELF = 'shared_with_email_self'; + const SUBJECT_SHARED_EMAIL_BY = 'shared_with_email_by'; /** - * A string naming the css class for the icon to be used can be returned. - * If no icon is known for the given type false is to be returned. - * - * @param string $type - * @return string|false - * @since 8.0.0 + * @param IL10N $l + * @param IURLGenerator $url + * @param IManager $activityManager + * @param IUserManager $userManager */ - public function getTypeIcon($type) { - return false; + public function __construct(IL10N $l, IURLGenerator $url, IManager $activityManager, IUserManager $userManager) { + $this->l = $l; + $this->url = $url; + $this->activityManager = $activityManager; + $this->userManager = $userManager; } /** - * The extension can translate a given message to the requested languages. - * If no translation is available false is to be returned. - * - * @param string $app - * @param string $text - * @param array $params - * @param boolean $stripPath - * @param boolean $highlightParams - * @param string $languageCode - * @return string|false - * @since 8.0.0 + * @param IEvent $event + * @param IEvent|null $previousEvent + * @return IEvent + * @throws \InvalidArgumentException + * @since 11.0.0 */ - public function translate($app, $text, $params, $stripPath, $highlightParams, $languageCode) { - if ($app !== self::SHARE_BY_MAIL_APP) { - return false; + public function parse(IEvent $event, IEvent $previousEvent = null) { + if ($event->getApp() !== 'sharebymail') { + throw new \InvalidArgumentException(); } - $l = $this->getL10N($languageCode); - if ($this->activityManager->isFormattingFilteredObject()) { - $translation = $this->translateShort($text, $l, $params); - if ($translation !== false) { - return $translation; + try { + return $this->parseShortVersion($event); + } catch (\InvalidArgumentException $e) { + // Ignore and simply use the long version... } } - return $this->translateLong($text, $l, $params); + return $this->parseLongVersion($event); } - /** - * The extension can define the type of parameters for translation - * - * Currently known types are: - * * file => will strip away the path of the file and add a tooltip with it - * * username => will add the avatar of the user - * - * @param string $app - * @param string $text - * @return array|false - * @since 8.0.0 + * @param IEvent $event + * @return IEvent + * @throws \InvalidArgumentException + * @since 11.0.0 */ - public function getSpecialParameterList($app, $text) { - if ($app === self::SHARE_BY_MAIL_APP) { - switch ($text) { - case self::SUBJECT_SHARED_EMAIL_BY: - return [ - 0 => 'file', - 1 => 'email', - 2 => 'user', - ]; - case self::SUBJECT_SHARED_EMAIL_SELF: - return [ - 0 => 'file', - 1 => 'email', - ]; - } + public function parseShortVersion(IEvent $event) { + $parsedParameters = $this->getParsedParameters($event); + + if ($event->getSubject() === self::SUBJECT_SHARED_EMAIL_SELF) { + $event->setParsedSubject($this->l->t('Shared with %1$s', [ + $parsedParameters['email']['name'], + ])) + ->setRichSubject($this->l->t('Shared with {email}'), [ + 'email' => $parsedParameters['email'], + ]) + ->setIcon($this->url->getAbsoluteURL($this->url->imagePath('core', 'actions/share.svg'))); + } else if ($event->getSubject() === self::SUBJECT_SHARED_EMAIL_BY) { + $event->setParsedSubject($this->l->t('Shared with %1$s by %2$s', [ + $parsedParameters['email']['name'], + $parsedParameters['actor']['name'], + ])) + ->setRichSubject($this->l->t('Shared with {email} by {actor}'), [ + 'email' => $parsedParameters['email'], + 'actor' => $parsedParameters['actor'], + ]) + ->setIcon($this->url->getAbsoluteURL($this->url->imagePath('core', 'actions/share.svg'))); + + } else { + throw new \InvalidArgumentException(); } - return false; + return $event; } /** - * The extension can define the parameter grouping by returning the index as integer. - * In case no grouping is required false is to be returned. - * - * @param array $activity - * @return integer|false - * @since 8.0.0 + * @param IEvent $event + * @return IEvent + * @throws \InvalidArgumentException + * @since 11.0.0 */ - public function getGroupParameter($activity) { - if ($activity['app'] === self::SHARE_BY_MAIL_APP) { - switch ($activity['subject']) { - case self::SUBJECT_SHARED_EMAIL_BY: - // Group by file name - return 1; - case self::SUBJECT_SHARED_EMAIL_SELF: - // Group by user/group - return 1; - } + public function parseLongVersion(IEvent $event) { + $parsedParameters = $this->getParsedParameters($event); + + if ($event->getSubject() === self::SUBJECT_SHARED_EMAIL_SELF) { + $event->setParsedSubject($this->l->t('You shared %1$s with %2$s by mail', [ + $parsedParameters['file']['path'], + $parsedParameters['email']['name'], + ])) + ->setRichSubject($this->l->t('You shared {file} with {email} by mail'), $parsedParameters) + ->setIcon($this->url->getAbsoluteURL($this->url->imagePath('core', 'actions/share.svg'))); + } else if ($event->getSubject() === self::SUBJECT_SHARED_EMAIL_BY) { + $event->setParsedSubject($this->l->t('%3$s shared %1$s with %2$s by mail', [ + $parsedParameters['file']['path'], + $parsedParameters['email']['name'], + $parsedParameters['actor']['name'], + ])) + ->setRichSubject($this->l->t('{actor} shared {file} with {email} by mail'), $parsedParameters) + ->setIcon($this->url->getAbsoluteURL($this->url->imagePath('core', 'actions/share.svg'))); + } else { + throw new \InvalidArgumentException(); } - return false; - + return $event; } - /** - * The extension can define additional navigation entries. The array returned has to contain two keys 'top' - * and 'apps' which hold arrays with the relevant entries. - * If no further entries are to be added false is no be returned. - * - * @return array|false - * @since 8.0.0 - */ - public function getNavigation() { - return false; - } + protected function getParsedParameters(IEvent $event) { + $subject = $event->getSubject(); + $parameters = $event->getSubjectParameters(); - /** - * The extension can check if a customer filter (given by a query string like filter=abc) is valid or not. - * - * @param string $filterValue - * @return boolean - * @since 8.0.0 - */ - public function isFilterValid($filterValue) { - return false; + switch ($subject) { + case self::SUBJECT_SHARED_EMAIL_BY: + return [ + 'file' => $this->generateFileParameter((int) $event->getObjectId(), $parameters[0]), + 'email' => $this->generateEmailParameter($parameters[1]), + ]; + case self::SUBJECT_SHARED_EMAIL_SELF: + return [ + 'file' => $this->generateFileParameter((int) $event->getObjectId(), $parameters[0]), + 'email' => $this->generateEmailParameter($parameters[1]), + 'actor' => $this->generateUserParameter($parameters[2]), + ]; + } + throw new \InvalidArgumentException(); } /** - * The extension can filter the types based on the filter if required. - * In case no filter is to be applied false is to be returned unchanged. - * - * @param array $types - * @param string $filter - * @return array|false - * @since 8.0.0 + * @param int $id + * @param string $path + * @return array */ - public function filterNotificationTypes($types, $filter) { - return false; + protected function generateFileParameter($id, $path) { + return [ + 'type' => 'file', + 'id' => $id, + 'name' => basename($path), + 'path' => $path, + 'link' => $this->url->linkToRouteAbsolute('files.viewcontroller.showFile', ['fileid' => $id]), + ]; } /** - * For a given filter the extension can specify the sql query conditions including parameters for that query. - * In case the extension does not know the filter false is to be returned. - * The query condition and the parameters are to be returned as array with two elements. - * E.g. return array('`app` = ? and `message` like ?', array('mail', 'ownCloud%')); - * - * @param string $filter - * @return array|false - * @since 8.0.0 + * @param string $email + * @return array */ - public function getQueryForFilter($filter) { - return false; - } - - protected function getL10N($languageCode = null) { - return $this->languageFactory->get(self::SHARE_BY_MAIL_APP, $languageCode); + protected function generateEmailParameter($email) { + return [ + 'type' => 'email', + 'id' => $email, + 'name' => $email, // TODO ask contacts + ]; } /** - * @param string $text - * @param IL10N $l - * @param array $params - * @return bool|string + * @param string $uid + * @return array */ - protected function translateLong($text, IL10N $l, array $params) { - - switch ($text) { - case self::SUBJECT_SHARED_EMAIL_SELF: - return (string) $l->t('You shared %1$s with %2$s by mail', $params); - case self::SUBJECT_SHARED_EMAIL_BY: - return (string) $l->t('%3$s shared %1$s with %2$s by mail', $params); + protected function generateUserParameter($uid) { + if (!isset($this->displayNames[$uid])) { + $this->displayNames[$uid] = $this->getDisplayName($uid); } - return false; + return [ + 'type' => 'user', + 'id' => $uid, + 'name' => $this->displayNames[$uid], + ]; } /** - * @param string $text - * @param IL10N $l - * @param array $params - * @return bool|string + * @param string $uid + * @return string */ - protected function translateShort($text, IL10N $l, array $params) { - switch ($text) { - case self::SUBJECT_SHARED_EMAIL_SELF: - return (string) $l->t('Shared with %2$s', $params); - case self::SUBJECT_SHARED_EMAIL_BY: - return (string) $l->t('Shared with %3$s by %2$s', $params); + protected function getDisplayName($uid) { + $user = $this->userManager->get($uid); + if ($user instanceof IUser) { + return $user->getDisplayName(); + } else { + return $uid; } - - return false; } - } -- cgit v1.2.3 From 719b1905d7e9dc76d5c31d72e56834e1eaab60b8 Mon Sep 17 00:00:00 2001 From: Joas Schilling <coding@schilljs.com> Date: Fri, 25 Nov 2016 11:17:06 +0100 Subject: Get user name from contacts if available Signed-off-by: Joas Schilling <coding@schilljs.com> --- apps/sharebymail/lib/Activity.php | 36 ++++++++++++++++++++++++++++++++++-- 1 file changed, 34 insertions(+), 2 deletions(-) (limited to 'apps') diff --git a/apps/sharebymail/lib/Activity.php b/apps/sharebymail/lib/Activity.php index d80c49fc375..c5d6632d186 100644 --- a/apps/sharebymail/lib/Activity.php +++ b/apps/sharebymail/lib/Activity.php @@ -24,6 +24,7 @@ namespace OCA\ShareByMail; use OCP\Activity\IEvent; use OCP\Activity\IManager; use OCP\Activity\IProvider; +use OCP\Contacts\IManager as IContactsManager; use OCP\IL10N; use OCP\IURLGenerator; use OCP\IUser; @@ -42,10 +43,15 @@ class Activity implements IProvider { /** @var IUserManager */ protected $userManager; + /** @var IContactsManager */ + protected $contactsManager; /** @var array */ protected $displayNames = []; + /** @var array */ + protected $contactNames = []; + const SUBJECT_SHARED_EMAIL_SELF = 'shared_with_email_self'; const SUBJECT_SHARED_EMAIL_BY = 'shared_with_email_by'; @@ -54,12 +60,14 @@ class Activity implements IProvider { * @param IURLGenerator $url * @param IManager $activityManager * @param IUserManager $userManager + * @param IContactsManager $contactsManager */ - public function __construct(IL10N $l, IURLGenerator $url, IManager $activityManager, IUserManager $userManager) { + public function __construct(IL10N $l, IURLGenerator $url, IManager $activityManager, IUserManager $userManager, IContactsManager $contactsManager) { $this->l = $l; $this->url = $url; $this->activityManager = $activityManager; $this->userManager = $userManager; + $this->contactsManager = $contactsManager; } /** @@ -191,10 +199,14 @@ class Activity implements IProvider { * @return array */ protected function generateEmailParameter($email) { + if (!isset($this->contactNames[$email])) { + $this->contactNames[$email] = $this->getContactName($email); + } + return [ 'type' => 'email', 'id' => $email, - 'name' => $email, // TODO ask contacts + 'name' => $this->contactNames[$email], ]; } @@ -214,6 +226,26 @@ class Activity implements IProvider { ]; } + /** + * @param string $email + * @return string + */ + protected function getContactName($email) { + $addressBookContacts = $this->contactsManager->search($email, ['EMAIL']); + + foreach ($addressBookContacts as $contact) { + if (isset($contact['isLocalSystemBook'])) { + continue; + } + + if (in_array($email, $contact['EMAIL'])) { + return $contact['FN']; + } + } + + return $email; + } + /** * @param string $uid * @return string -- cgit v1.2.3 From 9f915e061c025df983d5385ae4e4e9d3780c3354 Mon Sep 17 00:00:00 2001 From: Joas Schilling <coding@schilljs.com> Date: Fri, 25 Nov 2016 11:17:40 +0100 Subject: Remove old test Signed-off-by: Joas Schilling <coding@schilljs.com> --- apps/sharebymail/tests/ActivityTest.php | 68 --------------------------------- 1 file changed, 68 deletions(-) delete mode 100644 apps/sharebymail/tests/ActivityTest.php (limited to 'apps') diff --git a/apps/sharebymail/tests/ActivityTest.php b/apps/sharebymail/tests/ActivityTest.php deleted file mode 100644 index 9bc8c827da9..00000000000 --- a/apps/sharebymail/tests/ActivityTest.php +++ /dev/null @@ -1,68 +0,0 @@ -<?php -/** - * @copyright Copyright (c) 2016 Bjoern Schiessle <bjoern@schiessle.org> - * - * @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 OCA\ShareByMail\Tests; - - -use OCA\ShareByMail\Activity; - -class ActivityTest extends \Test\TestCase { - - /** - * @var \OCA\ShareByMail\Activity - */ - private $activity; - - protected function setUp() { - parent::setUp(); - $this->activity = new Activity( - $this->getMockBuilder('OCP\L10N\IFactory') - ->disableOriginalConstructor() - ->getMock(), - $this->getMockBuilder('OCP\Activity\IManager') - ->disableOriginalConstructor() - ->getMock() - ); - } - - /** - * @dataProvider dataTestGetSpecialParameterList - * - */ - public function testGetSpecialParameterList($app, $text, $expected) { - $result = $this->activity->getSpecialParameterList($app, $text); - $this->assertSame($expected, $result); - } - - public function dataTestGetSpecialParameterList() { - return [ - ['sharebymail', Activity::SUBJECT_SHARED_EMAIL_SELF, [0 => 'file', 1 => 'email']], - ['sharebymail', Activity::SUBJECT_SHARED_EMAIL_BY, [0 => 'file', 1 => 'email', 2 => 'user']], - ['sharebymail', 'unknown', false], - ['randomApp', Activity::SUBJECT_SHARED_EMAIL_SELF, false], - ['randomApp', Activity::SUBJECT_SHARED_EMAIL_BY, false], - - ]; - } - -} - -- cgit v1.2.3 From f067d0ee66fd6fab61fa11bc307c78d45c6a5803 Mon Sep 17 00:00:00 2001 From: Joas Schilling <coding@schilljs.com> Date: Fri, 25 Nov 2016 11:45:40 +0100 Subject: Correctly match the subjects to the parameters Signed-off-by: Joas Schilling <coding@schilljs.com> --- apps/sharebymail/lib/Activity.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'apps') diff --git a/apps/sharebymail/lib/Activity.php b/apps/sharebymail/lib/Activity.php index c5d6632d186..58ab0a5cdcd 100644 --- a/apps/sharebymail/lib/Activity.php +++ b/apps/sharebymail/lib/Activity.php @@ -164,12 +164,12 @@ class Activity implements IProvider { $parameters = $event->getSubjectParameters(); switch ($subject) { - case self::SUBJECT_SHARED_EMAIL_BY: + case self::SUBJECT_SHARED_EMAIL_SELF: return [ 'file' => $this->generateFileParameter((int) $event->getObjectId(), $parameters[0]), 'email' => $this->generateEmailParameter($parameters[1]), ]; - case self::SUBJECT_SHARED_EMAIL_SELF: + case self::SUBJECT_SHARED_EMAIL_BY: return [ 'file' => $this->generateFileParameter((int) $event->getObjectId(), $parameters[0]), 'email' => $this->generateEmailParameter($parameters[1]), -- cgit v1.2.3