diff --git a/lib/private/notification/action.php b/lib/private/notification/action.php index 6de8a1a4bbc380d6471a87c4206acdfe8d4d0695..958b085b38e8a0df99d4bcf25418d67adb5b9609 100644 --- a/lib/private/notification/action.php +++ b/lib/private/notification/action.php @@ -39,6 +39,9 @@ class Action implements IAction { /** @var string */ protected $icon; + /** @var bool */ + protected $primary; + /** * Constructor */ @@ -94,6 +97,27 @@ class Action implements IAction { return $this->labelParsed; } + /** + * @param $primary bool + * @throws \InvalidArgumentException if $primary is invalid + * @since 9.0.0 + */ + public function setPrimary($primary) { + if (!is_bool($primary)) { + throw new \InvalidArgumentException('The given primary option is invalid'); + } + + $this->primary = $primary; + } + + /** + * @return bool + * @since 9.0.0 + */ + public function isPrimary() { + return $this->primary; + } + /** * @param string $link * @param string $requestType @@ -129,28 +153,6 @@ class Action implements IAction { return $this->requestType; } - /** - * @param string $icon - * @return $this - * @throws \InvalidArgumentException if the icon is invalid - * @since 8.2.0 - */ - public function setIcon($icon) { - if (!is_string($icon) || $icon === '' || isset($icon[64])) { - throw new \InvalidArgumentException('The given icon is invalid'); - } - $this->icon = $icon; - return $this; - } - - /** - * @return string - * @since 8.2.0 - */ - public function getIcon() { - return $this->icon; - } - /** * @return bool */ diff --git a/lib/private/notification/iaction.php b/lib/private/notification/iaction.php index da6728f5c525daf9dfc133757573f933bf7a5fe4..4aed2e9251761dd685e65ee8ee6db48eac9e8227 100644 --- a/lib/private/notification/iaction.php +++ b/lib/private/notification/iaction.php @@ -60,6 +60,19 @@ interface IAction { */ public function getParsedLabel(); + /** + * @param $primary bool + * @throws \InvalidArgumentException if $primary is invalid + * @since 9.0.0 + */ + public function setPrimary($primary); + + /** + * @return bool + * @since 9.0.0 + */ + public function isPrimary(); + /** * @param string $link * @param string $requestType @@ -81,20 +94,6 @@ interface IAction { */ public function getRequestType(); - /** - * @param string $icon - * @return $this - * @throws \InvalidArgumentException if the icon is invalid - * @since 8.2.0 - */ - public function setIcon($icon); - - /** - * @return string - * @since 8.2.0 - */ - public function getIcon(); - /** * @return bool * @since 8.2.0 diff --git a/lib/private/notification/inotification.php b/lib/private/notification/inotification.php index faf5db1d24c75a111f06f4eef0f577e2db8790b7..a8bf5b110ab77ccafa40bebe5cf02733d435a7a5 100644 --- a/lib/private/notification/inotification.php +++ b/lib/private/notification/inotification.php @@ -179,20 +179,6 @@ interface INotification { */ public function getLink(); - /** - * @param string $icon - * @return $this - * @throws \InvalidArgumentException if the icon are invalid - * @since 8.2.0 - */ - public function setIcon($icon); - - /** - * @return string - * @since 8.2.0 - */ - public function getIcon(); - /** * @return IAction * @since 8.2.0 diff --git a/lib/private/notification/notification.php b/lib/private/notification/notification.php index 40fe39a956eadd93ef6d2062de6525dfc0f78ab5..01df659d4a17b946a7123a3499c48347fcb9834c 100644 --- a/lib/private/notification/notification.php +++ b/lib/private/notification/notification.php @@ -68,6 +68,12 @@ class Notification implements INotification { /** @var array */ protected $actionsParsed; + /** @var bool */ + protected $hasPrimaryAction; + + /** @var bool */ + protected $hasPrimaryParsedAction; + /** * Constructor */ @@ -329,28 +335,6 @@ class Notification implements INotification { return $this->link; } - /** - * @param string $icon - * @return $this - * @throws \InvalidArgumentException if the icon are invalid - * @since 8.2.0 - */ - public function setIcon($icon) { - if (!is_string($icon) || $icon === '' || isset($icon[64])) { - throw new \InvalidArgumentException('The given icon is invalid'); - } - $this->icon = $icon; - return $this; - } - - /** - * @return string - * @since 8.2.0 - */ - public function getIcon() { - return $this->icon; - } - /** * @return IAction * @since 8.2.0 @@ -369,6 +353,15 @@ class Notification implements INotification { if (!$action->isValid()) { throw new \InvalidArgumentException('The given action is invalid'); } + + if ($action->isPrimary()) { + if ($this->hasPrimaryAction) { + throw new \InvalidArgumentException('The notification already has a primary action'); + } + + $this->hasPrimaryAction = true; + } + $this->actions[] = $action; return $this; } @@ -391,6 +384,15 @@ class Notification implements INotification { if (!$action->isValidParsed()) { throw new \InvalidArgumentException('The given parsed action is invalid'); } + + if ($action->isPrimary()) { + if ($this->hasPrimaryParsedAction) { + throw new \InvalidArgumentException('The notification already has a primary action'); + } + + $this->hasPrimaryParsedAction = true; + } + $this->actionsParsed[] = $action; return $this; } diff --git a/tests/lib/notification/actiontest.php b/tests/lib/notification/actiontest.php index e319c250cc77ae23d7b0a2bf898b138f0c1680dc..a6157d6c56e42699d108f997417721cf38e002be 100644 --- a/tests/lib/notification/actiontest.php +++ b/tests/lib/notification/actiontest.php @@ -171,47 +171,6 @@ class ActionTest extends TestCase { $this->action->setLink($link, $type); } - public function dataSetIcon() { - return [ - ['test1'], - [str_repeat('a', 1)], - [str_repeat('a', 64)], - ]; - } - - /** - * @dataProvider dataSetIcon - * @param string $icon - */ - public function testSetIcon($icon) { - $this->assertSame('', $this->action->getIcon()); - $this->action->setIcon($icon); - $this->assertSame($icon, $this->action->getIcon()); - } - - public function dataSetIconInvalid() { - return [ - [true], - [false], - [0], - [1], - [''], - [str_repeat('a', 65)], - [[]], - [[str_repeat('a', 65)]], - ]; - } - - /** - * @dataProvider dataSetIconInvalid - * @param string $icon - * - * @expectedException \InvalidArgumentException - */ - public function testSetIconInvalid($icon) { - $this->action->setIcon($icon); - } - public function testIsValid() { $this->assertFalse($this->action->isValid()); $this->assertFalse($this->action->isValidParsed()); diff --git a/tests/lib/notification/notificationtest.php b/tests/lib/notification/notificationtest.php index a790a53eaa795a4b80c831e1f16b63533803b570..8be49ebdc177a6b534d58627742c2030df1db985 100644 --- a/tests/lib/notification/notificationtest.php +++ b/tests/lib/notification/notificationtest.php @@ -371,34 +371,6 @@ class NotificationTest extends TestCase { $this->notification->setLink($link); } - public function dataSetIcon() { - return $this->dataValidString(64); - } - - /** - * @dataProvider dataSetIcon - * @param string $icon - */ - public function testSetIcon($icon) { - $this->assertSame('', $this->notification->getIcon()); - $this->notification->setIcon($icon); - $this->assertSame($icon, $this->notification->getIcon()); - } - - public function dataSetIconInvalid() { - return $this->dataInvalidString(64); - } - - /** - * @dataProvider dataSetIconInvalid - * @param mixed $icon - * - * @expectedException \InvalidArgumentException - */ - public function testSetIconInvalid($icon) { - $this->notification->setIcon($icon); - } - public function testCreateAction() { $action = $this->notification->createAction(); $this->assertInstanceOf('OC\Notification\IAction', $action); @@ -438,6 +410,24 @@ class NotificationTest extends TestCase { $this->notification->addAction($action); } + public function testAddActionSecondPrimary() { + /** @var \OC\Notification\IAction|\PHPUnit_Framework_MockObject_MockObject $action */ + $action = $this->getMockBuilder('OC\Notification\IAction') + ->disableOriginalConstructor() + ->getMock(); + $action->expects($this->exactly(2)) + ->method('isValid') + ->willReturn(true); + $action->expects($this->exactly(2)) + ->method('isPrimary') + ->willReturn(true); + + $this->notification->addAction($action); + + $this->setExpectedException('\InvalidArgumentException'); + $this->notification->addAction($action); + } + public function testAddParsedAction() { /** @var \OC\Notification\IAction|\PHPUnit_Framework_MockObject_MockObject $action */ $action = $this->getMockBuilder('OC\Notification\IAction') @@ -472,6 +462,24 @@ class NotificationTest extends TestCase { $this->notification->addParsedAction($action); } + public function testAddActionSecondParsedPrimary() { + /** @var \OC\Notification\IAction|\PHPUnit_Framework_MockObject_MockObject $action */ + $action = $this->getMockBuilder('OC\Notification\IAction') + ->disableOriginalConstructor() + ->getMock(); + $action->expects($this->exactly(2)) + ->method('isValidParsed') + ->willReturn(true); + $action->expects($this->exactly(2)) + ->method('isPrimary') + ->willReturn(true); + + $this->notification->addParsedAction($action); + + $this->setExpectedException('\InvalidArgumentException'); + $this->notification->addParsedAction($action); + } + public function dataIsValid() { return [ [false, '', false],