From 176ad4f337787bfc846338a6e63de5352e205a70 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..6d2c379a2 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..4e81506c3 --- /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 175a634169d1cbcb956f9e229e9570ed6a6a7505 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=B4me=20Chilliet?= Date: Fri, 7 Aug 2026 15:53:44 +0200 Subject: [PATCH 2/2] 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 6d2c379a2..a8cc30f42 100644 --- a/lib/Data.php +++ b/lib/Data.php @@ -376,16 +376,22 @@ private function applyStreamConditions( )); // 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) {