activity.php 9.49 KB
Newer Older
1
2
<?php
/**
Jenkins for ownCloud's avatar
Jenkins for ownCloud committed
3
4
5
 * @author Björn Schießle <schiessle@owncloud.com>
 * @author Joas Schilling <nickvergessen@owncloud.com>
 * @author Morris Jobke <hey@morrisjobke.de>
6
 *
Jenkins for ownCloud's avatar
Jenkins for ownCloud committed
7
8
 * @copyright Copyright (c) 2015, ownCloud, Inc.
 * @license AGPL-3.0
9
 *
Jenkins for ownCloud's avatar
Jenkins for ownCloud committed
10
11
12
13
14
15
16
17
18
19
20
 * This code is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License, version 3,
 * as published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 * GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License, version 3,
 * along with this program.  If not, see <http://www.gnu.org/licenses/>
21
22
 *
 */
23

24
25
namespace OCA\Files_Sharing;

26
27
28
use OC\L10N\Factory;
use OCP\Activity\IExtension;
use OCP\IURLGenerator;
29

30
class Activity implements IExtension {
31
	const FILES_SHARING_APP = 'files_sharing';
32
33
34
35
36
37
38
39
	/**
	 * Filter with all sharing related activities
	 */
	const FILTER_SHARES = 'shares';

	/**
	 * Activity types known to this extension
	 */
40
	const TYPE_PUBLIC_LINKS = 'public_links';
41
42
43
44
45
46
47
48
49
	const TYPE_REMOTE_SHARE = 'remote_share';
	const TYPE_SHARED = 'shared';

	/**
	 * Subject keys for translation of the subjections
	 */
	const SUBJECT_PUBLIC_SHARED_FILE_DOWNLOADED = 'public_shared_file_downloaded';
	const SUBJECT_PUBLIC_SHARED_FOLDER_DOWNLOADED = 'public_shared_folder_downloaded';

50
51
	const SUBJECT_REMOTE_SHARE_ACCEPTED = 'remote_share_accepted';
	const SUBJECT_REMOTE_SHARE_DECLINED = 'remote_share_declined';
52
	const SUBJECT_REMOTE_SHARE_RECEIVED = 'remote_share_received';
53
	const SUBJECT_REMOTE_SHARE_UNSHARED = 'remote_share_unshared';
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75

	const SUBJECT_SHARED_GROUP_SELF = 'shared_group_self';
	const SUBJECT_SHARED_LINK_SELF = 'shared_link_self';
	const SUBJECT_SHARED_USER_SELF = 'shared_user_self';
	const SUBJECT_SHARED_WITH_BY = 'shared_with_by';

	/** @var Factory */
	protected $languageFactory;

	/** @var IURLGenerator */
	protected $URLGenerator;

	/**
	 * @param Factory $languageFactory
	 * @param IURLGenerator $URLGenerator
	 */
	public function __construct(Factory $languageFactory, IURLGenerator $URLGenerator) {
		$this->languageFactory = $languageFactory;
		$this->URLGenerator = $URLGenerator;
	}

	protected function getL10N($languageCode = null) {
76
		return $this->languageFactory->get(self::FILES_SHARING_APP, $languageCode);
77
	}
78
79
80
81
82
83
84
85
86

	/**
	 * The extension can return an array of additional notification types.
	 * If no additional types are to be added false is to be returned
	 *
	 * @param string $languageCode
	 * @return array|false
	 */
	public function getNotificationTypes($languageCode) {
87
88
		$l = $this->getL10N($languageCode);

89
		return array(
90
91
92
			self::TYPE_SHARED => (string) $l->t('A file or folder has been <strong>shared</strong>'),
			self::TYPE_REMOTE_SHARE => (string) $l->t('A file or folder was shared from <strong>another server</strong>'),
			self::TYPE_PUBLIC_LINKS => (string) $l->t('A public shared file or folder was <strong>downloaded</strong>'),
93
		);
94
95
96
97
98
99
100
101
102
103
	}

