PluginProbe ʕ •ᴥ•ʔ
Matomo Analytics – Powerful, Privacy-First Insights for WordPress / 4.13.3
Matomo Analytics – Powerful, Privacy-First Insights for WordPress v4.13.3
5.12.0 5.11.1 5.11.0 5.10.2 5.10.1 trunk 1.0.2 1.0.3 1.0.4 1.0.5 1.0.6 1.1.0 1.1.1 1.1.2 1.1.3 1.2.0 1.3.0 1.3.1 1.3.2 4.0.0 4.0.1 4.0.2 4.0.3 4.0.4 4.1.0 4.1.1 4.1.2 4.1.3 4.10.0 4.11.0 4.12.0 4.13.0 4.13.2 4.13.3 4.13.4 4.13.5 4.14.0 4.14.1 4.14.2 4.15.0 4.15.1 4.15.2 4.15.3 4.2.0 4.3.0 4.3.1 4.4.1 4.4.2 4.5.0 4.6.0 5.0.1 5.0.2 5.0.3 5.0.4 5.0.5 5.0.6 5.0.7 5.0.8 5.1.0 5.1.1 5.1.2 5.1.3 5.1.4 5.1.5 5.1.6 5.1.7 5.10.0 5.2.0 5.2.1 5.2.2 5.3.0 5.3.1 5.3.2 5.3.3 5.6.0 5.6.1 5.7.0 5.7.1 5.8.0 5.8.1 5.8.2
matomo / app / core / DeviceDetector / DeviceDetectorFactory.php
matomo / app / core / DeviceDetector Last commit date
DeviceDetectorCache.php 5 years ago DeviceDetectorFactory.php 3 years ago
DeviceDetectorFactory.php
80 lines
1 <?php
2
3 /**
4 * Matomo - free/libre analytics platform
5 *
6 * @link https://matomo.org
7 * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
8 *
9 */
10
11 namespace Piwik\DeviceDetector;
12
13 use DeviceDetector\ClientHints;
14 use DeviceDetector\DeviceDetector;
15 use Piwik\Container\StaticContainer;
16
17 class DeviceDetectorFactory
18 {
19 protected static $deviceDetectorInstances = [];
20
21 /**
22 * Returns an instance of DeviceDetector for the given user agent. Uses template method pattern
23 * and calls getDeviceDetectionInfo() when it doesn't find a matching instance in the cache.
24 * @param string $userAgent
25 * @param array $clientHints
26 * @return DeviceDetector
27 */
28 public function makeInstance($userAgent, array $clientHints = [])
29 {
30 $cacheKey = self::getNormalizedUserAgent($userAgent, $clientHints);
31
32 if (array_key_exists($cacheKey, self::$deviceDetectorInstances)) {
33 return self::$deviceDetectorInstances[$cacheKey];
34 }
35
36 $deviceDetector = $this->getDeviceDetectionInfo($userAgent, $clientHints);
37
38 self::$deviceDetectorInstances[$cacheKey] = $deviceDetector;
39
40 return $deviceDetector;
41 }
42
43 public static function getNormalizedUserAgent($userAgent, array $clientHints = [])
44 {
45 $normalizedClientHints = '';
46 if (is_array($clientHints) && count($clientHints)) {
47 $hints = ClientHints::factory($clientHints);
48 $brands = $hints->getBrandList();
49 ksort($brands);
50
51 // we only take the (sorted) list of brand, os + version and model name into account, as the other values
52 // are actually not used and should not change the result
53 $normalizedClientHints = md5(json_encode($brands) . $hints->getOperatingSystem() . $hints->getOperatingSystemVersion() . $hints->getModel());
54 }
55
56 return mb_substr($normalizedClientHints . trim($userAgent), 0, 500);
57 }
58
59 /**
60 * Creates a new DeviceDetector for the user agent. Called by makeInstance() when no matching instance
61 * was found in the cache.
62 * @param string $userAgent
63 * @param array $clientHints
64 * @return DeviceDetector
65 */
66 protected function getDeviceDetectionInfo($userAgent, array $clientHints = [])
67 {
68 $deviceDetector = new DeviceDetector($userAgent, ClientHints::factory($clientHints));
69 $deviceDetector->discardBotInformation();
70 $deviceDetector->setCache(StaticContainer::get('DeviceDetector\Cache\Cache'));
71 $deviceDetector->parse();
72 return $deviceDetector;
73 }
74
75 public static function clearInstancesCache()
76 {
77 self::$deviceDetectorInstances = [];
78 }
79 }
80