diff --git a/img/actions/room-created.png b/img/actions/room-created.png index 08339a8..9967431 100644 Binary files a/img/actions/room-created.png and b/img/actions/room-created.png differ diff --git a/img/actions/room-created.svg b/img/actions/room-created.svg index 76906cc..ae7f982 100644 --- a/img/actions/room-created.svg +++ b/img/actions/room-created.svg @@ -12,8 +12,11 @@ version="1.0" viewBox="0 0 32 32" id="svg4" - sodipodi:docname="app-dark.svg" - inkscape:version="0.92.4 (5da689c313, 2019-01-14)"> + sodipodi:docname="room-created.svg" + inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)" + inkscape:export-filename="/home/klaus/Repos/cloud_bbb/img/actions/room-created.png" + inkscape:export-xdpi="96" + inkscape:export-ydpi="96"> @@ -22,7 +25,7 @@ image/svg+xml - + @@ -41,11 +44,11 @@ inkscape:window-height="997" id="namedview6" showgrid="false" - inkscape:zoom="7.375" - inkscape:cx="13.46269" - inkscape:cy="7.070207" - inkscape:window-x="2110" - inkscape:window-y="585" + inkscape:zoom="10.429825" + inkscape:cx="-15.100081" + inkscape:cy="6.5908126" + inkscape:window-x="1889" + inkscape:window-y="504" inkscape:window-maximized="0" inkscape:current-layer="svg4" /> + aria-label="+" + transform="matrix(1.5934936,0,0,1.2502401,-6.542738,-6.5950957)" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:23.68428612px;line-height:125%;font-family:'Helvetica Neue';-inkscape-font-specification:'Helvetica Neue';letter-spacing:0px;word-spacing:0px;fill:#44aa00;fill-opacity:1;stroke:none;stroke-width:1.26880109px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + id="text817"> - diff --git a/img/actions/room-deleted.png b/img/actions/room-deleted.png index 07ac1a9..d16feff 100644 Binary files a/img/actions/room-deleted.png and b/img/actions/room-deleted.png differ diff --git a/img/actions/room-deleted.svg b/img/actions/room-deleted.svg index 0361475..4e30049 100644 --- a/img/actions/room-deleted.svg +++ b/img/actions/room-deleted.svg @@ -13,7 +13,10 @@ viewBox="0 0 32 32" id="svg4" sodipodi:docname="room-deleted.svg" - inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)"> + inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)" + inkscape:export-filename="/home/klaus/Repos/cloud_bbb/img/actions/room-deleted.png" + inkscape:export-xdpi="96" + inkscape:export-ydpi="96"> @@ -42,7 +45,7 @@ id="namedview6" showgrid="false" inkscape:zoom="7.375" - inkscape:cx="-12.706802" + inkscape:cx="-39.011887" inkscape:cy="6.3922409" inkscape:window-x="2110" inkscape:window-y="585" @@ -57,11 +60,11 @@ diff --git a/img/actions/share-created.png b/img/actions/share-created.png new file mode 100644 index 0000000..ced3f19 Binary files /dev/null and b/img/actions/share-created.png differ diff --git a/img/actions/share-created.svg b/img/actions/share-created.svg new file mode 100644 index 0000000..933719e --- /dev/null +++ b/img/actions/share-created.svg @@ -0,0 +1,65 @@ + + + + + + image/svg+xml + + + + + + + + + + diff --git a/img/actions/share-deleted.png b/img/actions/share-deleted.png new file mode 100644 index 0000000..7e0f0eb Binary files /dev/null and b/img/actions/share-deleted.png differ diff --git a/img/actions/share-deleted.svg b/img/actions/share-deleted.svg new file mode 100644 index 0000000..da99e12 --- /dev/null +++ b/img/actions/share-deleted.svg @@ -0,0 +1,65 @@ + + + + + + image/svg+xml + + + + + + + + + + diff --git a/lib/Activity/Provider.php b/lib/Activity/Provider.php index 1f6aa84..39a8195 100644 --- a/lib/Activity/Provider.php +++ b/lib/Activity/Provider.php @@ -3,11 +3,13 @@ namespace OCA\BigBlueButton\Activity; use OCA\BigBlueButton\AppInfo\Application; +use OCA\BigBlueButton\Db\RoomShare; use OCP\Activity\IProvider; use OCP\Activity\IEvent; use OCP\Activity\IManager; use OCP\IL10N; use OCP\IUserManager; +use OCP\IGroupManager; use OCP\IURLGenerator; use OCP\L10N\IFactory; use OCP\IUser; @@ -20,6 +22,12 @@ class Provider implements IProvider { /** @var string */ public const ROOM_DELETED = 'room_deleted'; + /** @var string */ + public const SHARE_CREATED = 'share_created'; + + /** @var string */ + public const SHARE_DELETED = 'share_deleted'; + /** @var IL10N */ protected $l; @@ -29,6 +37,9 @@ class Provider implements IProvider { /** @var IUserManager */ protected $userManager; + /** @var IGroupManager */ + protected $groupManager; + /** @var IURLGenerator */ protected $url; @@ -38,11 +49,13 @@ class Provider implements IProvider { public function __construct( IManager $manager, IUserManager $userManager, + IGroupManager $groupManager, IURLGenerator $url, IFactory $languageFactory ) { $this->activityManager = $manager; $this->userManager = $userManager; + $this->groupManager = $groupManager; $this->url = $url; $this->languageFactory = $languageFactory; } @@ -60,8 +73,10 @@ class Provider implements IProvider { $this->parseRoomCreated($event); } elseif ($subject === self::ROOM_DELETED) { $this->parseRoomDeleted($event); - } else { - $event->setParsedSubject('Unknown subject: ' . $subject); + } elseif ($subject === self::SHARE_CREATED) { + $this->parseShareCreated($event); + } elseif ($subject === self::SHARE_DELETED) { + $this->parseShareDeleted($event); } return $event; @@ -91,6 +106,40 @@ class Provider implements IProvider { $this->setIcon($event, 'room-deleted'); } + private function parseShareCreated(IEvent $event) { + $params = $event->getSubjectParameters(); + + if ($this->activityManager->getCurrentUserId() === $event->getAuthor()) { + $subject = $this->l->t('You shared the room %s with {shareWith}.', [$params['name']]); + } else { + $subject = $this->l->t('{user} shared the room %s with you.', [$params['name']]); + } + + $this->setSubjects($event, $subject, [ + 'user' => $this->getUser($event->getAuthor()), + 'shareWith' => $params['shareType'] === RoomShare::SHARE_TYPE_USER ? $this->getUser($params['shareWith']) : $this->getGroup($params['shareWith']), + ]); + + $this->setIcon($event, 'share-created'); + } + + private function parseShareDeleted(IEvent $event) { + $params = $event->getSubjectParameters(); + + if ($this->activityManager->getCurrentUserId() === $event->getAuthor()) { + $subject = $this->l->t('You unshared the room %s with {shareWith}.', [$params['name']]); + } else { + $subject = $this->l->t('{user} unshared the room %s with you.', [$params['name']]); + } + + $this->setSubjects($event, $subject, [ + 'user' => $this->getUser($event->getAuthor()), + 'shareWith' => $params['shareType'] === RoomShare::SHARE_TYPE_USER ? $this->getUser($params['shareWith']) : $this->getGroup($params['shareWith']), + ]); + + $this->setIcon($event, 'share-deleted'); + } + private function setIcon(IEvent $event, string $baseName) { if ($this->activityManager->getRequirePNG()) { $imagePath = $this->url->imagePath(Application::ID, 'actions/'.$baseName.'.png'); @@ -134,4 +183,22 @@ class Provider implements IProvider { 'name' => $uid, ]; } + + protected function getGroup($uid) { + $group = $this->groupManager->get($uid); + + if ($group !== null) { + return [ + 'type' => 'user-group', + 'id' => $group->getGID(), + 'name' => $group->getDisplayName(), + ]; + } + + return [ + 'type' => 'user-group', + 'id' => $uid, + 'name' => $uid, + ]; + } } diff --git a/lib/Activity/RoomListener.php b/lib/Activity/RoomListener.php index 1f8884a..1c49187 100644 --- a/lib/Activity/RoomListener.php +++ b/lib/Activity/RoomListener.php @@ -20,9 +20,9 @@ class RoomListener implements IEventListener { public function handle(Event $event): void { if ($event instanceof RoomCreatedEvent) { - $subject = Provider::ROOM_CREATED; + $subject = Provider::SHARE_CREATED; } elseif ($event instanceof RoomDeletedEvent) { - $subject = Provider::ROOM_DELETED; + $subject = Provider::SHARE_DELETED; } else { return; } diff --git a/lib/Activity/RoomShareListener.php b/lib/Activity/RoomShareListener.php new file mode 100644 index 0000000..2cb891e --- /dev/null +++ b/lib/Activity/RoomShareListener.php @@ -0,0 +1,91 @@ +activityManager = $activityManager; + $this->roomService = $roomService; + $this->groupManager = $groupManager; + } + + public function handle(Event $event): void { + if ($event instanceof RoomShareCreatedEvent) { + $subject = Provider::SHARE_CREATED; + } elseif ($event instanceof RoomShareDeletedEvent) { + $subject = Provider::SHARE_DELETED; + } else { + return; + } + + $share = $event->getRoomShare(); + $shareType = $share->getShareType(); + $room = $this->roomService->find($share->getRoomId()); + + if ($shareType === RoomShare::SHARE_TYPE_USER) { + $this->shareWithUser($subject, $room, $share); + } elseif ($shareType === RoomShare::SHARE_TYPE_GROUP) { + $this->shareWithGroup($subject, $room, $share); + } + } + + private function shareWithUser(string $subject, Room $room, RoomShare $share) { + $this->createActivityEvent($subject, $room->getUserId(), $room, $share); + $this->createActivityEvent($subject, $share->getShareWith(), $room, $share); + } + + private function shareWithGroup(string $subject, Room $room, RoomShare $share) { + $this->createActivityEvent($subject, $room->getUserId(), $room, $share); + + $group = $this->groupManager->get($share->getShareWith()); + + if ($group === null) { + return; + } + + foreach ($group->getUsers() as $user) { + $this->createActivityEvent($subject, $user->getUID(), $room, $share); + } + } + + private function createActivityEvent(string $subject, string $affectedUser, Room $room, RoomShare $roomShare) { + $activityEvent = $this->activityManager->generateEvent(); + + $activityEvent->setApp(Application::ID); + $activityEvent->setType(Setting::Identifier); + $activityEvent->setAffectedUser($affectedUser); + $activityEvent->setSubject($subject, [ + 'id' => $room->getId(), + 'name' => $room->getName(), + 'shareType' => $roomShare->getShareType(), + 'shareWith' => $roomShare->getShareWith(), + 'permission' => $roomShare->getPermission(), + ]); + + $this->activityManager->publish($activityEvent); + } +} diff --git a/lib/AppInfo/Application.php b/lib/AppInfo/Application.php index 47f1a69..6beb076 100644 --- a/lib/AppInfo/Application.php +++ b/lib/AppInfo/Application.php @@ -10,6 +10,9 @@ use \OCA\BigBlueButton\Middleware\JoinMiddleware; use \OCA\BigBlueButton\Event\RoomCreatedEvent; use \OCA\BigBlueButton\Event\RoomDeletedEvent; use \OCA\BigBlueButton\Activity\RoomListener; +use \OCA\BigBlueButton\Event\RoomShareCreatedEvent; +use \OCA\BigBlueButton\Event\RoomShareDeletedEvent; +use \OCA\BigBlueButton\Activity\RoomShareListener; if ((@include_once __DIR__ . '/../../vendor/autoload.php') === false) { throw new \Exception('Cannot include autoload. Did you run install dependencies using composer?'); @@ -28,6 +31,9 @@ class Application extends App { $dispatcher->addServiceListener(RoomCreatedEvent::class, RoomListener::class); $dispatcher->addServiceListener(RoomDeletedEvent::class, RoomListener::class); + $dispatcher->addServiceListener(RoomShareCreatedEvent::class, RoomShareListener::class); + $dispatcher->addServiceListener(RoomShareDeletedEvent::class, RoomShareListener::class); + $container->registerMiddleWare(JoinMiddleware::class); $config = $container->query(IConfig::class); diff --git a/lib/Event/RoomShareEvent.php b/lib/Event/RoomShareEvent.php index 94173b6..af9264a 100644 --- a/lib/Event/RoomShareEvent.php +++ b/lib/Event/RoomShareEvent.php @@ -11,7 +11,7 @@ abstract class RoomShareEvent extends Event { private $roomShare; public function __construct(RoomShare $roomShare) { - $this->roomId = $roomShare; + $this->roomShare = $roomShare; } public function getRoomShare(): RoomShare {