From d56a3d496a126196c72f9944c29475c5bcb1bda7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=B4me=20Chilliet?= Date: Thu, 6 Aug 2026 17:52:00 +0200 Subject: [PATCH 1/2] feat(filters): Add a focused filter MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This filter shows all activity related to files from your home. More should be added later. Signed-off-by: Côme Chilliet --- appinfo/info.xml | 1 + lib/Data.php | 26 +++++++++++++++- lib/Filter/FocusedFilter.php | 59 ++++++++++++++++++++++++++++++++++++ 3 files changed, 85 insertions(+), 1 deletion(-) create mode 100644 lib/Filter/FocusedFilter.php 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/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..01ea2b8ee --- /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', 'activity-dark.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 []; + } +} From 181e48c88c0ecb589be9755c2386840f247208ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=B4me=20Chilliet?= Date: Thu, 13 Aug 2026 12:33:37 +0200 Subject: [PATCH 2/2] fix: Use home icon for Focused filter MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Côme Chilliet --- REUSE.toml | 2 +- img/focused-filter.svg | 1 + lib/Filter/FocusedFilter.php | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) create mode 100644 img/focused-filter.svg 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/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/Filter/FocusedFilter.php b/lib/Filter/FocusedFilter.php index 01ea2b8ee..40f96f4fb 100644 --- a/lib/Filter/FocusedFilter.php +++ b/lib/Filter/FocusedFilter.php @@ -37,7 +37,7 @@ public function getPriority(): int { #[\Override] public function getIcon(): string { - return $this->url->getAbsoluteURL($this->url->imagePath('activity', 'activity-dark.svg')); + return $this->url->getAbsoluteURL($this->url->imagePath('activity', 'focused-filter.svg')); } /**