diff --git a/REUSE.toml b/REUSE.toml index ddcfc369a..4c1e5e4d4 100644 --- a/REUSE.toml +++ b/REUSE.toml @@ -18,7 +18,7 @@ SPDX-FileCopyrightText = "2016 Nextcloud GmbH and Nextcloud contributors" SPDX-License-Identifier = "AGPL-3.0-or-later" [[annotations]] -path = ["img/activity-dark.svg", "img/activity.svg", "img/add-color.svg", "img/change.svg", "img/delete-color.svg", "img/notifications-dark.svg"] +path = ["img/activity-dark.svg", "img/activity.svg", "img/add-color.svg", "img/change.svg", "img/delete-color.svg", "img/notifications-dark.svg", "img/focused-filter.svg"] precedence = "aggregate" SPDX-FileCopyrightText = "2018-2024 Google LLC" SPDX-License-Identifier = "Apache-2.0" diff --git a/appinfo/info.xml b/appinfo/info.xml index 118ee1028..6c51fdf6f 100644 --- a/appinfo/info.xml +++ b/appinfo/info.xml @@ -61,6 +61,7 @@ OCA\Activity\Filter\AllFilter + OCA\Activity\Filter\FocusedFilter OCA\Activity\Filter\SelfFilter OCA\Activity\Filter\ByFilter diff --git a/img/focused-filter.svg b/img/focused-filter.svg new file mode 100644 index 000000000..e9d23f16b --- /dev/null +++ b/img/focused-filter.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/Data.php b/lib/Data.php index a1f07a893..0dfbac4ff 100644 --- a/lib/Data.php +++ b/lib/Data.php @@ -292,7 +292,7 @@ public function get(GroupHelper $groupHelper, UserSettings $userSettings, string $query = $this->connection->getQueryBuilder(); $query->select('*') - ->from('activity'); + ->from('activity', 'a'); $this->applyStreamConditions($query, $userSettings, $user, $filter, $activeFilter, $objectType, $objectId, $search); @@ -362,6 +362,30 @@ private function applyStreamConditions( } elseif ($filter === 'filter') { $query->andWhere($query->expr()->eq('object_type', $query->createNamedParameter($objectType))); $query->andWhere($query->expr()->eq('object_id', $query->createNamedParameter($objectId))); + } elseif ($filter === 'focused') { + // Only activity related to files owned by the user + $query->leftJoin('a', 'filecache', 'f', + $query->expr()->andX( + $query->expr()->eq('a.object_type', $query->createNamedParameter('files')), + $query->expr()->eq('a.object_id', 'f.fileid'), + )); + $query->leftJoin('f', 'mounts', 'm', + $query->expr()->andX( + $query->expr()->eq('a.object_type', $query->createNamedParameter('files')), + $query->expr()->eq('f.storage', 'm.storage_id'), + )); + // Filter out our own activity + $query->andWhere($query->expr()->neq('user', $query->createNamedParameter($user))); + $query->andWhere( + $query->expr()->orX( + // Affected object is one of our files + $query->expr()->eq('m.mount_point', $query->createNamedParameter('/' . $user . '/')), + // There is no affected object, so the activity affects our user directly + $query->expr()->eq('object_type', $query->createNamedParameter('')), + // Show all sharing related events + $query->expr()->eq('app', $query->createNamedParameter('files_sharing')), + ) + ); } if ($activeFilter instanceof IFilter) { diff --git a/lib/Filter/FocusedFilter.php b/lib/Filter/FocusedFilter.php new file mode 100644 index 000000000..40f96f4fb --- /dev/null +++ b/lib/Filter/FocusedFilter.php @@ -0,0 +1,59 @@ +l->t('Focused'); + } + + #[\Override] + public function getPriority(): int { + return 1; + } + + #[\Override] + public function getIcon(): string { + return $this->url->getAbsoluteURL($this->url->imagePath('activity', 'focused-filter.svg')); + } + + /** + * @param string[] $types + * @return string[] An array of allowed apps from which activities should be displayed + */ + #[\Override] + public function filterTypes(array $types): array { + return $types; + } + + /** + * @return string[] An array of allowed apps from which activities should be displayed + */ + #[\Override] + public function allowedApps(): array { + return []; + } +}