Passed
Push — develop ( 7fbd2c...82694f )
by nguereza
02:49
created

DeviceDetector   A

Complexity

Total Complexity 3

Size/Duplication

Total Lines 295
Duplicated Lines 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
wmc 3
eloc 200
c 1
b 0
f 0
dl 0
loc 295
rs 10

3 Methods

Rating   Name   Duplication   Size   Complexity  
A maps() 0 15 1
A __construct() 0 5 1
B regex() 0 256 1
1
<?php
2
3
/**
4
 * Platine User Agent
5
 *
6
 * Platine User Agent is a lightweight library for detecting
7
 * user browser, device, OS, CPU
8
 *
9
 * This content is released under the MIT License (MIT)
10
 *
11
 * Copyright (c) 2020 Platine User Agent
12
 *
13
 * Permission is hereby granted, free of charge, to any person obtaining a copy
14
 * of this software and associated documentation files (the "Software"), to deal
15
 * in the Software without restriction, including without limitation the rights
16
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
17
 * copies of the Software, and to permit persons to whom the Software is
18
 * furnished to do so, subject to the following conditions:
19
 *
20
 * The above copyright notice and this permission notice shall be included in all
21
 * copies or substantial portions of the Software.
22
 *
23
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
24
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
25
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
26
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
27
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
28
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
29
 * SOFTWARE.
30
 */
31
32
/**
33
 *  @file DeviceDetector.php
34
 *
35
 *  The device detector class
36
 *
37
 *  @package    Platine\UserAgent\Detector
38
 *  @author Platine Developers Team
39
 *  @copyright  Copyright (c) 2020
40
 *  @license    http://opensource.org/licenses/MIT  MIT License
41
 *  @link   http://www.iacademy.cf
42
 *  @version 1.0.0
43
 *  @filesource
44
 */
45
46
declare(strict_types=1);
47
48
namespace Platine\UserAgent\Detector;
49
50
use Platine\UserAgent\Entity\Device;
51
52
/**
53
 * Class DeviceDetector
54
 * @package Platine\UserAgent\Detector
55
 */
