From 87b2b7647d8c7294a380e2b4762d9693ff36d8f4 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/4] 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 --- lib/Data.php | 15 +++++++++- lib/Filter/FocusedFilter.php | 57 ++++++++++++++++++++++++++++++++++++ 2 files changed, 71 insertions(+), 1 deletion(-) create mode 100644 lib/Filter/FocusedFilter.php diff --git a/lib/Data.php b/lib/Data.php index f28bf3e2c..e54c4a6d5 100644 --- a/lib/Data.php +++ b/lib/Data.php @@ -284,7 +284,7 @@ public function get(GroupHelper $groupHelper, UserSettings $userSettings, string $query = $this->connection->getQueryBuilder(); $query->select('*') - ->from('activity'); + ->from('activity', 'a'); $query->where($query->expr()->eq('affecteduser', $query->createNamedParameter($user))); @@ -303,6 +303,19 @@ public function get(GroupHelper $groupHelper, UserSettings $userSettings, string } 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'), + )); + $query->andWhere($query->expr()->eq('m.mount_point', $query->createNamedParameter('/'.$user.'/'))); } if ($activeFilter instanceof IFilter) { diff --git a/lib/Filter/FocusedFilter.php b/lib/Filter/FocusedFilter.php new file mode 100644 index 000000000..90663a029 --- /dev/null +++ b/lib/Filter/FocusedFilter.php @@ -0,0 +1,57 @@ +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 8db08e60eaa9922fbb28852c2ee4c5d673e1e368 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=B4me=20Chilliet?= Date: Fri, 7 Aug 2026 13:52:51 +0200 Subject: [PATCH 2/4] fixup! feat(filters): Add a focused filter MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Côme Chilliet --- appinfo/info.xml | 1 + lib/Data.php | 13 ++++++++++++- 2 files changed, 13 insertions(+), 1 deletion(-) 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 e54c4a6d5..30aae82b6 100644 --- a/lib/Data.php +++ b/lib/Data.php @@ -315,7 +315,18 @@ public function get(GroupHelper $groupHelper, UserSettings $userSettings, string $query->expr()->eq('a.object_type', $query->createNamedParameter('files')), $query->expr()->eq('f.storage', 'm.storage_id'), )); - $query->andWhere($query->expr()->eq('m.mount_point', $query->createNamedParameter('/'.$user.'/'))); + // 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) { From 6b29d5766c89c81a11b74bda24b83487925baeaf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=B4me=20Chilliet?= Date: Fri, 7 Aug 2026 15:16:10 +0200 Subject: [PATCH 3/4] fixup! fixup! feat(filters): Add a focused filter MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Côme Chilliet --- lib/Filter/FocusedFilter.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/Filter/FocusedFilter.php b/lib/Filter/FocusedFilter.php index 90663a029..4e81506c3 100644 --- a/lib/Filter/FocusedFilter.php +++ b/lib/Filter/FocusedFilter.php @@ -1,5 +1,7 @@ Date: Fri, 7 Aug 2026 15:53:44 +0200 Subject: [PATCH 4/4] feat: Support extending the focused filter from applications MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This adds support for selectors registered by applications to extend the DB query for focused activity filter. Signed-off-by: Côme Chilliet --- lib/Data.php | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/lib/Data.php b/lib/Data.php index 30aae82b6..dd18a400a 100644 --- a/lib/Data.php +++ b/lib/Data.php @@ -317,16 +317,22 @@ public function get(GroupHelper $groupHelper, UserSettings $userSettings, string )); // 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')), - ) - ); + $conditions = [ + // 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')), + ]; + $activityFocusedSelectors = $this->activityManager->getActivityFocusedSelectors(); + foreach ($activityFocusedSelectors as $activityFocusedSelector) { + array_push( + $conditions, + ...$activityFocusedSelector->extendQuery($query, $user) + ); + } + $query->andWhere($query->expr()->orX(...$conditions)); } if ($activeFilter instanceof IFilter) {