Completed
Pull Request — master (#3829)
by Maxence
12:57
created
apps/updatenotification/lib/ResetTokenBackgroundJob.php 1 patch
Indentation   +35 added lines, -35 removed lines patch added patch discarded remove patch
@@ -34,44 +34,44 @@
 block discarded – undo
34 34
  * @package OCA\UpdateNotification
35 35
  */
36 36
 class ResetTokenBackgroundJob extends TimedJob {
37
-	/** @var IConfig */
38
-	private $config;
39
-	/** @var ITimeFactory */
40
-	private $timeFactory;
37
+    /** @var IConfig */
38
+    private $config;
39
+    /** @var ITimeFactory */
40
+    private $timeFactory;
41 41
 
42
-	/**
43
-	 * @param IConfig|null $config
44
-	 * @param ITimeFactory|null $timeFactory
45
-	 */
46
-	public function __construct(IConfig $config = null,
47
-								ITimeFactory $timeFactory = null) {
48
-		// Run all 10 minutes
49
-		$this->setInterval(60 * 10);
42
+    /**
43
+     * @param IConfig|null $config
44
+     * @param ITimeFactory|null $timeFactory
45
+     */
46
+    public function __construct(IConfig $config = null,
47
+                                ITimeFactory $timeFactory = null) {
48
+        // Run all 10 minutes
49
+        $this->setInterval(60 * 10);
50 50
 
51
-		if ($config instanceof IConfig && $timeFactory instanceof ITimeFactory) {
52
-			$this->config = $config;
53
-			$this->timeFactory = $timeFactory;
54
-		} else {
55
-			$this->fixDIForJobs();
56
-		}
57
-	}
51
+        if ($config instanceof IConfig && $timeFactory instanceof ITimeFactory) {
52
+            $this->config = $config;
53
+            $this->timeFactory = $timeFactory;
54
+        } else {
55
+            $this->fixDIForJobs();
56
+        }
57
+    }
58 58
 
59
-	/**
60
-	 * DI for jobs
61
-	 */
62
-	private function fixDIForJobs() {
63
-		$this->config = \OC::$server->getConfig();
64
-		$this->timeFactory = new TimeFactory();
65
-	}
59
+    /**
60
+     * DI for jobs
61
+     */
62
+    private function fixDIForJobs() {
63
+        $this->config = \OC::$server->getConfig();
64
+        $this->timeFactory = new TimeFactory();
65
+    }
66 66
 
67
-	/**
68
-	 * @param $argument
69
-	 */
70
-	protected function run($argument) {
71
-		// Delete old tokens after 2 days
72
-		if($this->timeFactory->getTime() - $this->config->getAppValue('core', 'updater.secret.created', $this->timeFactory->getTime()) >= 172800) {
73
-			$this->config->deleteSystemValue('updater.secret');
74
-		}
75
-	}
67
+    /**
68
+     * @param $argument
69
+     */
70
+    protected function run($argument) {
71
+        // Delete old tokens after 2 days
72
+        if($this->timeFactory->getTime() - $this->config->getAppValue('core', 'updater.secret.created', $this->timeFactory->getTime()) >= 172800) {
73
+            $this->config->deleteSystemValue('updater.secret');
74
+        }
75
+    }
76 76
 
77 77
 }
Please login to merge, or discard this patch.
apps/updatenotification/appinfo/routes.php 1 patch
Indentation   +2 added lines, -2 removed lines patch added patch discarded remove patch
@@ -25,6 +25,6 @@
 block discarded – undo
25 25
 
26 26
 $application = new Application();
27 27
 $application->registerRoutes($this, ['routes' => [
28
-	['name' => 'Admin#createCredentials', 'url' => '/credentials', 'verb' => 'GET'],
29
-	['name' => 'Admin#setChannel', 'url' => '/channel', 'verb' => 'POST'],
28
+    ['name' => 'Admin#createCredentials', 'url' => '/credentials', 'verb' => 'GET'],
29
+    ['name' => 'Admin#setChannel', 'url' => '/channel', 'verb' => 'POST'],
30 30
 ]]);
Please login to merge, or discard this patch.
apps/updatenotification/appinfo/app.php 1 patch
Indentation   +27 added lines, -27 removed lines patch added patch discarded remove patch
@@ -23,33 +23,33 @@
 block discarded – undo
23 23
  */
24 24
 
25 25
 if(\OC::$server->getConfig()->getSystemValue('updatechecker', true) === true) {
26
-	$updater = new \OC\Updater\VersionCheck(
27
-		\OC::$server->getHTTPClientService(),
28
-		\OC::$server->getConfig()
29
-	);
30
-	$updateChecker = new \OCA\UpdateNotification\UpdateChecker(
31
-		$updater
32
-	);
26
+    $updater = new \OC\Updater\VersionCheck(
27
+        \OC::$server->getHTTPClientService(),
28
+        \OC::$server->getConfig()
29
+    );
30
+    $updateChecker = new \OCA\UpdateNotification\UpdateChecker(
31
+        $updater
32
+    );
33 33
 
34
-	$userObject = \OC::$server->getUserSession()->getUser();
35
-	if($userObject !== null) {
36
-		if(\OC::$server->getGroupManager()->isAdmin($userObject->getUID()) &&
37
-			!\OC::$server->getAppManager()->isEnabledForUser('notifications')) {
38
-			if($updateChecker->getUpdateState() !== []) {
39
-				\OCP\Util::addScript('updatenotification', 'notification');
40
-				OC_Hook::connect('\OCP\Config', 'js', $updateChecker, 'getJavaScript');
41
-			}
42
-		}
43
-	}
34
+    $userObject = \OC::$server->getUserSession()->getUser();
35
+    if($userObject !== null) {
36
+        if(\OC::$server->getGroupManager()->isAdmin($userObject->getUID()) &&
37
+            !\OC::$server->getAppManager()->isEnabledForUser('notifications')) {
38
+            if($updateChecker->getUpdateState() !== []) {
39
+                \OCP\Util::addScript('updatenotification', 'notification');
40
+                OC_Hook::connect('\OCP\Config', 'js', $updateChecker, 'getJavaScript');
41
+            }
42
+        }
43
+    }
44 44
 
45
-	$manager = \OC::$server->getNotificationManager();
46
-	$manager->registerNotifier(function() use ($manager) {
47
-		return \OC::$server->query(\OCA\UpdateNotification\Notification\Notifier::class);
48
-	}, function() {
49
-		$l = \OC::$server->getL10N('updatenotification');
50
-		return [
51
-			'id' => 'updatenotification',
52
-			'name' => $l->t('Update notifications'),
53
-		];
54
-	});
45
+    $manager = \OC::$server->getNotificationManager();
46
+    $manager->registerNotifier(function() use ($manager) {
47
+        return \OC::$server->query(\OCA\UpdateNotification\Notification\Notifier::class);
48
+    }, function() {
49
+        $l = \OC::$server->getL10N('updatenotification');
50
+        return [
51
+            'id' => 'updatenotification',
52
+            'name' => $l->t('Update notifications'),
53
+        ];
54
+    });
55 55
 }
Please login to merge, or discard this patch.
apps/theming/templates/settings-admin.php 1 patch
Indentation   -1 removed lines patch added patch discarded remove patch
@@ -1,6 +1,5 @@
 block discarded – undo
1 1
 <?php
2 2
 /**
3
-
4 3
  *
5 4
  * @author Bjoern Schiessle <[email protected]>
6 5
  * @author Jan-Christoph Borchardt <[email protected]>
Please login to merge, or discard this patch.
apps/theming/lib/ThemingDefaults.php 1 patch
Indentation   +191 added lines, -191 removed lines patch added patch discarded remove patch
@@ -31,196 +31,196 @@
 block discarded – undo
31 31
 
32 32
 class ThemingDefaults extends \OC_Defaults {
33 33
 
34
-	/** @var IConfig */
35
-	private $config;
36
-	/** @var IL10N */
37
-	private $l;
38
-	/** @var IURLGenerator */
39
-	private $urlGenerator;
40
-	/** @var IRootFolder */
41
-	private $rootFolder;
42
-	/** @var ICacheFactory */
43
-	private $cacheFactory;
44
-	/** @var string */
45
-	private $name;
46
-	/** @var string */
47
-	private $url;
48
-	/** @var string */
49
-	private $slogan;
50
-	/** @var string */
51
-	private $color;
52
-
53
-	/**
54
-	 * ThemingDefaults constructor.
55
-	 *
56
-	 * @param IConfig $config
57
-	 * @param IL10N $l
58
-	 * @param IURLGenerator $urlGenerator
59
-	 * @param \OC_Defaults $defaults
60
-	 * @param IRootFolder $rootFolder
61
-	 * @param ICacheFactory $cacheFactory
62
-	 */
63
-	public function __construct(IConfig $config,
64
-								IL10N $l,
65
-								IURLGenerator $urlGenerator,
66
-								\OC_Defaults $defaults,
67
-								IRootFolder $rootFolder,
68
-								ICacheFactory $cacheFactory
69
-	) {
70
-		parent::__construct();
71
-		$this->config = $config;
72
-		$this->l = $l;
73
-		$this->urlGenerator = $urlGenerator;
74
-		$this->rootFolder = $rootFolder;
75
-		$this->cacheFactory = $cacheFactory;
76
-
77
-		$this->name = $defaults->getName();
78
-		$this->url = $defaults->getBaseUrl();
79
-		$this->slogan = $defaults->getSlogan();
80
-		$this->color = $defaults->getMailHeaderColor();
81
-	}
82
-
83
-	public function getName() {
84
-		return $this->config->getAppValue('theming', 'name', $this->name);
85
-	}
86
-
87
-	public function getHTMLName() {
88
-		return $this->config->getAppValue('theming', 'name', $this->name);
89
-	}
90
-
91
-	public function getTitle() {
92
-		return $this->config->getAppValue('theming', 'name', $this->name);
93
-	}
94
-
95
-	public function getEntity() {
96
-		return $this->config->getAppValue('theming', 'name', $this->name);
97
-	}
98
-
99
-	public function getBaseUrl() {
100
-		return $this->config->getAppValue('theming', 'url', $this->url);
101
-	}
102
-
103
-	public function getSlogan() {
104
-		return $this->config->getAppValue('theming', 'slogan', $this->slogan);
105
-	}
106
-
107
-	public function getShortFooter() {
108
-		$slogan = $this->getSlogan();
109
-		$footer = '<a href="'. $this->getBaseUrl() . '" target="_blank"' .
110
-			' rel="noreferrer">' .$this->getEntity() . '</a>'.
111
-			($slogan !== '' ? ' – ' . $slogan : '');
112
-
113
-		return $footer;
114
-	}
115
-
116
-	/**
117
-	 * Color that is used for the header as well as for mail headers
118
-	 *
119
-	 * @return string
120
-	 */
121
-	public function getMailHeaderColor() {
122
-		return $this->config->getAppValue('theming', 'color', $this->color);
123
-	}
124
-
125
-	/**
126
-	 * Themed logo url
127
-	 *
128
-	 * @return string
129
-	 */
130
-	public function getLogo() {
131
-		$logo = $this->config->getAppValue('theming', 'logoMime');
132
-		if(!$logo || !$this->rootFolder->nodeExists('/themedinstancelogo')) {
133
-			return $this->urlGenerator->imagePath('core','logo.svg');
134
-		} else {
135
-			return $this->urlGenerator->linkToRoute('theming.Theming.getLogo');
136
-		}
137
-	}
138
-
139
-	/**
140
-	 * Themed background image url
141
-	 *
142
-	 * @return string
143
-	 */
144
-	public function getBackground() {
145
-		$backgroundLogo = $this->config->getAppValue('theming', 'backgroundMime');
146
-		if(!$backgroundLogo || !$this->rootFolder->nodeExists('/themedbackgroundlogo')) {
147
-			return $this->urlGenerator->imagePath('core','background.jpg');
148
-		} else {
149
-			return $this->urlGenerator->linkToRoute('theming.Theming.getLoginBackground');
150
-		}
151
-	}
152
-
153
-	/**
154
-	 * Check if Imagemagick is enabled and if SVG is supported
155
-	 * otherwise we can't render custom icons
156
-	 *
157
-	 * @return bool
158
-	 */
159
-	public function shouldReplaceIcons() {
160
-		$cache = $this->cacheFactory->create('theming');
161
-		if($value = $cache->get('shouldReplaceIcons')) {
162
-			return (bool)$value;
163
-		}
164
-		$value = false;
165
-		if(extension_loaded('imagick')) {
166
-			$checkImagick = new \Imagick();
167
-			if (count($checkImagick->queryFormats('SVG')) >= 1) {
168
-				$value = true;
169
-			}
170
-			$checkImagick->clear();
171
-		}
172
-		$cache->set('shouldReplaceIcons', $value);
173
-		return $value;
174
-	}
175
-
176
-	/**
177
-	 * Increases the cache buster key
178
-	 */
179
-	private function increaseCacheBuster() {
180
-		$cacheBusterKey = $this->config->getAppValue('theming', 'cachebuster', '0');
181
-		$this->config->setAppValue('theming', 'cachebuster', (int)$cacheBusterKey+1);
182
-	}
183
-
184
-	/**
185
-	 * Update setting in the database
186
-	 *
187
-	 * @param string $setting
188
-	 * @param string $value
189
-	 */
190
-	public function set($setting, $value) {
191
-		$this->config->setAppValue('theming', $setting, $value);
192
-		$this->increaseCacheBuster();
193
-	}
194
-
195
-	/**
196
-	 * Revert settings to the default value
197
-	 *
198
-	 * @param string $setting setting which should be reverted
199
-	 * @return string default value
200
-	 */
201
-	public function undo($setting) {
202
-		$this->config->deleteAppValue('theming', $setting);
203
-		$this->increaseCacheBuster();
204
-
205
-		switch ($setting) {
206
-			case 'name':
207
-				$returnValue = $this->getEntity();
208
-				break;
209
-			case 'url':
210
-				$returnValue = $this->getBaseUrl();
211
-				break;
212
-			case 'slogan':
213
-				$returnValue = $this->getSlogan();
214
-				break;
215
-			case 'color':
216
-				$returnValue = $this->getMailHeaderColor();
217
-				break;
218
-			default:
219
-				$returnValue = '';
220
-				break;
221
-		}
222
-
223
-		return $returnValue;
224
-	}
34
+    /** @var IConfig */
35
+    private $config;
36
+    /** @var IL10N */
37
+    private $l;
38
+    /** @var IURLGenerator */
39
+    private $urlGenerator;
40
+    /** @var IRootFolder */
41
+    private $rootFolder;
42
+    /** @var ICacheFactory */
43
+    private $cacheFactory;
44
+    /** @var string */
45
+    private $name;
46
+    /** @var string */
47
+    private $url;
48
+    /** @var string */
49
+    private $slogan;
50
+    /** @var string */
51
+    private $color;
52
+
53
+    /**
54
+     * ThemingDefaults constructor.
55
+     *
56
+     * @param IConfig $config
57
+     * @param IL10N $l
58
+     * @param IURLGenerator $urlGenerator
59
+     * @param \OC_Defaults $defaults
60
+     * @param IRootFolder $rootFolder
61
+     * @param ICacheFactory $cacheFactory
62
+     */
63
+    public function __construct(IConfig $config,
64
+                                IL10N $l,
65
+                                IURLGenerator $urlGenerator,
66
+                                \OC_Defaults $defaults,
67
+                                IRootFolder $rootFolder,
68
+                                ICacheFactory $cacheFactory
69
+    ) {
70
+        parent::__construct();
71
+        $this->config = $config;
72
+        $this->l = $l;
73
+        $this->urlGenerator = $urlGenerator;
74
+        $this->rootFolder = $rootFolder;
75
+        $this->cacheFactory = $cacheFactory;
76
+
77
+        $this->name = $defaults->getName();
78
+        $this->url = $defaults->getBaseUrl();
79
+        $this->slogan = $defaults->getSlogan();
80
+        $this->color = $defaults->getMailHeaderColor();
81
+    }
82
+
83
+    public function getName() {
84
+        return $this->config->getAppValue('theming', 'name', $this->name);
85
+    }
86
+
87
+    public function getHTMLName() {
88
+        return $this->config->getAppValue('theming', 'name', $this->name);
89
+    }
90
+
91
+    public function getTitle() {
92
+        return $this->config->getAppValue('theming', 'name', $this->name);
93
+    }
94
+
95
+    public function getEntity() {
96
+        return $this->config->getAppValue('theming', 'name', $this->name);
97
+    }
98
+
99
+    public function getBaseUrl() {
100
+        return $this->config->getAppValue('theming', 'url', $this->url);
101
+    }
102
+
103
+    public function getSlogan() {
104
+        return $this->config->getAppValue('theming', 'slogan', $this->slogan);
105
+    }
106
+
107
+    public function getShortFooter() {
108
+        $slogan = $this->getSlogan();
109
+        $footer = '<a href="'. $this->getBaseUrl() . '" target="_blank"' .
110
+            ' rel="noreferrer">' .$this->getEntity() . '</a>'.
111
+            ($slogan !== '' ? ' – ' . $slogan : '');
112
+
113
+        return $footer;
114
+    }
115
+
116
+    /**
117
+     * Color that is used for the header as well as for mail headers
118
+     *
119
+     * @return string
120
+     */
121
+    public function getMailHeaderColor() {
122
+        return $this->config->getAppValue('theming', 'color', $this->color);
123
+    }
124
+
125
+    /**
126
+     * Themed logo url
127
+     *
128
+     * @return string
129
+     */
130
+    public function getLogo() {
131
+        $logo = $this->config->getAppValue('theming', 'logoMime');
132
+        if(!$logo || !$this->rootFolder->nodeExists('/themedinstancelogo')) {
133
+            return $this->urlGenerator->imagePath('core','logo.svg');
134
+        } else {
135
+            return $this->urlGenerator->linkToRoute('theming.Theming.getLogo');
136
+        }
137
+    }
138
+
139
+    /**
140
+     * Themed background image url
141
+     *
142
+     * @return string
143
+     */
144
+    public function getBackground() {
145
+        $backgroundLogo = $this->config->getAppValue('theming', 'backgroundMime');
146
+        if(!$backgroundLogo || !$this->rootFolder->nodeExists('/themedbackgroundlogo')) {
147
+            return $this->urlGenerator->imagePath('core','background.jpg');
148
+        } else {
149
+            return $this->urlGenerator->linkToRoute('theming.Theming.getLoginBackground');
150
+        }
151
+    }
152
+
153
+    /**
154
+     * Check if Imagemagick is enabled and if SVG is supported
155
+     * otherwise we can't render custom icons
156
+     *
157
+     * @return bool
158
+     */
159
+    public function shouldReplaceIcons() {
160
+        $cache = $this->cacheFactory->create('theming');
161
+        if($value = $cache->get('shouldReplaceIcons')) {
162
+            return (bool)$value;
163
+        }
164
+        $value = false;
165
+        if(extension_loaded('imagick')) {
166
+            $checkImagick = new \Imagick();
167
+            if (count($checkImagick->queryFormats('SVG')) >= 1) {
168
+                $value = true;
169
+            }
170
+            $checkImagick->clear();
171
+        }
172
+        $cache->set('shouldReplaceIcons', $value);
173
+        return $value;
174
+    }
175
+
176
+    /**
177
+     * Increases the cache buster key
178
+     */
179
+    private function increaseCacheBuster() {
180
+        $cacheBusterKey = $this->config->getAppValue('theming', 'cachebuster', '0');
181
+        $this->config->setAppValue('theming', 'cachebuster', (int)$cacheBusterKey+1);
182
+    }
183
+
184
+    /**
185
+     * Update setting in the database
186
+     *
187
+     * @param string $setting
188
+     * @param string $value
189
+     */
190
+    public function set($setting, $value) {
191
+        $this->config->setAppValue('theming', $setting, $value);
192
+        $this->increaseCacheBuster();
193
+    }
194
+
195
+    /**
196
+     * Revert settings to the default value
197
+     *
198
+     * @param string $setting setting which should be reverted
199
+     * @return string default value
200
+     */
201
+    public function undo($setting) {
202
+        $this->config->deleteAppValue('theming', $setting);
203
+        $this->increaseCacheBuster();
204
+
205
+        switch ($setting) {
206
+            case 'name':
207
+                $returnValue = $this->getEntity();
208
+                break;
209
+            case 'url':
210
+                $returnValue = $this->getBaseUrl();
211
+                break;
212
+            case 'slogan':
213
+                $returnValue = $this->getSlogan();
214
+                break;
215
+            case 'color':
216
+                $returnValue = $this->getMailHeaderColor();
217
+                break;
218
+            default:
219
+                $returnValue = '';
220
+                break;
221
+        }
222
+
223
+        return $returnValue;
224
+    }
225 225
 
226 226
 }
