diff options
-rw-r--r-- | lib/private/activitymanager.php | 108 | ||||
-rw-r--r-- | lib/public/activity/iextension.php | 38 | ||||
-rw-r--r-- | lib/public/activity/imanager.php | 24 | ||||
-rw-r--r-- | tests/lib/activitymanager.php | 88 |
4 files changed, 151 insertions, 107 deletions
diff --git a/lib/private/activitymanager.php b/lib/private/activitymanager.php index 30a54fa009c..c4759120a39 100644 --- a/lib/private/activitymanager.php +++ b/lib/private/activitymanager.php @@ -40,6 +40,19 @@ class ActivityManager implements IManager { */ private $extensions = array(); + /** @var array list of filters "name" => "is valid" */ + protected $validFilters = array( + 'all' => true, + 'by' => true, + 'self' => true, + ); + + /** @var array list of type icons "type" => "css class" */ + protected $typeIcons = array(); + + /** @var array list of special parameters "app" => ["text" => ["parameter" => "type"]] */ + protected $specialParameters = array(); + /** * @param $app * @param $subject @@ -124,39 +137,45 @@ class ActivityManager implements IManager { } /** - * @param array $types - * @param string $filter + * @param string $method * @return array */ - function filterNotificationTypes($types, $filter) { + function getDefaultTypes($method) { + $defaultTypes = array(); foreach($this->extensions as $extension) { $c = $extension(); if ($c instanceof IExtension) { - $result = $c->filterNotificationTypes($types, $filter); - if (is_array($result)) { - $types = $result; + $types = $c->getDefaultTypes($method); + if (is_array($types)) { + $defaultTypes = array_merge($types, $defaultTypes); } } } - return $types; + return $defaultTypes; } /** - * @param string $method - * @return array + * @param string $type + * @return string */ - function getDefaultTypes($method) { - $defaultTypes = array(); + function getTypeIcon($type) { + if (isset($this->typeIcons[$type])) { + return $this->typeIcons[$type]; + } + foreach($this->extensions as $extension) { $c = $extension(); if ($c instanceof IExtension) { - $types = $c->getDefaultTypes($method); - if (is_array($types)) { - $defaultTypes = array_merge($types, $defaultTypes); + $icon = $c->getTypeIcon($type); + if (is_string($icon)) { + $this->typeIcons[$type] = $icon; + return $icon; } } } - return $defaultTypes; + + $this->typeIcons[$type] = ''; + return ''; } /** @@ -188,38 +207,30 @@ class ActivityManager implements IManager { * @return array|false */ function getSpecialParameterList($app, $text) { + if (isset($this->specialParameters[$app][$text])) { + return $this->specialParameters[$app][$text]; + } + + if (!isset($this->specialParameters[$app])) { + $this->specialParameters[$app] = array(); + } + foreach($this->extensions as $extension) { $c = $extension(); if ($c instanceof IExtension) { $specialParameter = $c->getSpecialParameterList($app, $text); if (is_array($specialParameter)) { + $this->specialParameters[$app][$text] = $specialParameter; return $specialParameter; } } } + $this->specialParameters[$app][$text] = false; return false; } /** - * @param string $type - * @return string - */ - function getTypeIcon($type) { - foreach($this->extensions as $extension) { - $c = $extension(); - if ($c instanceof IExtension) { - $icon = $c->getTypeIcon($type); - if (is_string($icon)) { - return $icon; - } - } - } - - return ''; - } - - /** * @param array $activity * @return integer|false */ @@ -264,23 +275,54 @@ class ActivityManager implements IManager { * @return boolean */ function isFilterValid($filterValue) { + if (isset($this->validFilters[$filterValue])) { + return $this->validFilters[$filterValue]; + } + foreach($this->extensions as $extension) { $c = $extension(); if ($c instanceof IExtension) { if ($c->isFilterValid($filterValue) === true) { + $this->validFilters[$filterValue] = true; return true; } } } + $this->validFilters[$filterValue] = false; return false; } /** + * @param array $types + * @param string $filter + * @return array + */ + function filterNotificationTypes($types, $filter) { + if (!$this->isFilterValid($filter)) { + return $types; + } + + foreach($this->extensions as $extension) { + $c = $extension(); + if ($c instanceof IExtension) { + $result = $c->filterNotificationTypes($types, $filter); + if (is_array($result)) { + $types = $result; + } + } + } + return $types; + } + + /** * @param string $filter * @return array */ function getQueryForFilter($filter) { + if (!$this->isFilterValid($filter)) { + return [null, null]; + } $conditions = array(); $parameters = array(); diff --git a/lib/public/activity/iextension.php b/lib/public/activity/iextension.php index b85532ded1f..643ea11cffa 100644 --- a/lib/public/activity/iextension.php +++ b/lib/public/activity/iextension.php @@ -42,16 +42,6 @@ interface IExtension { public function getNotificationTypes($languageCode); /** - * 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 - */ - public function filterNotificationTypes($types, $filter); - - /** * 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. * @@ -61,6 +51,15 @@ interface IExtension { public function getDefaultTypes($method); /** + * 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 + */ + public function getTypeIcon($type); + + /** * The extension can translate a given message to the requested languages. * If no translation is available false is to be returned. * @@ -88,15 +87,6 @@ interface IExtension { public function getSpecialParameterList($app, $text); /** - * 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 - */ - public function getTypeIcon($type); - - /** * The extension can define the parameter grouping by returning the index as integer. * In case no grouping is required false is to be returned. * @@ -123,6 +113,16 @@ interface IExtension { public function isFilterValid($filterValue); /** + * 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 + */ + public function filterNotificationTypes($types, $filter); + + /** * 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. diff --git a/lib/public/activity/imanager.php b/lib/public/activity/imanager.php index ded17336ed8..bc320a0f8b4 100644 --- a/lib/public/activity/imanager.php +++ b/lib/public/activity/imanager.php @@ -72,17 +72,16 @@ interface IManager { function getNotificationTypes($languageCode); /** - * @param array $types - * @param string $filter + * @param string $method * @return array */ - function filterNotificationTypes($types, $filter); + function getDefaultTypes($method); /** - * @param string $method - * @return array + * @param string $type + * @return string */ - function getDefaultTypes($method); + function getTypeIcon($type); /** * @param string $app @@ -103,12 +102,6 @@ interface IManager { function getSpecialParameterList($app, $text); /** - * @param string $type - * @return string - */ - function getTypeIcon($type); - - /** * @param array $activity * @return integer|false */ @@ -126,6 +119,13 @@ interface IManager { function isFilterValid($filterValue); /** + * @param array $types + * @param string $filter + * @return array + */ + function filterNotificationTypes($types, $filter); + + /** * @param string $filter * @return array */ diff --git a/tests/lib/activitymanager.php b/tests/lib/activitymanager.php index 6a5af7b259b..d227c05d827 100644 --- a/tests/lib/activitymanager.php +++ b/tests/lib/activitymanager.php @@ -31,16 +31,6 @@ class Test_ActivityManager extends \Test\TestCase { $this->assertEquals(2, sizeof($result)); } - public function testFilterNotificationTypes() { - $result = $this->activityManager->filterNotificationTypes(array('NT0', 'NT1', 'NT2', 'NT3'), 'FILTER1'); - $this->assertTrue(is_array($result)); - $this->assertEquals(3, sizeof($result)); - - $result = $this->activityManager->filterNotificationTypes(array('NT0', 'NT1', 'NT2', 'NT3'), 'FILTER2'); - $this->assertTrue(is_array($result)); - $this->assertEquals(4, sizeof($result)); - } - public function testDefaultTypes() { $result = $this->activityManager->getDefaultTypes('stream'); $this->assertTrue(is_array($result)); @@ -51,6 +41,14 @@ class Test_ActivityManager extends \Test\TestCase { $this->assertEquals(0, sizeof($result)); } + public function testTypeIcon() { + $result = $this->activityManager->getTypeIcon('NT1'); + $this->assertEquals('icon-nt-one', $result); + + $result = $this->activityManager->getTypeIcon('NT2'); + $this->assertEquals('', $result); + } + public function testTranslate() { $result = $this->activityManager->translate('APP0', '', '', array(), false, false, 'en'); $this->assertEquals('Stupid translation', $result); @@ -67,14 +65,6 @@ class Test_ActivityManager extends \Test\TestCase { $this->assertFalse($result); } - public function testTypeIcon() { - $result = $this->activityManager->getTypeIcon('NT1'); - $this->assertEquals('icon-nt-one', $result); - - $result = $this->activityManager->getTypeIcon('NT2'); - $this->assertEquals('', $result); - } - public function testGroupParameter() { $result = $this->activityManager->getGroupParameter(array()); $this->assertEquals(5, $result); @@ -90,15 +80,27 @@ class Test_ActivityManager extends \Test\TestCase { $result = $this->activityManager->isFilterValid('fv01'); $this->assertTrue($result); - $result = $this->activityManager->isFilterValid('FV2'); + $result = $this->activityManager->isFilterValid('InvalidFilter'); $this->assertFalse($result); } + public function testFilterNotificationTypes() { + $result = $this->activityManager->filterNotificationTypes(array('NT0', 'NT1', 'NT2', 'NT3'), 'fv01'); + $this->assertTrue(is_array($result)); + $this->assertEquals(3, sizeof($result)); + + $result = $this->activityManager->filterNotificationTypes(array('NT0', 'NT1', 'NT2', 'NT3'), 'InvalidFilter'); + $this->assertTrue(is_array($result)); + $this->assertEquals(4, sizeof($result)); + } + public function testQueryForFilter() { + // Register twice, to test the created sql part $this->activityManager->registerExtension(function() { return new SimpleExtension(); }); - $result = $this->activityManager->getQueryForFilter('filter1'); + + $result = $this->activityManager->getQueryForFilter('fv01'); $this->assertEquals( array( ' and ((`app` = ? and `message` like ?) or (`app` = ? and `message` like ?))', @@ -106,8 +108,8 @@ class Test_ActivityManager extends \Test\TestCase { ), $result ); - $result = $this->activityManager->isFilterValid('filter2'); - $this->assertFalse($result); + $result = $this->activityManager->getQueryForFilter('InvalidFilter'); + $this->assertEquals(array(null, null), $result); } } @@ -117,13 +119,6 @@ class SimpleExtension implements \OCP\Activity\IExtension { return array('NT1', 'NT2'); } - public function filterNotificationTypes($types, $filter) { - if ($filter === 'FILTER1') { - unset($types[0]); - } - return $types; - } - public function getDefaultTypes($method) { if ($method === 'stream') { return array('DT0'); @@ -132,6 +127,13 @@ class SimpleExtension implements \OCP\Activity\IExtension { return array(); } + public function getTypeIcon($type) { + if ($type === 'NT1') { + return 'icon-nt-one'; + } + return ''; + } + public function translate($app, $text, $params, $stripPath, $highlightParams, $languageCode) { if ($app === 'APP0') { return "Stupid translation"; @@ -148,13 +150,6 @@ class SimpleExtension implements \OCP\Activity\IExtension { return false; } - public function getTypeIcon($type) { - if ($type === 'NT1') { - return 'icon-nt-one'; - } - return ''; - } - public function getGroupParameter($activity) { return 5; } @@ -174,8 +169,15 @@ class SimpleExtension implements \OCP\Activity\IExtension { return false; } + public function filterNotificationTypes($types, $filter) { + if ($filter === 'fv01') { + unset($types[0]); + } + return $types; + } + public function getQueryForFilter($filter) { - if ($filter === 'filter1') { + if ($filter === 'fv01') { return array('`app` = ? and `message` like ?', array('mail', 'ownCloud%')); } @@ -189,11 +191,11 @@ class NoOpExtension implements \OCP\Activity\IExtension { return false; } - public function filterNotificationTypes($types, $filter) { + public function getDefaultTypes($method) { return false; } - public function getDefaultTypes($method) { + public function getTypeIcon($type) { return false; } @@ -205,10 +207,6 @@ class NoOpExtension implements \OCP\Activity\IExtension { return false; } - public function getTypeIcon($type) { - return false; - } - public function getGroupParameter($activity) { return false; } @@ -221,6 +219,10 @@ class NoOpExtension implements \OCP\Activity\IExtension { return false; } + public function filterNotificationTypes($types, $filter) { + return false; + } + public function getQueryForFilter($filter) { return false; } |