1*d5ef99ddSAndreas Gohr<?php 2*d5ef99ddSAndreas Gohr 3*d5ef99ddSAndreas Gohr/** 4*d5ef99ddSAndreas Gohr * Device Detector - The Universal Device Detection library for parsing User Agents 5*d5ef99ddSAndreas Gohr * 6*d5ef99ddSAndreas Gohr * @link https://matomo.org 7*d5ef99ddSAndreas Gohr * 8*d5ef99ddSAndreas Gohr * @license http://www.gnu.org/licenses/lgpl.html LGPL v3 or later 9*d5ef99ddSAndreas Gohr */ 10*d5ef99ddSAndreas Gohr 11*d5ef99ddSAndreas Gohrdeclare(strict_types=1); 12*d5ef99ddSAndreas Gohr 13*d5ef99ddSAndreas Gohrnamespace DeviceDetector\Parser\Client; 14*d5ef99ddSAndreas Gohr 15*d5ef99ddSAndreas Gohruse DeviceDetector\Cache\CacheInterface; 16*d5ef99ddSAndreas Gohruse DeviceDetector\ClientHints; 17*d5ef99ddSAndreas Gohruse DeviceDetector\Parser\Client\Hints\AppHints; 18*d5ef99ddSAndreas Gohruse DeviceDetector\Yaml\ParserInterface as YamlParser; 19*d5ef99ddSAndreas Gohr 20*d5ef99ddSAndreas Gohr/** 21*d5ef99ddSAndreas Gohr * Class MobileApp 22*d5ef99ddSAndreas Gohr * 23*d5ef99ddSAndreas Gohr * Client parser for mobile app detection 24*d5ef99ddSAndreas Gohr */ 25*d5ef99ddSAndreas Gohrclass MobileApp extends AbstractClientParser 26*d5ef99ddSAndreas Gohr{ 27*d5ef99ddSAndreas Gohr /** 28*d5ef99ddSAndreas Gohr * @var AppHints 29*d5ef99ddSAndreas Gohr */ 30*d5ef99ddSAndreas Gohr private $appHints; 31*d5ef99ddSAndreas Gohr 32*d5ef99ddSAndreas Gohr /** 33*d5ef99ddSAndreas Gohr * @var string 34*d5ef99ddSAndreas Gohr */ 35*d5ef99ddSAndreas Gohr protected $fixtureFile = 'regexes/client/mobile_apps.yml'; 36*d5ef99ddSAndreas Gohr 37*d5ef99ddSAndreas Gohr /** 38*d5ef99ddSAndreas Gohr * @var string 39*d5ef99ddSAndreas Gohr */ 40*d5ef99ddSAndreas Gohr protected $parserName = 'mobile app'; 41*d5ef99ddSAndreas Gohr 42*d5ef99ddSAndreas Gohr /** 43*d5ef99ddSAndreas Gohr * MobileApp constructor. 44*d5ef99ddSAndreas Gohr * 45*d5ef99ddSAndreas Gohr * @param string $ua 46*d5ef99ddSAndreas Gohr * @param ClientHints|null $clientHints 47*d5ef99ddSAndreas Gohr */ 48*d5ef99ddSAndreas Gohr public function __construct(string $ua = '', ?ClientHints $clientHints = null) 49*d5ef99ddSAndreas Gohr { 50*d5ef99ddSAndreas Gohr $this->appHints = new AppHints($ua, $clientHints); 51*d5ef99ddSAndreas Gohr parent::__construct($ua, $clientHints); 52*d5ef99ddSAndreas Gohr } 53*d5ef99ddSAndreas Gohr 54*d5ef99ddSAndreas Gohr /** 55*d5ef99ddSAndreas Gohr * Sets the client hints to parse 56*d5ef99ddSAndreas Gohr * 57*d5ef99ddSAndreas Gohr * @param ?ClientHints $clientHints client hints 58*d5ef99ddSAndreas Gohr */ 59*d5ef99ddSAndreas Gohr public function setClientHints(?ClientHints $clientHints): void 60*d5ef99ddSAndreas Gohr { 61*d5ef99ddSAndreas Gohr parent::setClientHints($clientHints); 62*d5ef99ddSAndreas Gohr $this->appHints->setClientHints($clientHints); 63*d5ef99ddSAndreas Gohr } 64*d5ef99ddSAndreas Gohr 65*d5ef99ddSAndreas Gohr /** 66*d5ef99ddSAndreas Gohr * Sets the user agent to parse 67*d5ef99ddSAndreas Gohr * 68*d5ef99ddSAndreas Gohr * @param string $ua user agent 69*d5ef99ddSAndreas Gohr */ 70*d5ef99ddSAndreas Gohr public function setUserAgent(string $ua): void 71*d5ef99ddSAndreas Gohr { 72*d5ef99ddSAndreas Gohr parent::setUserAgent($ua); 73*d5ef99ddSAndreas Gohr $this->appHints->setUserAgent($ua); 74*d5ef99ddSAndreas Gohr } 75*d5ef99ddSAndreas Gohr 76*d5ef99ddSAndreas Gohr /** 77*d5ef99ddSAndreas Gohr * Sets the Cache class 78*d5ef99ddSAndreas Gohr * 79*d5ef99ddSAndreas Gohr * @param CacheInterface $cache 80*d5ef99ddSAndreas Gohr */ 81*d5ef99ddSAndreas Gohr public function setCache(CacheInterface $cache): void 82*d5ef99ddSAndreas Gohr { 83*d5ef99ddSAndreas Gohr parent::setCache($cache); 84*d5ef99ddSAndreas Gohr $this->appHints->setCache($cache); 85*d5ef99ddSAndreas Gohr } 86*d5ef99ddSAndreas Gohr 87*d5ef99ddSAndreas Gohr /** 88*d5ef99ddSAndreas Gohr * Sets the YamlParser class 89*d5ef99ddSAndreas Gohr * 90*d5ef99ddSAndreas Gohr * @param YamlParser $yamlParser 91*d5ef99ddSAndreas Gohr */ 92*d5ef99ddSAndreas Gohr public function setYamlParser(YamlParser $yamlParser): void 93*d5ef99ddSAndreas Gohr { 94*d5ef99ddSAndreas Gohr parent::setYamlParser($yamlParser); 95*d5ef99ddSAndreas Gohr $this->appHints->setYamlParser($this->getYamlParser()); 96*d5ef99ddSAndreas Gohr } 97*d5ef99ddSAndreas Gohr 98*d5ef99ddSAndreas Gohr /** 99*d5ef99ddSAndreas Gohr * Parses the current UA and checks whether it contains any client information 100*d5ef99ddSAndreas Gohr * See parent::parse() for more details. 101*d5ef99ddSAndreas Gohr * 102*d5ef99ddSAndreas Gohr * @return array|null 103*d5ef99ddSAndreas Gohr */ 104*d5ef99ddSAndreas Gohr public function parse(): ?array 105*d5ef99ddSAndreas Gohr { 106*d5ef99ddSAndreas Gohr $result = parent::parse(); 107*d5ef99ddSAndreas Gohr $name = $result['name'] ?? ''; 108*d5ef99ddSAndreas Gohr $version = $result['version'] ?? ''; 109*d5ef99ddSAndreas Gohr $appHash = $this->appHints->parse(); 110*d5ef99ddSAndreas Gohr 111*d5ef99ddSAndreas Gohr if (null !== $appHash && $appHash['name'] !== $name) { 112*d5ef99ddSAndreas Gohr $name = $appHash['name']; 113*d5ef99ddSAndreas Gohr $version = ''; 114*d5ef99ddSAndreas Gohr } 115*d5ef99ddSAndreas Gohr 116*d5ef99ddSAndreas Gohr if (empty($name)) { 117*d5ef99ddSAndreas Gohr return null; 118*d5ef99ddSAndreas Gohr } 119*d5ef99ddSAndreas Gohr 120*d5ef99ddSAndreas Gohr return [ 121*d5ef99ddSAndreas Gohr 'type' => $this->parserName, 122*d5ef99ddSAndreas Gohr 'name' => $name, 123*d5ef99ddSAndreas Gohr 'version' => $version, 124*d5ef99ddSAndreas Gohr ]; 125*d5ef99ddSAndreas Gohr } 126*d5ef99ddSAndreas Gohr} 127