Please login to merge, or discard this patch.
apps/theming/lib/Util.php 1 patch
Indentation   +159 added lines, -159 removed lines patch added patch discarded remove patch
@@ -30,164 +30,164 @@
 block discarded – undo
30 30
 
31 31
 class Util {
32 32
 
33
-	/** @var IConfig */
34
-	private $config;
35
-
36
-	/** @var IRootFolder */
37
-	private $rootFolder;
38
-
39
-	/** @var IAppManager */
40
-	private $appManager;
41
-
42
-	/**
43
-	 * Util constructor.
44
-	 *
45
-	 * @param IConfig $config
46
-	 * @param IRootFolder $rootFolder
47
-	 * @param IAppManager $appManager
48
-	 */
49
-	public function __construct(IConfig $config, IRootFolder $rootFolder, IAppManager $appManager) {
50
-		$this->config = $config;
51
-		$this->rootFolder = $rootFolder;
52
-		$this->appManager = $appManager;
53
-	}
54
-
55
-	/**
56
-	 * @param string $color rgb color value
57
-	 * @return bool
58
-	 */
59
-	public function invertTextColor($color) {
60
-		$l = $this->calculateLuminance($color);
61
-		if($l>0.5) {
62
-			return true;
63
-		} else {
64
-			return false;
65
-		}
66
-	}
67
-
68
-	/**
69
-	 * get color for on-page elements:
70
-	 * theme color by default, grey if theme color is to bright
71
-	 * @param $color
72
-	 * @return string
73
-	 */
74
-	public function elementColor($color) {
75
-		$l = $this->calculateLuminance($color);
76
-		if($l>0.8) {
77
-			return '#555555';
78
-		} else {
79
-			return $color;
80
-		}
81
-	}
82
-
83
-	/**
84
-	 * @param string $color rgb color value
85
-	 * @return float
86
-	 */
87
-	public function calculateLuminance($color) {
88
-		$hex = preg_replace("/[^0-9A-Fa-f]/", '', $color);
89
-		if (strlen($hex) === 3) {
90
-			$hex = $hex{0} . $hex{0} . $hex{1} . $hex{1} . $hex{2} . $hex{2};
91
-		}
92
-		if (strlen($hex) !== 6) {
93
-			return 0;
94
-		}
95
-		$r = hexdec(substr($hex, 0, 2));
96
-		$g = hexdec(substr($hex, 2, 2));
97
-		$b = hexdec(substr($hex, 4, 2));
98
-		return (0.299 * $r + 0.587 * $g + 0.114 * $b)/255;
99
-	}
100
-
101
-	/**
102
-	 * @param $color
103
-	 * @return string base64 encoded radio button svg
104
-	 */
105
-	public function generateRadioButton($color) {
106
-		$radioButtonIcon = '<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16">' .
107
-			'<path d="M8 1a7 7 0 0 0-7 7 7 7 0 0 0 7 7 7 7 0 0 0 7-7 7 7 0 0 0-7-7zm0 1a6 6 0 0 1 6 6 6 6 0 0 1-6 6 6 6 0 0 1-6-6 6 6 0 0 1 6-6zm0 2a4 4 0 1 0 0 8 4 4 0 0 0 0-8z" fill="'.$color.'"/></svg>';
108
-		return base64_encode($radioButtonIcon);
109
-	}
110
-
111
-
112
-	/**
113
-	 * @param $app string app name
114
-	 * @return string path to app icon / logo
115
-	 */
116
-	public function getAppIcon($app) {
117
-		$app = str_replace(array('\0', '/', '\\', '..'), '', $app);
118
-		try {
119
-			$appPath = $this->appManager->getAppPath($app);
120
-			$icon = $appPath . '/img/' . $app . '.svg';
121
-			if (file_exists($icon)) {
122
-				return $icon;
123
-			}
124
-			$icon = $appPath . '/img/app.svg';
125
-			if (file_exists($icon)) {
126
-				return $icon;
127
-			}
128
-		} catch (AppPathNotFoundException $e) {}
129
-
130
-		if($this->config->getAppValue('theming', 'logoMime', '') !== '' && $this->rootFolder->nodeExists('/themedinstancelogo')) {
131
-			return $this->config->getSystemValue('datadirectory', \OC::$SERVERROOT . '/data') . '/themedinstancelogo';
132
-		}
133
-		return \OC::$SERVERROOT . '/core/img/logo.svg';
134
-	}
135
-
136
-	/**
137
-	 * @param $app string app name
138
-	 * @param $image string relative path to image in app folder
139
-	 * @return string|false absolute path to image
140
-	 */
141
-	public function getAppImage($app, $image) {
142
-		$app = str_replace(array('\0', '/', '\\', '..'), '', $app);
143
-		$image = str_replace(array('\0', '\\', '..'), '', $image);
144
-		if ($app === "core") {
145
-			$icon = \OC::$SERVERROOT . '/core/img/' . $image;
146
-			if (file_exists($icon)) {
147
-				return $icon;
148
-			}
149
-		}
150
-
151
-		try {
152
-			$appPath = $this->appManager->getAppPath($app);
153
-		} catch (AppPathNotFoundException $e) {
154
-			return false;
155
-		}
156
-
157
-		$icon = $appPath . '/img/' . $image;
158
-		if (file_exists($icon)) {
159
-			return $icon;
160
-		}
161
-		$icon = $appPath . '/img/' . $image . '.svg';
162
-		if (file_exists($icon)) {
163
-			return $icon;
164
-		}
165
-		$icon = $appPath . '/img/' . $image . '.png';
166
-		if (file_exists($icon)) {
167
-			return $icon;
168
-		}
169
-		$icon = $appPath . '/img/' . $image . '.gif';
170
-		if (file_exists($icon)) {
171
-			return $icon;
172
-		}
173
-		$icon = $appPath . '/img/' . $image . '.jpg';
174
-		if (file_exists($icon)) {
175
-			return $icon;
176
-		}
177
-
178
-		return false;
179
-	}
180
-
181
-	/**
182
-	 * replace default color with a custom one
183
-	 *
184
-	 * @param $svg string content of a svg file
185
-	 * @param $color string color to match
186
-	 * @return string
187
-	 */
188
-	public function colorizeSvg($svg, $color) {
189
-		$svg = preg_replace('/#0082c9/i', $color, $svg);
190
-		return $svg;
191
-	}
33
+    /** @var IConfig */
34
+    private $config;
35
+
36
+    /** @var IRootFolder */
37
+    private $rootFolder;
38
+
39
+    /** @var IAppManager */
40
+    private $appManager;
41
+
42
+    /**
43
+     * Util constructor.
44
+     *
45
+     * @param IConfig $config
46
+     * @param IRootFolder $rootFolder
47
+     * @param IAppManager $appManager
48
+     */
49
+    public function __construct(IConfig $config, IRootFolder $rootFolder, IAppManager $appManager) {
50
+        $this->config = $config;
51
+        $this->rootFolder = $rootFolder;
52
+        $this->appManager = $appManager;
53
+    }
54
+
55
+    /**
56
+     * @param string $color rgb color value
57
+     * @return bool
58
+     */
59
+    public function invertTextColor($color) {
60
+        $l = $this->calculateLuminance($color);
61
+        if($l>0.5) {
62
+            return true;
63
+        } else {
64
+            return false;
65
+        }
66
+    }
67
+
68
+    /**
69
+     * get color for on-page elements:
70
+     * theme color by default, grey if theme color is to bright
71
+     * @param $color
72
+     * @return string
73
+     */
74
+    public function elementColor($color) {
75
+        $l = $this->calculateLuminance($color);
76
+        if($l>0.8) {
77
+            return '#555555';
78
+        } else {
79
+            return $color;
80
+        }
81
+    }
82
+
83
+    /**
84
+     * @param string $color rgb color value
85
+     * @return float
86
+     */
87
+    public function calculateLuminance($color) {
88
+        $hex = preg_replace("/[^0-9A-Fa-f]/", '', $color);
89
+        if (strlen($hex) === 3) {
90
+            $hex = $hex{0} . $hex{0} . $hex{1} . $hex{1} . $hex{2} . $hex{2};
91
+        }
92
+        if (strlen($hex) !== 6) {
93
+            return 0;
94
+        }
95
+        $r = hexdec(substr($hex, 0, 2));
96
+        $g = hexdec(substr($hex, 2, 2));
97
+        $b = hexdec(substr($hex, 4, 2));
98
+        return (0.299 * $r + 0.587 * $g + 0.114 * $b)/255;
99
+    }
100
+
101
+    /**
102
+     * @param $color
103
+     * @return string base64 encoded radio button svg
104
+     */
105
+    public function generateRadioButton($color) {
106
+        $radioButtonIcon = '<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16">' .
107
+            '<path d="M8 1a7 7 0 0 0-7 7 7 7 0 0 0 7 7 7 7 0 0 0 7-7 7 7 0 0 0-7-7zm0 1a6 6 0 0 1 6 6 6 6 0 0 1-6 6 6 6 0 0 1-6-6 6 6 0 0 1 6-6zm0 2a4 4 0 1 0 0 8 4 4 0 0 0 0-8z" fill="'.$color.'"/></svg>';
108
+        return base64_encode($radioButtonIcon);
109
+    }
110
+
111
+
112
+    /**
113
+     * @param $app string app name
114
+     * @return string path to app icon / logo
115
+     */
116
+    public function getAppIcon($app) {
117
+        $app = str_replace(array('\0', '/', '\\', '..'), '', $app);
118
+        try {
119
+            $appPath = $this->appManager->getAppPath($app);
120
+            $icon = $appPath . '/img/' . $app . '.svg';
121
+            if (file_exists($icon)) {
122
+                return $icon;
123
+            }
124
+            $icon = $appPath . '/img/app.svg';
125
+            if (file_exists($icon)) {
126
+                return $icon;
127
+            }
128
+        } catch (AppPathNotFoundException $e) {}
129
+
130
+        if($this->config->getAppValue('theming', 'logoMime', '') !== '' && $this->rootFolder->nodeExists('/themedinstancelogo')) {
131
+            return $this->config->getSystemValue('datadirectory', \OC::$SERVERROOT . '/data') . '/themedinstancelogo';
132
+        }
133
+        return \OC::$SERVERROOT . '/core/img/logo.svg';
134
+    }
135
+
136
+    /**
137
+     * @param $app string app name
138
+     * @param $image string relative path to image in app folder
139
+     * @return string|false absolute path to image
140
+     */
141
+    public function getAppImage($app, $image) {
142
+        $app = str_replace(array('\0', '/', '\\', '..'), '', $app);
143
+        $image = str_replace(array('\0', '\\', '..'), '', $image);
144
+        if ($app === "core") {
145
+            $icon = \OC::$SERVERROOT . '/core/img/' . $image;
146
+            if (file_exists($icon)) {
147
+                return $icon;
148
+            }
149
+        }
150
+
151
+        try {
152
+            $appPath = $this->appManager->getAppPath($app);
153
+        } catch (AppPathNotFoundException $e) {
154
+            return false;
155
+        }
156
+
157
+        $icon = $appPath . '/img/' . $image;
158
+        if (file_exists($icon)) {
159
+            return $icon;
160
+        }
161
+        $icon = $appPath . '/img/' . $image . '.svg';
162
+        if (file_exists($icon)) {
163
+            return $icon;
164
+        }
165
+        $icon = $appPath . '/img/' . $image . '.png';
166
+        if (file_exists($icon)) {
167
+            return $icon;
168
+        }
169
+        $icon = $appPath . '/img/' . $image . '.gif';
170
+        if (file_exists($icon)) {
171
+            return $icon;
172
+        }
173
+        $icon = $appPath . '/img/' . $image . '.jpg';
174
+        if (file_exists($icon)) {
175
+            return $icon;
176
+        }
177
+
178
+        return false;
179
+    }
180
+
181
+    /**
182
+     * replace default color with a custom one
183
+     *
184
+     * @param $svg string content of a svg file
185
+     * @param $color string color to match
186
+     * @return string
187
+     */
188
+    public function colorizeSvg($svg, $color) {
189
+        $svg = preg_replace('/#0082c9/i', $color, $svg);
190
+        return $svg;
191
+    }
192 192
 
193 193
 }
