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 f28bf3e2c..dd18a400a 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,36 @@ 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'), + )); + // Filter out our own activity + $query->andWhere($query->expr()->neq('user', $query->createNamedParameter($user))); + $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) { 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 []; + } +}