56
class DeviceDetector extends AbstractDetector
57
{
58
59
     /**
60
     * {@inheritdoc}
61
     */
62
    public function __construct()
63
    {
64
        parent::__construct();
65
66
        $this->entity = new Device();
67
    }
68
69
    /**
70
     * {@inheritdoc}
71
     */
72
    public function maps(): array
73
    {
74
        return [
75
            'amazon' => [
76
                'model' => [
77
                    'Fire Phone' => ['SD', 'KF']
78
                ]
79
            ],
80
            'sprint' => [
81
                'model' => [
82
                    'Evo Shift 4G' => '7373KT'
83
                ],
84
                'vendor' => [
85
                    'HTC' => 'APA',
86
                    'Sprint' => 'Sprint'
87
                ]
88
            ]
89
        ];
90
    }
91
92
    /**
93
     * {@inheritdoc}
94
     */
95
    public function regex(): array
96
    {
97
        return [
98
            [
99
100
                '/\((ipad|playbook);[\w\s\),;-]+(rim|apple)/i'                        // iPad/PlayBook
101
            ], [self::MODEL, self::VENDOR, [self::TYPE, self::TABLET]], [
102
103
                '/applecoremedia\/[\w\.]+ \((ipad)/'                                  // iPad
104
            ], [self::MODEL, [self::VENDOR, 'Apple'], [self::TYPE, self::TABLET]], [
105
106
                '/(apple\s{0,1}tv)/i'                                                 // Apple TV
107
            ], [[self::MODEL, 'Apple TV'], [self::VENDOR, 'Apple']], [
108
109
                '/(archos)\s(gamepad2?)/i',                                           // Archos
110
                '/(hp).+(touchpad)/i',                                                // HP TouchPad
111
                '/(hp).+(tablet)/i',                                                  // HP Tablet
112
                '/(kindle)\/([\w\.]+)/i',                                             // Kindle
113
                '/\s(nook)[\w\s]+build\/(\w+)/i',                                     // Nook
114
                '/(dell)\s(strea[kpr\s\d]*[\dko])/i'                                  // Dell Streak
115
            ], [self::VENDOR, self::MODEL, [self::TYPE, self::TABLET]], [
116
117
                '/(kf[A-z]+)\sbuild\/.+silk\//i'                                      // Kindle Fire HD
118
            ], [self::MODEL, [self::VENDOR, 'Amazon'], [self::TYPE, self::TABLET]], [
119
                '/(sd|kf)[0349hijorstuw]+\sbuild\/.+silk\//i'                         // Fire Phone
120
            ], [[self::MODEL, '__str', 'amazon.model'], [self::VENDOR, 'Amazon'], [self::TYPE, self::MOBILE]], [
121
                '/android.+aft([bms])\sbuild/i'                                       // Fire TV
122
            ], [self::MODEL, [self::VENDOR, 'Amazon'], [self::TYPE, self::SMART_TV]], [
123
124
                '/\((ip[honed|\s\w*]+);.+(apple)/i'                                   // iPod/iPhone
125
            ], [self::MODEL, self::VENDOR, [self::TYPE, self::MOBILE]], [
126
                '/\((ip[honed|\s\w*]+);/i'                                            // iPod/iPhone
127
            ], [self::MODEL, [self::VENDOR, 'Apple'], [self::TYPE, self::MOBILE]], [
128
129
                '/(blackberry)[\s-]?(\w+)/i',                                         // BlackBerry
130
                '/(blackberry|benq|palm(?=\-)|sonyericsson|acer|asus|dell|meizu|motorola|polytron)[\s_-]?([\w-]*)/i',
131
                // BenQ/Palm/Sony-Ericsson/Acer/Asus/Dell/Meizu/Motorola/Polytron
132
                '/(hp)\s([\w\s]+\w)/i',                                               // HP iPAQ
133
                '/(asus)-?(\w+)/i'                                                    // Asus
134
            ], [self::VENDOR, self::MODEL, [self::TYPE, self::MOBILE]], [
135
                '/\(bb10;\s(\w+)/i'                                                   // BlackBerry 10
136
            ], [self::MODEL, [self::VENDOR, 'BlackBerry'], [self::TYPE, self::MOBILE]], [
137
                // Asus Tablets
138
                '/android.+(transfo[prime\s]{4,10}\s\w+|eeepc|slider\s\w+|nexus 7|padfone|p00c)/i'
139
            ], [self::MODEL, [self::VENDOR, 'Asus'], [self::TYPE, self::TABLET]], [
140
141
                '/(sony)\s(tablet\s[ps])\sbuild\//i',                                  // Sony
142
                '/(sony)?(?:sgp.+)\sbuild\//i'
143
            ], [[self::VENDOR, 'Sony'], [self::MODEL, 'Xperia Tablet'], [self::TYPE, self::TABLET]], [
144
                '/android.+\s([c-g]\d{4}|so[-l]\w+)(?=\sbuild\/|\).+chrome\/(?![1-6]{0,1}\d\.))/i'
145
            ], [self::MODEL, [self::VENDOR, 'Sony'], [self::TYPE, self::MOBILE]], [
146
147
                '/\s(ouya)\s/i',                                                      // Ouya
148
                '/(nintendo)\s([wids3u]+)/i'                                          // Nintendo
149
            ], [self::VENDOR, self::MODEL, [self::TYPE, self::CONSOLE]], [
150
151
                '/android.+;\s(shield)\sbuild/i'                                      // Nvidia
152
            ], [self::MODEL, [self::VENDOR, 'Nvidia'], [self::TYPE, self::CONSOLE]], [
153
154
                '/(playstation\s[34portablevi]+)/i'                                   // Playstation
155
            ], [self::MODEL, [self::VENDOR, 'Sony'], [self::TYPE, self::CONSOLE]], [
156
157
                '/(sprint\s(\w+))/i'                                                  // Sprint Phones
158
            ], [[self::VENDOR, '__str', 'sprint.vendor'], [self::MODEL, '__str', 'sprint.model'], [self::TYPE, self::MOBILE]], [
159
160
                '/(htc)[;_\s-]+([\w\s]+(?=\)|\sbuild)|\w+)/i',                        // HTC
161
                '/(zte)-(\w*)/i',                                                     // ZTE
162
                '/(alcatel|geeksphone|nexian|panasonic|(?=;\s)sony)[_\s-]?([\w-]*)/i'
163
                // Alcatel/GeeksPhone/Nexian/Panasonic/Sony
164
            ], [self::VENDOR, [self::MODEL, '/_/', ' '], [self::TYPE, self::MOBILE]], [
165
166
                '/(nexus\s9)/i'                                                       // HTC Nexus 9
167
            ], [self::MODEL, [self::VENDOR, 'HTC'], [self::TYPE, self::TABLET]], [
168
169
                '/d\/huawei([\w\s-]+)[;\)]/i',
170
                '/(nexus\s6p)/i'                                                      // Huawei
171
            ], [self::MODEL, [self::VENDOR, 'Huawei'], [self::TYPE, self::MOBILE]], [
172
173
                '/(microsoft);\s(lumia[\s\w]+)/i'                                     // Microsoft Lumia
174
            ], [self::VENDOR, self::MODEL, [self::TYPE, self::MOBILE]], [
175
176
                '/[\s\(;](xbox(?:\sone)?)[\s\);]/i'                                   // Microsoft Xbox
177
            ], [self::MODEL, [self::VENDOR, 'Microsoft'], [self::TYPE, self::CONSOLE]], [
178
                '/(kin\.[onetw]{3})/i'                                                // Microsoft Kin
179
            ], [[self::MODEL, '/\./', ' '], [self::VENDOR, 'Microsoft'], [self::TYPE, self::MOBILE]], [
180
181
                // Motorola
182
                '/\s(milestone|droid(?:[2-4x]|\s(?:bionic|x2|pro|razr))?:?(\s4g)?)[\w\s]+build\//i',
183
                '/mot[\s-]?(\w*)/i',
184
                '/(XT\d{3,4}) build\//i',
185
                '/(nexus\s6)/i'
186
            ], [self::MODEL, [self::VENDOR, 'Motorola'], [self::TYPE, self::MOBILE]], [
187
                '/android.+\s(mz60\d|xoom[\s2]{0,2})\sbuild\//i'
188
            ], [self::MODEL, [self::VENDOR, 'Motorola'], [self::TYPE, self::TABLET]], [
189
190
                '/hbbtv\/\d+\.\d+\.\d+\s+\([\w\s]*;\s*(\w[^;]*);([^;]*)/i'            // HbbTV devices
191
            ], [[self::VENDOR, '__trim'], [self::MODEL, '__trim'], [self::TYPE, self::SMART_TV]], [
192
193
                '/hbbtv.+maple;(\d+)/i'
194
            ], [[self::MODEL, '/^/', 'SMART_TV'], [self::VENDOR, 'Samsung'], [self::TYPE, self::SMART_TV]], [
195
196
                '/\(dtv[\);].+(aquos)/i'                                              // Sharp
197
            ], [self::MODEL, [self::VENDOR, 'Sharp'], [self::TYPE, self::SMART_TV]], [
198
199
                '/android.+((sch-i[89]0\d|shw-m380s|gt-p\d{4}|gt-n\d+|sgh-t8[56]9|nexus 10))/i',
200
                '/((SM-T\w+))/i'
201
            ], [[self::VENDOR, 'Samsung'], self::MODEL, [self::TYPE, self::TABLET]], [                  // Samsung
202
                '/smart-tv.+(samsung)/i'
203
            ], [self::VENDOR, [self::TYPE, self::SMART_TV], self::MODEL], [
204
                '/((s[cgp]h-\w+|gt-\w+|galaxy\snexus|sm-\w[\w\d]+))/i',
205
                '/(sam[sung]*)[\s-]*(\w+-?[\w-]*)/i',
206
                '/sec-((sgh\w+))/i'
207
            ], [[self::VENDOR, 'Samsung'], self::MODEL, [self::TYPE, self::MOBILE]], [
208
209
                '/sie-(\w*)/i'                                                        // Siemens
210
            ], [self::MODEL, [self::VENDOR, 'Siemens'], [self::TYPE, self::MOBILE]], [
211
212
                '/(maemo|nokia).*(n900|lumia\s\d+)/i',                                // Nokia
213
                '/(nokia)[\s_-]?([\w-]*)/i'
214
            ], [[self::VENDOR, 'Nokia'], self::MODEL, [self::TYPE, self::MOBILE]], [
215
216
                '/android[x\d\.\s;]+\s([ab][1-7]\-?[0178a]\d\d?)/i'                   // Acer
217
            ], [self::MODEL, [self::VENDOR, 'Acer'], [self::TYPE, self::TABLET]], [
218
219
                '/android.+([vl]k\-?\d{3})\s+build/i'                                 // LG Tablet
220
            ], [self::MODEL, [self::VENDOR, 'LG'], [self::TYPE, self::TABLET]], [
221
                '/android\s3\.[\s\w;-]{10}(lg?)-([06cv9]{3,4})/i'                     // LG Tablet
222
            ], [[self::VENDOR, 'LG'], self::MODEL, [self::TYPE, self::TABLET]], [
223
                '/(lg) netcast\.tv/i'                                                 // LG SMART_TV
224
            ], [self::VENDOR, self::MODEL, [self::TYPE, self::SMART_TV]], [
225
                '/(nexus\s[45])/i',                                                   // LG
226
                '/lg[e;\s\/-]+(\w*)/i',
227
                '/android.+lg(\-?[\d\w]+)\s+build/i'
228
            ], [self::MODEL, [self::VENDOR, 'LG'], [self::TYPE, self::MOBILE]], [
229
230
                '/(lenovo)\s?(s(?:5000|6000)(?:[\w-]+)|tab(?:[\s\w]+))/i'             // Lenovo tablets
231
            ], [self::VENDOR, self::MODEL, [self::TYPE, self::TABLET]], [
232
                '/android.+(ideatab[a-z0-9\-\s]+)/i'                                  // Lenovo
233
            ], [self::MODEL, [self::VENDOR, 'Lenovo'], [self::TYPE, self::TABLET]], [
234
                '/(lenovo)[_\s-]?([\w-]+)/i'
235
            ], [self::VENDOR, self::MODEL, [self::TYPE, self::MOBILE]], [
236
237
                '/linux;.+((jolla));/i'                                               // Jolla
238
            ], [self::VENDOR, self::MODEL, [self::TYPE, self::MOBILE]], [
239
240
                '/((pebble))app\/[\d\.]+\s/i'                                         // Pebble
241
            ], [self::VENDOR, self::MODEL, [self::TYPE, self::WEARABLE]], [
242
243
                '/android.+;\s(oppo)\s?([\w\s]+)\sbuild/i'                            // OPPO
244
            ], [self::VENDOR, self::MODEL, [self::TYPE, self::MOBILE]], [
245
246
                '/crkey/i'                                                            // Google Chromecast
247
            ], [[self::MODEL, 'Chromecast'], [self::VENDOR, 'Google']], [
248
249
                '/android.+;\s(glass)\s\d/i'                                          // Google Glass
250
            ], [self::MODEL, [self::VENDOR, 'Google'], [self::TYPE, self::WEARABLE]], [
251
252
                '/android.+;\s(pixel c)[\s)]/i'                                       // Google Pixel C
253
            ], [self::MODEL, [self::VENDOR, 'Google'], [self::TYPE, self::TABLET]], [
254
255
                '/android.+;\s(pixel( [23])?( xl)?)[\s)]/i'                              // Google Pixel
256
            ], [self::MODEL, [self::VENDOR, 'Google'], [self::TYPE, self::MOBILE]], [
257
258
                '/android.+;\s(\w+)\s+build\/hm\1/i',                                 // Xiaomi Hongmi 'numeric' models
259
                '/android.+(hm[\s\-_]*note?[\s_]*(?:\d\w)?)\s+build/i',               // Xiaomi Hongmi
260
                '/android.+(mi[\s\-_]*(?:a\d|one|one[\s_]plus|note lte)?[\s_]*(?:\d?\w?)[\s_]*(?:plus)?)\s+build/i',
261
                // Xiaomi Mi
262
                '/android.+(redmi[\s\-_]*(?:note)?(?:[\s_]*[\w\s]+))\s+build/i'       // Redmi Phones
263
            ], [[self::MODEL, '/_/', ' '], [self::VENDOR, 'Xiaomi'], [self::TYPE, self::MOBILE]], [
264
                '/android.+(mi[\s\-_]*(?:pad)(?:[\s_]*[\w\s]+))\s+build/i'            // Mi Pad tablets
265
            ], [[self::MODEL, '/_/', ' '], [self::VENDOR, 'Xiaomi'], [self::TYPE, self::TABLET]], [
266
                '/android.+;\s(m[1-5]\snote)\sbuild/i'                                // Meizu
267
            ], [self::MODEL, [self::VENDOR, 'Meizu'], [self::TYPE, self::MOBILE]], [
268
                '/(mz)-([\w-]{2,})/i'
269
            ], [[self::VENDOR, 'Meizu'], self::MODEL, [self::TYPE, self::MOBILE]], [
270
271
                '/android.+a000(1)\s+build/i',                                        // OnePlus
272
                '/android.+oneplus\s(a\d{4})\s+build/i'
273
            ], [self::MODEL, [self::VENDOR, 'OnePlus'], [self::TYPE, self::MOBILE]], [
274
275
                '/android.+[;\/]\s*(RCT[\d\w]+)\s+build/i'                            // RCA Tablets
276
            ], [self::MODEL, [self::VENDOR, 'RCA'], [self::TYPE, self::TABLET]], [
277
278
                '/android.+[;\/\s]+(Venue[\d\s]{2,7})\s+build/i'                      // Dell Venue Tablets
279
            ], [self::MODEL, [self::VENDOR, 'Dell'], [self::TYPE, self::TABLET]], [
280
281
                '/android.+[;\/]\s*(Q[T|M][\d\w]+)\s+build/i'                         // Verizon Tablet
282
            ], [self::MODEL, [self::VENDOR, 'Verizon'], [self::TYPE, self::TABLET]], [
283
284
                '/android.+[;\/]\s+(Barnes[&\s]+Noble\s+|BN[RT])(V?.*)\s+build/i'     // Barnes & Noble Tablet
285
            ], [[self::VENDOR, 'Barnes & Noble'], self::MODEL, [self::TYPE, self::TABLET]], [
286
287
                '/android.+[;\/]\s+(TM\d{3}.*\b)\s+build/i'                           // Barnes & Noble Tablet
288
            ], [self::MODEL, [self::VENDOR, 'NuVision'], [self::TYPE, self::TABLET]], [
289
290
                '/android.+;\s(k88)\sbuild/i'                                         // ZTE K Series Tablet
291
            ], [self::MODEL, [self::VENDOR, 'ZTE'], [self::TYPE, self::TABLET]], [
292
293
                '/android.+[;\/]\s*(gen\d{3})\s+build.*49h/i'                         // Swiss GEN Mobile
294
            ], [self::MODEL, [self::VENDOR, 'Swiss'], [self::TYPE, self::MOBILE]], [
295
296
                '/android.+[;\/]\s*(zur\d{3})\s+build/i'                              // Swiss ZUR Tablet
297
            ], [self::MODEL, [self::VENDOR, 'Swiss'], [self::TYPE, self::TABLET]], [
298
299
                '/android.+[;\/]\s*((Zeki)?TB.*\b)\s+build/i'                         // Zeki Tablets
300
            ], [self::MODEL, [self::VENDOR, 'Zeki'], [self::TYPE, self::TABLET]], [
301
302
                '/(android).+[;\/]\s+([YR]\d{2})\s+build/i',
303
                '/android.+[;\/]\s+(Dragon[\-\s]+Touch\s+|DT)(\w{5})\sbuild/i'        // Dragon Touch Tablet
304
            ], [[self::VENDOR, 'Dragon Touch'], self::MODEL, [self::TYPE, self::TABLET]], [
305
306
                '/android.+[;\/]\s*(NS-?\w{0,9})\sbuild/i'                            // Insignia Tablets
307
            ], [self::MODEL, [self::VENDOR, 'Insignia'], [self::TYPE, self::TABLET]], [
308
309
                '/android.+[;\/]\s*((NX|Next)-?\w{0,9})\s+build/i'                    // NextBook Tablets
310
            ], [self::MODEL, [self::VENDOR, 'NextBook'], [self::TYPE, self::TABLET]], [
311
312
                '/android.+[;\/]\s*(Xtreme\_)?(V(1[045]|2[015]|30|40|60|7[05]|90))\s+build/i'
313
            ], [[self::VENDOR, 'Voice'], self::MODEL, [self::TYPE, self::MOBILE]], [                    // Voice Xtreme Phones
314
315
                '/android.+[;\/]\s*(LVTEL\-)?(V1[12])\s+build/i'                     // LvTel Phones
316
            ], [[self::VENDOR, 'LvTel'], self::MODEL, [self::TYPE, self::MOBILE]], [
317
318
                '/android.+;\s(PH-1)\s/i'
319
            ], [self::MODEL, [self::VENDOR, 'Essential'], [self::TYPE, self::MOBILE]], [                // Essential PH-1
320
321
                '/android.+[;\/]\s*(V(100MD|700NA|7011|917G).*\b)\s+build/i'          // Envizen Tablets
322
            ], [self::MODEL, [self::VENDOR, 'Envizen'], [self::TYPE, self::TABLET]], [
323
324
                '/android.+[;\/]\s*(Le[\s\-]+Pan)[\s\-]+(\w{1,9})\s+build/i'          // Le Pan Tablets
325
            ], [self::VENDOR, self::MODEL, [self::TYPE, self::TABLET]], [
326
327
                '/android.+[;\/]\s*(Trio[\s\-]*.*)\s+build/i'                         // MachSpeed Tablets
328
            ], [self::MODEL, [self::VENDOR, 'MachSpeed'], [self::TYPE, self::TABLET]], [
329
330
                '/android.+[;\/]\s*(Trinity)[\-\s]*(T\d{3})\s+build/i'                // Trinity Tablets
331
            ], [self::VENDOR, self::MODEL, [self::TYPE, self::TABLET]], [
332
333
                '/android.+[;\/]\s*TU_(1491)\s+build/i'                               // Rotor Tablets
334
            ], [self::MODEL, [self::VENDOR, 'Rotor'], [self::TYPE, self::TABLET]], [
335
336
                '/android.+(KS(.+))\s+build/i'                                        // Amazon Kindle Tablets
337
            ], [self::MODEL, [self::VENDOR, 'Amazon'], [self::TYPE, self::TABLET]], [
338
339
                '/android.+(Gigaset)[\s\-]+(Q\w{1,9})\s+build/i'                      // Gigaset Tablets
340
            ], [self::VENDOR, self::MODEL, [self::TYPE, self::TABLET]], [
341
342
                '/\s(tablet|tab)[;\/]/i',                                             // Unidentifiable Tablet
343
                '/\s(mobile)(?:[;\/]|\ssafari)/i'                                     // Unidentifiable Mobile
344
            ], [[self::TYPE, '__lowerize'], self::VENDOR, self::MODEL], [
345
346
                '/[\s\/\(](smart-?tv)[;\)]/i'                                         // SMART_TV
347
            ], [[self::TYPE, self::SMART_TV]], [
348
349
                '/(android[\w\.\s\-]{0,9});.+build/i'                                 // Generic Android Device
350
            ], [self::MODEL, [self::VENDOR, 'Generic']]
351
352
        ];
353
    }
354
}
355