	/**
	 * For a given method additional types to be displayed in the settings can be returned.
	 * In case no additional types are to be added false is to be returned.
	 *
	 * @param string $method
	 * @return array|false
	 */
	public function getDefaultTypes($method) {
104
105
106
107
108
109
110
		$defaultTypes = [
			self::TYPE_SHARED,
			self::TYPE_REMOTE_SHARE,
		];

		if ($method === 'stream') {
			$defaultTypes[] = self::TYPE_PUBLIC_LINKS;
111
112
		}

113
		return $defaultTypes;
114
115
	}

116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
	/**
	 * A string naming the css class for the icon to be used can be returned.
	 * If no icon is known for the given type false is to be returned.
	 *
	 * @param string $type
	 * @return string|false
	 */
	public function getTypeIcon($type) {
		switch ($type) {
			case self::TYPE_SHARED:
			case self::TYPE_REMOTE_SHARE:
				return 'icon-share';
			case self::TYPE_PUBLIC_LINKS:
				return 'icon-download';
		}

		return false;
	}

135
136
137
138
139
140
141
142
143
144
145
146
147
	/**
	 * The extension can translate a given message to the requested languages.
	 * If no translation is available false is to be returned.
	 *
	 * @param string $app
	 * @param string $text
	 * @param array $params
	 * @param boolean $stripPath
	 * @param boolean $highlightParams
	 * @param string $languageCode
	 * @return string|false
	 */
	public function translate($app, $text, $params, $stripPath, $highlightParams, $languageCode) {
148
		$l = $this->getL10N($languageCode);
149

150
		if ($app === self::FILES_SHARING_APP) {
151
152
			switch ($text) {
				case self::SUBJECT_REMOTE_SHARE_RECEIVED:
153
					return (string) $l->t('You received a new remote share from %s', $params);
154
				case self::SUBJECT_REMOTE_SHARE_ACCEPTED:
155
					return (string) $l->t('%1$s accepted remote share %2$s', $params);
156
				case self::SUBJECT_REMOTE_SHARE_DECLINED:
157
					return (string) $l->t('%1$s declined remote share %2$s', $params);
158
				case self::SUBJECT_REMOTE_SHARE_UNSHARED:
159
					return (string) $l->t('%1$s unshared %2$s from you', $params);
160
				case self::SUBJECT_PUBLIC_SHARED_FOLDER_DOWNLOADED:
161
					return (string) $l->t('Public shared folder %1$s was downloaded', $params);
162
				case self::SUBJECT_PUBLIC_SHARED_FILE_DOWNLOADED:
163
164
165
166
167
168
169
170
171
					return (string) $l->t('Public shared file %1$s was downloaded', $params);
				case self::SUBJECT_SHARED_USER_SELF:
					return (string) $l->t('You shared %1$s with %2$s', $params);
				case self::SUBJECT_SHARED_GROUP_SELF:
					return (string) $l->t('You shared %1$s with group %2$s', $params);
				case self::SUBJECT_SHARED_WITH_BY:
					return (string) $l->t('%2$s shared %1$s with you', $params);
				case self::SUBJECT_SHARED_LINK_SELF:
					return (string) $l->t('You shared %1$s via link', $params);
172
173
			}
		}
174
175

		return false;
176
177
	}

178
179
180
181
182
183
184
185
186
187
188
189
	/**
	 * The extension can define the type of parameters for translation
	 *
	 * Currently known types are:
	 * * file		=> will strip away the path of the file and add a tooltip with it
	 * * username	=> will add the avatar of the user
	 *
	 * @param string $app
	 * @param string $text
	 * @return array|false
	 */
	public function getSpecialParameterList($app, $text) {
190
		if ($app === self::FILES_SHARING_APP) {
191
192
193
194
195
196
197
198
199
200
201
202
			switch ($text) {
				case self::SUBJECT_REMOTE_SHARE_RECEIVED:
					return array(
						0 => '',// We can not use 'username' since the user is in a different ownCloud
					);
				case self::SUBJECT_REMOTE_SHARE_ACCEPTED:
				case self::SUBJECT_REMOTE_SHARE_DECLINED:
				case self::SUBJECT_REMOTE_SHARE_UNSHARED:
					return array(
						0 => '',// We can not use 'username' since the user is in a different ownCloud
						1 => 'file',
					);
203
204
205
206
207
				case self::SUBJECT_PUBLIC_SHARED_FOLDER_DOWNLOADED:
				case self::SUBJECT_PUBLIC_SHARED_FILE_DOWNLOADED:
					return array(
						0 => 'file',
					);
208
				case self::SUBJECT_SHARED_LINK_SELF:
209
					return [0 => 'file'];
210
211
212
213
214
215
216
217
218
219
				case self::SUBJECT_SHARED_USER_SELF:
				case self::SUBJECT_SHARED_WITH_BY:
					return [0 => 'file', 1 => 'username'];

				case self::SUBJECT_SHARED_GROUP_SELF:
					return [
						0 => 'file',
						//1 => 'group', Group does not exist yet
					];
			}
220
221
222
223
224
		}

		return false;
	}

225
226
227
228
229
230
231
232
	/**
	 * The extension can define the parameter grouping by returning the index as integer.
	 * In case no grouping is required false is to be returned.
	 *
	 * @param array $activity
	 * @return integer|false
	 */
	public function getGroupParameter($activity) {
233
234
235
236
237
238
239
240
241
242
243
244
245
		if ($activity['app'] === 'files') {
			switch ($activity['subject']) {
				case self::SUBJECT_SHARED_LINK_SELF:
				case self::SUBJECT_SHARED_WITH_BY:
					// Group by file name
					return 0;
				case self::SUBJECT_SHARED_USER_SELF:
				case self::SUBJECT_SHARED_GROUP_SELF:
					// Group by user/group
					return 1;
			}
		}

246
247
248
249
250
251
252
253
254
255
256
		return false;
	}

