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 @@
+
+
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 @@
+
+
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 {