Please login to merge, or discard this patch.
apps/theming/lib/Controller/IconController.php 1 patch
Indentation   +133 added lines, -133 removed lines patch added patch discarded remove patch
@@ -36,142 +36,142 @@
 block discarded – undo
36 36
 use OCP\IConfig;
37 37
 
38 38
 class IconController extends Controller {
39
-	/** @var ThemingDefaults */
40
-	private $themingDefaults;
41
-	/** @var Util */
42
-	private $util;
43
-	/** @var ITimeFactory */
44
-	private $timeFactory;
45
-	/** @var IConfig */
46
-	private $config;
47
-	/** @var IconBuilder */
48
-	private $iconBuilder;
49
-	/** @var ImageManager */
50
-	private $imageManager;
39
+    /** @var ThemingDefaults */
40
+    private $themingDefaults;
41
+    /** @var Util */
42
+    private $util;
43
+    /** @var ITimeFactory */
44
+    private $timeFactory;
45
+    /** @var IConfig */
46
+    private $config;
47
+    /** @var IconBuilder */
48
+    private $iconBuilder;
49
+    /** @var ImageManager */
50
+    private $imageManager;
51 51
 
52
-	/**
53
-	 * IconController constructor.
54
-	 *
55
-	 * @param string $appName
56
-	 * @param IRequest $request
57
-	 * @param ThemingDefaults $themingDefaults
58
-	 * @param Util $util
59
-	 * @param ITimeFactory $timeFactory
60
-	 * @param IConfig $config
61
-	 * @param IconBuilder $iconBuilder
62
-	 * @param ImageManager $imageManager
63
-	 */
64
-	public function __construct(
65
-		$appName,
66
-		IRequest $request,
67
-		ThemingDefaults $themingDefaults,
68
-		Util $util,
69
-		ITimeFactory $timeFactory,
70
-		IConfig $config,
71
-		IconBuilder $iconBuilder,
72
-		ImageManager $imageManager
73
-	) {
74
-		parent::__construct($appName, $request);
52
+    /**
53
+     * IconController constructor.
54
+     *
55
+     * @param string $appName
56
+     * @param IRequest $request
57
+     * @param ThemingDefaults $themingDefaults
58
+     * @param Util $util
59
+     * @param ITimeFactory $timeFactory
60
+     * @param IConfig $config
61
+     * @param IconBuilder $iconBuilder
62
+     * @param ImageManager $imageManager
63
+     */
64
+    public function __construct(
65
+        $appName,
66
+        IRequest $request,
67
+        ThemingDefaults $themingDefaults,
68
+        Util $util,
69
+        ITimeFactory $timeFactory,
70
+        IConfig $config,
71
+        IconBuilder $iconBuilder,
72
+        ImageManager $imageManager
73
+    ) {
74
+        parent::__construct($appName, $request);
75 75
 
76
-		$this->themingDefaults = $themingDefaults;
77
-		$this->util = $util;
78
-		$this->timeFactory = $timeFactory;
79
-		$this->config = $config;
80
-		$this->iconBuilder = $iconBuilder;
81
-		$this->imageManager = $imageManager;
82
-	}
76
+        $this->themingDefaults = $themingDefaults;
77
+        $this->util = $util;
78
+        $this->timeFactory = $timeFactory;
79
+        $this->config = $config;
80
+        $this->iconBuilder = $iconBuilder;
81
+        $this->imageManager = $imageManager;
82
+    }
83 83
 
84
-	/**
85
-	 * @PublicPage
86
-	 * @NoCSRFRequired
87
-	 *
88
-	 * @param $app string app name
89
-	 * @param $image string image file name (svg required)
90
-	 * @return FileDisplayResponse|NotFoundResponse
91
-	 */
92
-	public function getThemedIcon($app, $image) {
93
-		try {
94
-			$iconFile = $this->imageManager->getCachedImage("icon-" . $app . '-' . str_replace("/","_",$image));
95
-		} catch (NotFoundException $exception) {
96
-			$icon = $this->iconBuilder->colorSvg($app, $image);
97
-			if ($icon === false || $icon === "") {
98
-				return new NotFoundResponse();
99
-			}
100
-			$iconFile = $this->imageManager->setCachedImage("icon-" . $app . '-' . str_replace("/","_",$image), $icon);
101
-		}
102
-		if ($iconFile !== false) {
103
-			$response = new FileDisplayResponse($iconFile, Http::STATUS_OK, ['Content-Type' => 'image/svg+xml']);
104
-			$response->cacheFor(86400);
105
-			$expires = new \DateTime();
106
-			$expires->setTimestamp($this->timeFactory->getTime());
107
-			$expires->add(new \DateInterval('PT24H'));
108
-			$response->addHeader('Expires', $expires->format(\DateTime::RFC2822));
109
-			$response->addHeader('Pragma', 'cache');
110
-			return $response;
111
-		} else {
112
-			return new NotFoundResponse();
113
-		}
114
-	}
84
+    /**
85
+     * @PublicPage
86
+     * @NoCSRFRequired
87
+     *
88
+     * @param $app string app name
89
+     * @param $image string image file name (svg required)
90
+     * @return FileDisplayResponse|NotFoundResponse
91
+     */
92
+    public function getThemedIcon($app, $image) {
93
+        try {
94
+            $iconFile = $this->imageManager->getCachedImage("icon-" . $app . '-' . str_replace("/","_",$image));
95
+        } catch (NotFoundException $exception) {
96
+            $icon = $this->iconBuilder->colorSvg($app, $image);
97
+            if ($icon === false || $icon === "") {
98
+                return new NotFoundResponse();
99
+            }
100
+            $iconFile = $this->imageManager->setCachedImage("icon-" . $app . '-' . str_replace("/","_",$image), $icon);
101
+        }
102
+        if ($iconFile !== false) {
103
+            $response = new FileDisplayResponse($iconFile, Http::STATUS_OK, ['Content-Type' => 'image/svg+xml']);
104
+            $response->cacheFor(86400);
105
+            $expires = new \DateTime();
106
+            $expires->setTimestamp($this->timeFactory->getTime());
107
+            $expires->add(new \DateInterval('PT24H'));
108
+            $response->addHeader('Expires', $expires->format(\DateTime::RFC2822));
109
+            $response->addHeader('Pragma', 'cache');
110
+            return $response;
111
+        } else {
112
+            return new NotFoundResponse();
113
+        }
114
+    }
115 115
 
116
-	/**
117
-	 * Return a 32x32 favicon as png
118
-	 *
119
-	 * @PublicPage
120
-	 * @NoCSRFRequired
121
-	 *
122
-	 * @param $app string app name
123
-	 * @return FileDisplayResponse|NotFoundResponse
124
-	 */
125
-	public function getFavicon($app = "core") {
126
-		if ($this->themingDefaults->shouldReplaceIcons()) {
127
-			try {
128
-				$iconFile = $this->imageManager->getCachedImage('favIcon-' . $app);
129
-			} catch (NotFoundException $exception) {
130
-				$icon = $this->iconBuilder->getFavicon($app);
131
-				$iconFile = $this->imageManager->setCachedImage('favIcon-' . $app, $icon);
132
-			}
133
-			if ($iconFile !== false) {
134
-				$response = new FileDisplayResponse($iconFile, Http::STATUS_OK, ['Content-Type' => 'image/x-icon']);
135
-				$response->cacheFor(86400);
136
-				$expires = new \DateTime();
137
-				$expires->setTimestamp($this->timeFactory->getTime());
138
-				$expires->add(new \DateInterval('PT24H'));
139
-				$response->addHeader('Expires', $expires->format(\DateTime::RFC2822));
140
-				$response->addHeader('Pragma', 'cache');
141
-				return $response;
142
-			}
143
-		}
144
-		return new NotFoundResponse();
145
-	}
116
+    /**
117
+     * Return a 32x32 favicon as png
118
+     *
119
+     * @PublicPage
120
+     * @NoCSRFRequired
121
+     *
122
+     * @param $app string app name
123
+     * @return FileDisplayResponse|NotFoundResponse
124
+     */
125
+    public function getFavicon($app = "core") {
126
+        if ($this->themingDefaults->shouldReplaceIcons()) {
127
+            try {
128
+                $iconFile = $this->imageManager->getCachedImage('favIcon-' . $app);
129
+            } catch (NotFoundException $exception) {
130
+                $icon = $this->iconBuilder->getFavicon($app);
131
+                $iconFile = $this->imageManager->setCachedImage('favIcon-' . $app, $icon);
132
+            }
133
+            if ($iconFile !== false) {
134
+                $response = new FileDisplayResponse($iconFile, Http::STATUS_OK, ['Content-Type' => 'image/x-icon']);
135
+                $response->cacheFor(86400);
136
+                $expires = new \DateTime();
137
+                $expires->setTimestamp($this->timeFactory->getTime());
138
+                $expires->add(new \DateInterval('PT24H'));
139
+                $response->addHeader('Expires', $expires->format(\DateTime::RFC2822));
140
+                $response->addHeader('Pragma', 'cache');
141
+                return $response;
142
+            }
143
+        }
144
+        return new NotFoundResponse();
145
+    }
146 146
 
147
-	/**
148
-	 * Return a 512x512 icon for touch devices
149
-	 *
150
-	 * @PublicPage
151
-	 * @NoCSRFRequired
152
-	 *
153
-	 * @param $app string app name
154
-	 * @return FileDisplayResponse|NotFoundResponse
155
-	 */
156
-	public function getTouchIcon($app = "core") {
157
-		if ($this->themingDefaults->shouldReplaceIcons()) {
158
-			try {
159
-				$iconFile = $this->imageManager->getCachedImage('touchIcon-' . $app);
160
-			} catch (NotFoundException $exception) {
161
-				$icon = $this->iconBuilder->getTouchIcon($app);
162
-				$iconFile = $this->imageManager->setCachedImage('touchIcon-' . $app, $icon);
163
-			}
164
-			if ($iconFile !== false) {
165
-				$response = new FileDisplayResponse($iconFile, Http::STATUS_OK, ['Content-Type' => 'image/png']);
166
-				$response->cacheFor(86400);
167
-				$expires = new \DateTime();
168
-				$expires->setTimestamp($this->timeFactory->getTime());
169
-				$expires->add(new \DateInterval('PT24H'));
170
-				$response->addHeader('Expires', $expires->format(\DateTime::RFC2822));
171
-				$response->addHeader('Pragma', 'cache');
172
-				return $response;
173
-			}
174
-		}
175
-		return new NotFoundResponse();
176
-	}
147
+    /**
148
+     * Return a 512x512 icon for touch devices
149
+     *
150
+     * @PublicPage
151
+     * @NoCSRFRequired
152
+     *
153
+     * @param $app string app name
154
+     * @return FileDisplayResponse|NotFoundResponse
155
+     */
156
+    public function getTouchIcon($app = "core") {
157
+        if ($this->themingDefaults->shouldReplaceIcons()) {
158
+            try {
159
+                $iconFile = $this->imageManager->getCachedImage('touchIcon-' . $app);
160
+            } catch (NotFoundException $exception) {
161
+                $icon = $this->iconBuilder->getTouchIcon($app);
162
+                $iconFile = $this->imageManager->setCachedImage('touchIcon-' . $app, $icon);
163
+            }
164
+            if ($iconFile !== false) {
165
+                $response = new FileDisplayResponse($iconFile, Http::STATUS_OK, ['Content-Type' => 'image/png']);
166
+                $response->cacheFor(86400);
167
+                $expires = new \DateTime();
168
+                $expires->setTimestamp($this->timeFactory->getTime());
169
+                $expires->add(new \DateInterval('PT24H'));
170
+                $response->addHeader('Expires', $expires->format(\DateTime::RFC2822));
171
+                $response->addHeader('Pragma', 'cache');
172
+                return $response;
173
+            }
174
+        }
175
+        return new NotFoundResponse();
176
+    }
177 177
 }