	/**
	 * The extension can define additional navigation entries. The array returned has to contain two keys 'top'
	 * and 'apps' which hold arrays with the relevant entries.
	 * If no further entries are to be added false is no be returned.
	 *
	 * @return array|false
	 */
	public function getNavigation() {
257
258
259
260
261
262
263
264
265
266
267
		$l = $this->getL10N();
		return [
			'apps' => [],
			'top' => [
				self::FILTER_SHARES => [
					'id' => self::FILTER_SHARES,
					'name' => (string) $l->t('Shares'),
					'url' => $this->URLGenerator->linkToRoute('activity.Activities.showList', ['filter' => self::FILTER_SHARES]),
				],
			],
		];
268
269
270
	}

	/**
271
	 * The extension can check if a custom filter (given by a query string like filter=abc) is valid or not.
272
273
274
275
276
	 *
	 * @param string $filterValue
	 * @return boolean
	 */
	public function isFilterValid($filterValue) {
277
		return $filterValue === self::FILTER_SHARES;
278
279
	}

280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
	/**
	 * The extension can filter the types based on the filter if required.
	 * In case no filter is to be applied false is to be returned unchanged.
	 *
	 * @param array $types
	 * @param string $filter
	 * @return array|false
	 */
	public function filterNotificationTypes($types, $filter) {
		switch ($filter) {
			case self::FILTER_SHARES:
				return array_intersect([self::TYPE_SHARED, self::TYPE_REMOTE_SHARE], $types);
		}
		return false;
	}

296
297
298
299
300
301
302
303
304
305
	/**
	 * For a given filter the extension can specify the sql query conditions including parameters for that query.
	 * In case the extension does not know the filter false is to be returned.
	 * The query condition and the parameters are to be returned as array with two elements.
	 * E.g. return array('`app` = ? and `message` like ?', array('mail', 'ownCloud%'));
	 *
	 * @param string $filter
	 * @return array|false
	 */
	public function getQueryForFilter($filter) {
306
307
		if ($filter === self::FILTER_SHARES) {
			return [
308
309
				'`app` = ?',
				[self::FILES_SHARING_APP,],
310
			];
311
312
313
314
315
		}
		return false;
	}

}