summaryrefslogtreecommitdiffstats
path: root/apps/theming/lib/Controller
diff options
context:
space:
mode:
authorMorris Jobke <hey@morrisjobke.de>2016-11-18 15:35:34 +0100
committerGitHub <noreply@github.com>2016-11-18 15:35:34 +0100
commitfaee255ff47873ed2f8908c7d6b6e603ded11618 (patch)
tree87a46252211e9c0dbab91609e4115082401656ee /apps/theming/lib/Controller
parente8511660f01faeebcc692b57cabdacd97845da92 (diff)
parent2ab4d1e0a3f15af2b8f04edcf18b7fe3fc0be262 (diff)
downloadnextcloud-server-faee255ff47873ed2f8908c7d6b6e603ded11618.tar.gz
nextcloud-server-faee255ff47873ed2f8908c7d6b6e603ded11618.zip
Merge pull request #840 from nextcloud/theming-icon-endpoint
Add dynamic icon creation
Diffstat (limited to 'apps/theming/lib/Controller')
-rw-r--r--apps/theming/lib/Controller/IconController.php174
-rw-r--r--apps/theming/lib/Controller/ThemingController.php11
2 files changed, 185 insertions, 0 deletions
diff --git a/apps/theming/lib/Controller/IconController.php b/apps/theming/lib/Controller/IconController.php
new file mode 100644
index 00000000000..4c25d911e5e
--- /dev/null
+++ b/apps/theming/lib/Controller/IconController.php
@@ -0,0 +1,174 @@
+<?php
+/**
+ * @copyright Copyright (c) 2016 Julius Haertl <jus@bitgrid.net>
+ *
+ * @author Julius Haertl <jus@bitgrid.net>
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * 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
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+namespace OCA\Theming\Controller;
+
+use OCA\Theming\IconBuilder;
+use OCA\Theming\ImageManager;
+use OCA\Theming\ThemingDefaults;
+use OCP\AppFramework\Controller;
+use OCP\AppFramework\Http;
+use OCP\AppFramework\Http\NotFoundResponse;
+use OCP\AppFramework\Http\FileDisplayResponse;
+use OCP\AppFramework\Utility\ITimeFactory;
+use OCP\Files\NotFoundException;
+use OCP\IRequest;
+use OCA\Theming\Util;
+use OCP\IConfig;
+
+class IconController extends Controller {
+ /** @var ThemingDefaults */
+ private $themingDefaults;
+ /** @var Util */
+ private $util;
+ /** @var ITimeFactory */
+ private $timeFactory;
+ /** @var IConfig */
+ private $config;
+ /** @var IconBuilder */
+ private $iconBuilder;
+ /** @var ImageManager */
+ private $imageManager;
+
+ /**
+ * IconController constructor.
+ *
+ * @param string $appName
+ * @param IRequest $request
+ * @param ThemingDefaults $themingDefaults
+ * @param Util $util
+ * @param ITimeFactory $timeFactory
+ * @param IConfig $config
+ * @param IconBuilder $iconBuilder
+ * @param ImageManager $imageManager
+ */
+ public function __construct(
+ $appName,
+ IRequest $request,
+ ThemingDefaults $themingDefaults,
+ Util $util,
+ ITimeFactory $timeFactory,
+ IConfig $config,
+ IconBuilder $iconBuilder,
+ ImageManager $imageManager
+ ) {
+ parent::__construct($appName, $request);
+
+ $this->themingDefaults = $themingDefaults;
+ $this->util = $util;
+ $this->timeFactory = $timeFactory;
+ $this->config = $config;
+ $this->iconBuilder = $iconBuilder;
+ $this->imageManager = $imageManager;
+ }
+
+ /**
+ * @PublicPage
+ * @NoCSRFRequired
+ *
+ * @param $app string app name
+ * @param $image string image file name (svg required)
+ * @return FileDisplayResponse|NotFoundResponse
+ */
+ public function getThemedIcon($app, $image) {
+ try {
+ $iconFile = $this->imageManager->getCachedImage("icon-" . $app . '-' . str_replace("/","_",$image));
+ } catch (NotFoundException $exception) {
+ $icon = $this->iconBuilder->colorSvg($app, $image);
+ $iconFile = $this->imageManager->setCachedImage("icon-" . $app . '-' . str_replace("/","_",$image), $icon);
+ }
+ if ($iconFile !== false) {
+ $response = new FileDisplayResponse($iconFile, Http::STATUS_OK, ['Content-Type' => 'image/svg+xml']);
+ $response->cacheFor(86400);
+ $expires = new \DateTime();
+ $expires->setTimestamp($this->timeFactory->getTime());
+ $expires->add(new \DateInterval('PT24H'));
+ $response->addHeader('Expires', $expires->format(\DateTime::RFC2822));
+ $response->addHeader('Pragma', 'cache');
+ return $response;
+ } else {
+ return new NotFoundResponse();
+ }
+ }
+
+ /**
+ * Return a 32x32 favicon as png
+ *
+ * @PublicPage
+ * @NoCSRFRequired
+ *
+ * @param $app string app name
+ * @return FileDisplayResponse|NotFoundResponse
+ */
+ public function getFavicon($app = "core") {
+ if ($this->themingDefaults->shouldReplaceIcons()) {
+ try {
+ $iconFile = $this->imageManager->getCachedImage('favIcon-' . $app);
+ } catch (NotFoundException $exception) {
+ $icon = $this->iconBuilder->getFavicon($app);
+ $iconFile = $this->imageManager->setCachedImage('favIcon-' . $app, $icon);
+ }
+ if ($iconFile !== false) {
+ $response = new FileDisplayResponse($iconFile, Http::STATUS_OK, ['Content-Type' => 'image/x-icon']);
+ $response->cacheFor(86400);
+ $expires = new \DateTime();
+ $expires->setTimestamp($this->timeFactory->getTime());
+ $expires->add(new \DateInterval('PT24H'));
+ $response->addHeader('Expires', $expires->format(\DateTime::RFC2822));
+ $response->addHeader('Pragma', 'cache');
+ return $response;
+ }
+ }
+ return new NotFoundResponse();
+ }
+
+ /**
+ * Return a 512x512 icon for touch devices
+ *
+ * @PublicPage
+ * @NoCSRFRequired
+ *
+ * @param $app string app name
+ * @return FileDisplayResponse|NotFoundResponse
+ */
+ public function getTouchIcon($app = "core") {
+ if ($this->themingDefaults->shouldReplaceIcons()) {
+ try {
+ $iconFile = $this->imageManager->getCachedImage('touchIcon-' . $app);
+ } catch (NotFoundException $exception) {
+ $icon = $this->iconBuilder->getTouchIcon($app);
+ $iconFile = $this->imageManager->setCachedImage('touchIcon-' . $app, $icon);
+ }
+ if ($iconFile !== false) {
+ $response = new FileDisplayResponse($iconFile, Http::STATUS_OK, ['Content-Type' => 'image/png']);
+ $response->cacheFor(86400);
+ $expires = new \DateTime();
+ $expires->setTimestamp($this->timeFactory->getTime());
+ $expires->add(new \DateInterval('PT24H'));
+ $response->addHeader('Expires', $expires->format(\DateTime::RFC2822));
+ $response->addHeader('Pragma', 'cache');
+ return $response;
+ }
+ }
+ return new NotFoundResponse();
+ }
+}
diff --git a/apps/theming/lib/Controller/ThemingController.php b/apps/theming/lib/Controller/ThemingController.php
index 1eefb2e3dd7..58e843c5d9d 100644
--- a/apps/theming/lib/Controller/ThemingController.php
+++ b/apps/theming/lib/Controller/ThemingController.php
@@ -410,6 +410,15 @@ class ThemingController extends Controller {
$responseCss .= '.nc-theming-contrast {color: #ffffff}' . "\n";
}
+ if($logo !== '' or $color !== '') {
+ $responseCss .= '.icon-file,.icon-filetype-text {' .
+ 'background-image: url(\'./img/core/filetypes/text.svg?v='.$cacheBusterValue.'\');' . "}\n" .
+ '.icon-folder, .icon-filetype-folder {' .
+ 'background-image: url(\'./img/core/filetypes/folder.svg?v='.$cacheBusterValue.'\');' . "}\n" .
+ '.icon-filetype-folder-drag-accept {' .
+ 'background-image: url(\'./img/core/filetypes/folder-drag-accept.svg?v='.$cacheBusterValue.'\')!important;' . "}\n";
+ }
+
$response = new DataDownloadResponse($responseCss, 'style', 'text/css');
$response->addHeader('Expires', date(\DateTime::RFC2822, $this->timeFactory->getTime()));
$response->addHeader('Pragma', 'cache');
@@ -423,6 +432,7 @@ class ThemingController extends Controller {
* @return DataDownloadResponse
*/
public function getJavascript() {
+ $cacheBusterValue = $this->config->getAppValue('theming', 'cachebuster', '0');
$responseJS = '(function() {
OCA.Theming = {
name: ' . json_encode($this->template->getName()) . ',
@@ -430,6 +440,7 @@ class ThemingController extends Controller {
slogan: ' . json_encode($this->template->getSlogan()) . ',
color: ' . json_encode($this->template->getMailHeaderColor()) . ',
inverted: ' . json_encode($this->util->invertTextColor($this->template->getMailHeaderColor())) . ',
+ cacheBuster: ' . json_encode($cacheBusterValue). '
};
})();';
$response = new Http\DataDisplayResponse($responseJS);