Please login to merge, or discard this patch.
apps/theming/lib/IconBuilder.php 1 patch
Indentation   +157 added lines, -157 removed lines patch added patch discarded remove patch
@@ -28,162 +28,162 @@
 block discarded – undo
28 28
 use OCP\App\AppPathNotFoundException;
29 29
 
30 30
 class IconBuilder {
31
-	/** @var ThemingDefaults */
32
-	private $themingDefaults;
33
-	/** @var Util */
34
-	private $util;
35
-
36
-	/**
37
-	 * IconBuilder constructor.
38
-	 *
39
-	 * @param ThemingDefaults $themingDefaults
40
-	 * @param Util $util
41
-	 */
42
-	public function __construct(
43
-		ThemingDefaults $themingDefaults,
44
-		Util $util
45
-	) {
46
-		$this->themingDefaults = $themingDefaults;
47
-		$this->util = $util;
48
-	}
49
-
50
-	/**
51
-	 * @param $app string app name
52
-	 * @return string|false image blob
53
-	 */
54
-	public function getFavicon($app) {
55
-		$icon = $this->renderAppIcon($app, 32);
56
-		if($icon === false) {
57
-			return false;
58
-		}
59
-		$icon->setImageFormat("png24");
60
-		$data = $icon->getImageBlob();
61
-		$icon->destroy();
62
-		return $data;
63
-	}
64
-
65
-	/**
66
-	 * @param $app string app name
67
-	 * @return string|false image blob
68
-	 */
69
-	public function getTouchIcon($app) {
70
-		$icon = $this->renderAppIcon($app, 512);
71
-		if($icon === false) {
72
-			return false;
73
-		}
74
-		$icon->setImageFormat("png24");
75
-		$data = $icon->getImageBlob();
76
-		$icon->destroy();
77
-		return $data;
78
-	}
79
-
80
-	/**
81
-	 * Render app icon on themed background color
82
-	 * fallback to logo
83
-	 *
84
-	 * @param $app string app name
85
-	 * @param $size int size of the icon in px
86
-	 * @return Imagick|false
87
-	 */
88
-	public function renderAppIcon($app, $size) {
89
-		try {
90
-			$appIcon = $this->util->getAppIcon($app);
91
-			$appIconContent = file_get_contents($appIcon);
92
-		} catch (AppPathNotFoundException $e) {
93
-			return false;
94
-		}
95
-
96
-		if($appIconContent === false) {
97
-			return false;
98
-		}
99
-
100
-		$color = $this->themingDefaults->getMailHeaderColor();
101
-		$mime = mime_content_type($appIcon);
102
-
103
-		// generate background image with rounded corners
104
-		$background = '<?xml version="1.0" encoding="UTF-8"?>' .
105
-			'<svg xmlns="http://www.w3.org/2000/svg" version="1.1" xmlns:cc="http://creativecommons.org/ns#" width="512" height="512" xmlns:xlink="http://www.w3.org/1999/xlink">' .
106
-			'<rect x="0" y="0" rx="100" ry="100" width="512" height="512" style="fill:' . $color . ';" />' .
107
-			'</svg>';
108
-		// resize svg magic as this seems broken in Imagemagick
109
-		if($mime === "image/svg+xml" || substr($appIconContent, 0, 4) === "<svg") {
110
-			if(substr($appIconContent, 0, 5) !== "<?xml") {
111
-				$svg = "<?xml version=\"1.0\"?>".$appIconContent;
112
-			} else {
113
-				$svg = $appIconContent;
114
-			}
115
-			$tmp = new Imagick();
116
-			$tmp->readImageBlob($svg);
117
-			$x = $tmp->getImageWidth();
118
-			$y = $tmp->getImageHeight();
119
-			$res = $tmp->getImageResolution();
120
-			$tmp->destroy();
121
-
122
-			if($x>$y) {
123
-				$max = $x;
124
-			} else {
125
-				$max = $y;
126
-			}
127
-
128
-			// convert svg to resized image
129
-			$appIconFile = new Imagick();
130
-			$resX = (int)(512 * $res['x'] / $max * 2.53);
131
-			$resY = (int)(512 * $res['y'] / $max * 2.53);
132
-			$appIconFile->setResolution($resX, $resY);
133
-			$appIconFile->setBackgroundColor(new ImagickPixel('transparent'));
134
-			$appIconFile->readImageBlob($svg);
135
-			$appIconFile->scaleImage(512, 512, true);
136
-		} else {
137
-			$appIconFile = new Imagick();
138
-			$appIconFile->setBackgroundColor(new ImagickPixel('transparent'));
139
-			$appIconFile->readImageBlob(file_get_contents($appIcon));
140
-			$appIconFile->scaleImage(512, 512, true);
141
-		}
142
-
143
-		// offset for icon positioning
144
-		$border_w = (int)($appIconFile->getImageWidth() * 0.05);
145
-		$border_h = (int)($appIconFile->getImageHeight() * 0.05);
146
-		$innerWidth = (int)($appIconFile->getImageWidth() - $border_w * 2);
147
-		$innerHeight = (int)($appIconFile->getImageHeight() - $border_h * 2);
148
-		$appIconFile->adaptiveResizeImage($innerWidth, $innerHeight);
149
-		// center icon
150
-		$offset_w = 512 / 2 - $innerWidth / 2;
151
-		$offset_h = 512 / 2 - $innerHeight / 2;
152
-
153
-		$appIconFile->setImageFormat("png24");
154
-
155
-		$finalIconFile = new Imagick();
156
-		$finalIconFile->setBackgroundColor(new ImagickPixel('transparent'));
157
-		$finalIconFile->readImageBlob($background);
158
-		$finalIconFile->setImageVirtualPixelMethod(Imagick::VIRTUALPIXELMETHOD_TRANSPARENT);
159
-		$finalIconFile->setImageArtifact('compose:args', "1,0,-0.5,0.5");
160
-		$finalIconFile->compositeImage($appIconFile, Imagick::COMPOSITE_ATOP, $offset_w, $offset_h);
161
-		$finalIconFile->setImageFormat('png24');
162
-		if (defined("Imagick::INTERPOLATE_BICUBIC") === true) {
163
-			$filter = Imagick::INTERPOLATE_BICUBIC;
164
-		} else {
165
-			$filter = Imagick::FILTER_LANCZOS;
166
-		}
167
-		$finalIconFile->resizeImage($size, $size, $filter, 1, false);
168
-
169
-		$appIconFile->destroy();
170
-		return $finalIconFile;
171
-	}
172
-
173
-	public function colorSvg($app, $image) {
174
-		try {
175
-			$imageFile = $this->util->getAppImage($app, $image);
176
-		} catch (AppPathNotFoundException $e) {
177
-			return false;
178
-		}
179
-		$svg = file_get_contents($imageFile);
180
-		if ($svg !== false && $svg !== "") {
181
-			$color = $this->util->elementColor($this->themingDefaults->getMailHeaderColor());
182
-			$svg = $this->util->colorizeSvg($svg, $color);
183
-			return $svg;
184
-		} else {
185
-			return false;
186
-		}
187
-	}
31
+    /** @var ThemingDefaults */
32
+    private $themingDefaults;
33
+    /** @var Util */
34
+    private $util;
35
+
36
+    /**
37
+     * IconBuilder constructor.
38
+     *
39
+     * @param ThemingDefaults $themingDefaults
40
+     * @param Util $util
41
+     */
42
+    public function __construct(
43
+        ThemingDefaults $themingDefaults,
44
+        Util $util
45
+    ) {
46
+        $this->themingDefaults = $themingDefaults;
47
+        $this->util = $util;
48
+    }
49
+
50
+    /**
51
+     * @param $app string app name
52
+     * @return string|false image blob
53
+     */
54
+    public function getFavicon($app) {
55
+        $icon = $this->renderAppIcon($app, 32);
56
+        if($icon === false) {
57
+            return false;
58
+        }
59
+        $icon->setImageFormat("png24");
60
+        $data = $icon->getImageBlob();
61
+        $icon->destroy();
62
+        return $data;
63
+    }
64
+
65
+    /**
66
+     * @param $app string app name
67
+     * @return string|false image blob
68
+     */
69
+    public function getTouchIcon($app) {
70
+        $icon = $this->renderAppIcon($app, 512);
71
+        if($icon === false) {
72
+            return false;
73
+        }
74
+        $icon->setImageFormat("png24");
75
+        $data = $icon->getImageBlob();
76
+        $icon->destroy();
77
+        return $data;
78
+    }
79
+
80
+    /**
81
+     * Render app icon on themed background color
82
+     * fallback to logo
83
+     *
84
+     * @param $app string app name
85
+     * @param $size int size of the icon in px
86
+     * @return Imagick|false
87
+     */
88
+    public function renderAppIcon($app, $size) {
89
+        try {
90
+            $appIcon = $this->util->getAppIcon($app);
91
+            $appIconContent = file_get_contents($appIcon);
92
+        } catch (AppPathNotFoundException $e) {
93
+            return false;
94
+        }
95
+
96
+        if($appIconContent === false) {
97
+            return false;
98
+        }
99
+
100
+        $color = $this->themingDefaults->getMailHeaderColor();
101
+        $mime = mime_content_type($appIcon);
102
+
103
+        // generate background image with rounded corners
104
+        $background = '<?xml version="1.0" encoding="UTF-8"?>' .
105
+            '<svg xmlns="http://www.w3.org/2000/svg" version="1.1" xmlns:cc="http://creativecommons.org/ns#" width="512" height="512" xmlns:xlink="http://www.w3.org/1999/xlink">' .
106
+            '<rect x="0" y="0" rx="100" ry="100" width="512" height="512" style="fill:' . $color . ';" />' .
107
+            '</svg>';
108
+        // resize svg magic as this seems broken in Imagemagick
109
+        if($mime === "image/svg+xml" || substr($appIconContent, 0, 4) === "<svg") {
110
+            if(substr($appIconContent, 0, 5) !== "<?xml") {
111
+                $svg = "<?xml version=\"1.0\"?>".$appIconContent;
112
+            } else {
113
+                $svg = $appIconContent;
114
+            }
115
+            $tmp = new Imagick();
116
+            $tmp->readImageBlob($svg);
117
+            $x = $tmp->getImageWidth();
118
+            $y = $tmp->getImageHeight();
119
+            $res = $tmp->getImageResolution();
120
+            $tmp->destroy();
121
+
122
+            if($x>$y) {
123
+                $max = $x;
124
+            } else {
125
+                $max = $y;
126
+            }
127
+
128
+            // convert svg to resized image
129
+            $appIconFile = new Imagick();
130
+            $resX = (int)(512 * $res['x'] / $max * 2.53);
131
+            $resY = (int)(512 * $res['y'] / $max * 2.53);
132
+            $appIconFile->setResolution($resX, $resY);
133
+            $appIconFile->setBackgroundColor(new ImagickPixel('transparent'));
134
+            $appIconFile->readImageBlob($svg);
135
+            $appIconFile->scaleImage(512, 512, true);
136
+        } else {
137
+            $appIconFile = new Imagick();
138
+            $appIconFile->setBackgroundColor(new ImagickPixel('transparent'));
139
+            $appIconFile->readImageBlob(file_get_contents($appIcon));
140
+            $appIconFile->scaleImage(512, 512, true);
141
+        }
142
+
143
+        // offset for icon positioning
144
+        $border_w = (int)($appIconFile->getImageWidth() * 0.05);
145
+        $border_h = (int)($appIconFile->getImageHeight() * 0.05);
146
+        $innerWidth = (int)($appIconFile->getImageWidth() - $border_w * 2);
147
+        $innerHeight = (int)($appIconFile->getImageHeight() - $border_h * 2);
148
+        $appIconFile->adaptiveResizeImage($innerWidth, $innerHeight);
149
+        // center icon
150
+        $offset_w = 512 / 2 - $innerWidth / 2;
151
+        $offset_h = 512 / 2 - $innerHeight / 2;
152
+
153
+        $appIconFile->setImageFormat("png24");
154
+
155
+        $finalIconFile = new Imagick();
156
+        $finalIconFile->setBackgroundColor(new ImagickPixel('transparent'));
157
+        $finalIconFile->readImageBlob($background);
158
+        $finalIconFile->setImageVirtualPixelMethod(Imagick::VIRTUALPIXELMETHOD_TRANSPARENT);
159
+        $finalIconFile->setImageArtifact('compose:args', "1,0,-0.5,0.5");
160
+        $finalIconFile->compositeImage($appIconFile, Imagick::COMPOSITE_ATOP, $offset_w, $offset_h);
161
+        $finalIconFile->setImageFormat('png24');
162
+        if (defined("Imagick::INTERPOLATE_BICUBIC") === true) {
163
+            $filter = Imagick::INTERPOLATE_BICUBIC;
164
+        } else {
165
+            $filter = Imagick::FILTER_LANCZOS;
166
+        }
167
+        $finalIconFile->resizeImage($size, $size, $filter, 1, false);
168
+
169
+        $appIconFile->destroy();
170
+        return $finalIconFile;
171
+    }
172
+
173
+    public function colorSvg($app, $image) {
174
+        try {
175
+            $imageFile = $this->util->getAppImage($app, $image);
176
+        } catch (AppPathNotFoundException $e) {
177
+            return false;
178
+        }
179
+        $svg = file_get_contents($imageFile);
180
+        if ($svg !== false && $svg !== "") {
181
+            $color = $this->util->elementColor($this->themingDefaults->getMailHeaderColor());
182
+            $svg = $this->util->colorizeSvg($svg, $color);
183
+            return $svg;
184
+        } else {
185
+            return false;
186
+        }
187
+    }
188 188
 
189 189
 }
