xref: /plugin/statistics/vendor/matomo/device-detector/Parser/Client/MobileApp.php (revision d5ef99ddb7dfb0cfae33e9257bd1d788f682c50f)
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