diff options
author | Morris Jobke <hey@morrisjobke.de> | 2016-11-18 15:35:34 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2016-11-18 15:35:34 +0100 |
commit | faee255ff47873ed2f8908c7d6b6e603ded11618 (patch) | |
tree | 87a46252211e9c0dbab91609e4115082401656ee /apps/theming/lib/Controller | |
parent | e8511660f01faeebcc692b57cabdacd97845da92 (diff) | |
parent | 2ab4d1e0a3f15af2b8f04edcf18b7fe3fc0be262 (diff) | |
download | nextcloud-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.php | 174 | ||||
-rw-r--r-- | apps/theming/lib/Controller/ThemingController.php | 11 |
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); |