Please login to merge, or discard this patch.
apps/theming/lib/Capabilities.php 1 patch
Indentation   +29 added lines, -29 removed lines patch added patch discarded remove patch
@@ -33,37 +33,37 @@
 block discarded – undo
33 33
  */
34 34
 class Capabilities implements ICapability {
35 35
 
36
-	/** @var ThemingDefaults */
37
-	protected $theming;
36
+    /** @var ThemingDefaults */
37
+    protected $theming;
38 38
 
39 39
 
40
-	/** @var IURLGenerator */
41
-	protected $url;
40
+    /** @var IURLGenerator */
41
+    protected $url;
42 42
 
43
-	/**
44
-	 * @param ThemingDefaults $theming
45
-	 * @param IURLGenerator $url
46
-	 */
47
-	public function __construct(ThemingDefaults $theming, IURLGenerator $url) {
48
-		$this->theming = $theming;
49
-		$this->url = $url;
50
-	}
43
+    /**
44
+     * @param ThemingDefaults $theming
45
+     * @param IURLGenerator $url
46
+     */
47
+    public function __construct(ThemingDefaults $theming, IURLGenerator $url) {
48
+        $this->theming = $theming;
49
+        $this->url = $url;
50
+    }
51 51
 
52
-	/**
53
-	 * Return this classes capabilities
54
-	 *
55
-	 * @return array
56
-	 */
57
-	public function getCapabilities() {
58
-		return [
59
-			'theming' => [
60
-				'name' => $this->theming->getName(),
61
-				'url' => $this->theming->getBaseUrl(),
62
-				'slogan' => $this->theming->getSlogan(),
63
-				'color' => $this->theming->getMailHeaderColor(),
64
-				'logo' => $this->url->getAbsoluteURL($this->theming->getLogo()),
65
-				'background' => $this->url->getAbsoluteURL($this->theming->getBackground()),
66
-			],
67
-		];
68
-	}
52
+    /**
53
+     * Return this classes capabilities
54
+     *
55
+     * @return array
56
+     */
57
+    public function getCapabilities() {
58
+        return [
59
+            'theming' => [
60
+                'name' => $this->theming->getName(),
61
+                'url' => $this->theming->getBaseUrl(),
62
+                'slogan' => $this->theming->getSlogan(),
63
+                'color' => $this->theming->getMailHeaderColor(),
64
+                'logo' => $this->url->getAbsoluteURL($this->theming->getLogo()),
65
+                'background' => $this->url->getAbsoluteURL($this->theming->getBackground()),
66
+            ],
67
+        ];
68
+    }
69 69
 }
Please login to merge, or discard this patch.