OperatingSystems   A
last analyzed

Complexity

Total Complexity 3

Size/Duplication

Total Lines 344
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 1

Importance

Changes 8
Bugs 1 Features 3
Metric Value
wmc 3
c 8
b 1
f 3
lcom 1
cbo 1
dl 0
loc 344
rs 10

3 Methods

Rating   Name   Duplication   Size   Complexity  
B getAndroidVersions() 0 115 1
B getiOsVersions() 0 85 1
A getFamily() 0 4 1
1
<?php
2
namespace MobileDetect\Providers;
3
4
class OperatingSystems extends AbstractProvider
5
{
6
    /**
7
     * List of mobile Operating Systems.
8
     *
9
     * @var array
10
     */
11
    protected $data = array(
12
        /**
13
         * Android OS family.
14
         *
15
         */
16
        'Android' => array(
17
            'Android' => array(
18
                'vendor' => 'Google',
19
                'model' => 'Android',
20
                'isMobile' => true,
21
                'identityMatches' => 'Android',
22
                'matchType' => 'strpos',
23
                'versionMatches' => array('Android[ -][VER]'),
24
                'versionHelper' => 'getAndroidVersions'
25
            ),
26
        ),
27
        /**
28
         * Apple's iOS family.
29
         *
30
         */
31
        'iOS' => array(
32
            'iOS' => array(
33
                'vendor' => 'Apple',
34
                'model' => 'iOS',
35
                'isMobile' => true,
36
                'identityMatches' => '\biPhone.*(Mobile|OS)|\biPod|\biPad',
37
                'versionMatches' => array('\bOS\b [VER]', 'iPhone OS/[VER]', 'iOS [VER];'),
38
                'versionHelper' => 'getiOsVersions'
39
            ),
40
        ),
41
42
        /**
43
         * Mac family.
44
         */
45
        'Mac' => array(
46
            'OSX' => array(
47
                'vendor' => 'Apple',
48
                'isMobile' => false,
49
                'identityMatches' => 'Mac OS X',
50
                'versionMatches' => array('Mac OS X [VER]'),
51
            ),
52
        ),
53
54
        /**
55
         * Windows OS family.
56
         *
57
         * @docs http://en.wikipedia.org/wiki/Windows_Mobile
58
         *       http://en.wikipedia.org/wiki/Windows_Phone
59
         *       http://wifeng.cn/?r=blog&a=view&id=106
60
         *       http://nicksnettravels.builttoroam.com/post/2011/01/10/Bogus-Windows-Phone-7-User-Agent-String.aspx
61
         */
62
        // @docs http://en.wikipedia.org/wiki/Windows_Mobile
63
        'Windows' => array(
64
            'Windows Mobile' => array(
65
                'vendor' => 'Microsoft',
66
                'model' => 'Windows Mobile',
67
                'isMobile' => true,
68
                'identityMatches' => 'Windows CE.*(PPC|Smartphone|Mobile|[0-9]{3}x[0-9]{3})|Window Mobile|Windows Phone [0-9.]+|WCE;',
69
                'versionMatches' => array('Windows CE/[VER]'),
70
            ),
71
            // @docs http://windowsteamblog.com/windows_phone/b/wpdev/archive/2011/08/29/introducing-the-ie9-on-windows-phone-mango-user-agent-string.aspx
72
            // @docs http://en.wikipedia.org/wiki/Windows_NT#Releases
73
            'Windows Phone' => array(
74
                'vendor' => 'Microsoft',
75
                'model' => 'Windows Phone',
76
                'isMobile' => true,
77
                'identityMatches' => 'Windows Phone 8.1|Windows Phone 8.0|Windows Phone OS|XBLWP7|ZuneWP7|Windows NT 6.[23]; ARM;',
78
                'versionMatches' => array('Windows Phone OS [VER]', 'Windows Phone [VER]', 'Windows NT [VER]'),
79
            ),
80
            // @docs http://social.msdn.microsoft.com/Forums/en-US/windowsdeveloperpreviewgeneral/thread/6be392da-4d2f-41b4-8354-8dcee20c85cd
81
            'Windows Classic' => array(
82
                'vendor' => 'Microsoft',
83
                'model' => 'Windows',
84
                'isMobile' => false,
85
                'identityMatches' => 'Windows|Win64',
86
                'versionMatches' => array('Windows NT [VER]'),
87
            ),
88
        ),
89
        
90
        // @docs https://supportforums.blackberry.com/t5/tkb/articleprintpage/tkb-id/browser_dev@tkb/article-id/69
91
        'BlackBerry' => array(
92
            // @docs https://en.wikipedia.org/wiki/BlackBerry_Tablet_OS
93
            'BlackBerry Tablet' => array(
94
                'vendor' => 'BlackBerry',
95
                'model' => 'BlackBerry Tablet',
96
                'isMobile' => true,
97
                'identityMatches' => 'PlayBook|RIM Tablet',
98
                'versionMatches' => array('Tablet OS [VER]')
99
            ),
100
            'BlackBerry' => array(
101
                'vendor' => 'BlackBerry',
102
                'model' => 'BlackBerry',
103
                'isMobile' => true,
104
                'identityMatches' => 'blackberry|\bBB10\b|rim tablet os',
105
                'versionMatches' => array('Version/[VER]', 'BlackBerry[VER]', 'BlackBerry [VER];')
106
            )
107
        ),
108
109
        'Bada' => array(
110
            /**
111
             * Bada was developed only for mobile devices.
112
             * @docs https://en.wikipedia.org/wiki/Bada
113
             */
114
            'Bada' => array(
115
                'vendor' => 'Bada',
116
                'model' => 'Bada',
117
                'isMobile' => true,
118
                'identityMatches' => '\bBada\b',
119
                'versionMatches' => array('Bada/[VER]')
120
            )
121
        ),
122
        
123
        /**
124
         * JAVA OS family.
125
         *
126
         * @docs https://en.wikipedia.org/wiki/Java_Platform,_Micro_Edition
127
         * @docs https://en.wikipedia.org/wiki/Mobile_Information_Device_Profile
128
         */
129
        'Java' => array(
130
            'Java Mobile' => array(
131
                'vendor' => 'Oracle',
132
                'model' => 'Java Mobile',
133
                'isMobile' => true,
134
                // '|Java/' produces bug #135
135
                'identityMatches' => 'J2ME/|\bMIDP\b|\bCLDC\b',
136
                'versionMatches' => array('MIDP-[VER]', 'MMP/[VER]', 'J2ME/[VER]')
137
            )
138
        )
139
    );
140
141
    public function getAndroidVersions()
142
    {
143
        return array(
144
            'LVY48F' => array('version' => '5.1.1_r18', 'codename' => 'Lollipop'),
145
            'LYZ28K' => array('version' => '5.1.1_r17', 'codename' => 'Lollipop'),
146
            'LMY48P' => array('version' => '5.1.1_r16', 'codename' => 'Lollipop'),
147
            'LMY48N' => array('version' => '5.1.1_r15', 'codename' => 'Lollipop'),
148
            'LMY48M' => array('version' => '5.1.1_r14', 'codename' => 'Lollipop'),
149
            'LVY48E' => array('version' => '5.1.1_r13', 'codename' => 'Lollipop'),
150
            'LYZ28J' => array('version' => '5.1.1_r12', 'codename' => 'Lollipop'),
151
            'LMY48J' => array('version' => '5.1.1_r10', 'codename' => 'Lollipop'),
152
            'LMY48I' => array('version' => '5.1.1_r9', 'codename' => 'Lollipop'),
153
            'LVY48C' => array('version' => '5.1.1_r8', 'codename' => 'Lollipop'),
154
            'LMY48G' => array('version' => '5.1.1_r6', 'codename' => 'Lollipop'),
155
            'LYZ28E' => array('version' => '5.1.1_r5', 'codename' => 'Lollipop'),
156
            'LMY47Z' => array('version' => '5.1.1_r4', 'codename' => 'Lollipop'),
157
            'LMY48B' => array('version' => '5.1.1_r3', 'codename' => 'Lollipop'),
158
            'LMY47X' => array('version' => '5.1.1_r2', 'codename' => 'Lollipop'),
159
            'LMY47V' => array('version' => '5.1.1_r1', 'codename' => 'Lollipop'),
160
            'LMY47O' => array('version' => '5.1.0_r5', 'codename' => 'Lollipop'),
161
            'LMY47M' => array('version' => '5.1.0_r4', 'codename' => 'Lollipop'),
162
            'LMY47I' => array('version' => '5.1.0_r3', 'codename' => 'Lollipop'),
163
            'LMY47E' => array('version' => '5.1.0_r2', 'codename' => 'Lollipop'),
164
            'LMY47D' => array('version' => '5.1.0_r1', 'codename' => 'Lollipop'),
165
            'LRX22L' => array('version' => '5.0.2_r3', 'codename' => 'Lollipop'),
166
            'LRX22G' => array('version' => '5.0.2_r1', 'codename' => 'Lollipop'),
167
            'LRX22C' => array('version' => '5.0.1_r1', 'codename' => 'Lollipop'),
168
            'LRX21V' => array('version' => '5.0.0_r7.0.1', 'codename' => 'Lollipop'),
169
            'LRX21T' => array('version' => '5.0.0_r6.0.1', 'codename' => 'Lollipop'),
170
            'LRX21R' => array('version' => '5.0.0_r5.1.0.1', 'codename' => 'Lollipop'),
171
            'LRX21Q' => array('version' => '5.0.0_r5.0.1', 'codename' => 'Lollipop'),
172
            'LRX21P' => array('version' => '5.0.0_r4.0.1', 'codename' => 'Lollipop'),
173
            'LRX21O' => array('version' => '5.0.0_r3.0.1', 'codename' => 'Lollipop'),
174
            'LRX21M' => array('version' => '5.0.0_r2.0.1', 'codename' => 'Lollipop'),
175
            'LRX21L' => array('version' => '5.0.0_r1.0.1', 'codename' => 'Lollipop'),
176
            'KTU84Q' => array('version' => '4.4.4_r2', 'codename' => 'KitKat'),
177
            'KTU84P' => array('version' => '4.4.4_r1', 'codename' => 'KitKat'),
178
            'KTU84M' => array('version' => '4.4.3_r1.1', 'codename' => 'KitKat'),
179
            'KTU84L' => array('version' => '4.4.3_r1', 'codename' => 'KitKat'),
180
            'KVT49L' => array('version' => '4.4.2_r2', 'codename' => 'KitKat'),
181
            'KOT49H' => array('version' => '4.4.2_r1', 'codename' => 'KitKat'),
182
            'KOT49E' => array('version' => '4.4.1_r1', 'codename' => 'KitKat'),
183
            'KRT16S' => array('version' => '4.4_r1.2', 'codename' => 'KitKat'),
184
            'KRT16M' => array('version' => '4.4_r1', 'codename' => 'KitKat'),
185
            'JLS36I' => array('version' => '4.3.1_r1', 'codename' => 'Jelly Bean'),
186
            'JLS36C' => array('version' => '4.3_r3', 'codename' => 'Jelly Bean'),
187
            'JSS15R' => array('version' => '4.3_r2.3', 'codename' => 'Jelly Bean'),
188
            'JSS15Q' => array('version' => '4.3_r2.2', 'codename' => 'Jelly Bean'),
189
            'JSS15J' => array('version' => '4.3_r2.1', 'codename' => 'Jelly Bean'),
190
            'JSR78D' => array('version' => '4.3_r2', 'codename' => 'Jelly Bean'),
191
            'JWR66Y' => array('version' => '4.3_r1.1', 'codename' => 'Jelly Bean'),
192
            'JWR66V' => array('version' => '4.3_r1', 'codename' => 'Jelly Bean'),
193
            'JWR66N' => array('version' => '4.3_r0.9.1', 'codename' => 'Jelly Bean'),
194
            'JWR66L' => array('version' => '4.3_r0.9', 'codename' => 'Jelly Bean'),
195
            'JDQ39E' => array('version' => '4.2.2_r1.2', 'codename' => 'Jelly Bean'),
196
            'JDQ39B' => array('version' => '4.2.2_r1.1', 'codename' => 'Jelly Bean'),
197
            'JDQ39' => array('version' => '4.2.2_r1', 'codename' => 'Jelly Bean'),
198
            'JOP40G' => array('version' => '4.2.1_r1.2', 'codename' => 'Jelly Bean'),
199
            'JOP40F' => array('version' => '4.2.1_r1.1', 'codename' => 'Jelly Bean'),
200
            'JOP40D' => array('version' => '4.2.1_r1', 'codename' => 'Jelly Bean'),
201
            'JOP40C' => array('version' => '4.2_r1', 'codename' => 'Jelly Bean'),
202
            'JZO54M' => array('version' => '4.1.2_r2.1', 'codename' => 'Jelly Bean'),
203
            'JZO54L' => array('version' => '4.1.2_r2', 'codename' => 'Jelly Bean'),
204
            'JZO54K' => array('version' => '4.1.2_r1', 'codename' => 'Jelly Bean'),
205
            'JRO03S' => array('version' => '4.1.1_r6.1', 'codename' => 'Jelly Bean'),
206
            'JRO03R' => array('version' => '4.1.1_r6', 'codename' => 'Jelly Bean'),
207
            'JRO03O' => array('version' => '4.1.1_r5', 'codename' => 'Jelly Bean'),
208
            'JRO03L' => array('version' => '4.1.1_r4', 'codename' => 'Jelly Bean'),
209
            'JRO03H' => array('version' => '4.1.1_r3', 'codename' => 'Jelly Bean'),
210
            'JRO03E' => array('version' => '4.1.1_r2', 'codename' => 'Jelly Bean'),
211
            'JRO03D' => array('version' => '4.1.1_r1.1', 'codename' => 'Jelly Bean'),
212
            'JRO03C' => array('version' => '4.1.1_r1', 'codename' => 'Jelly Bean'),
213
            'IMM76L' => array('version' => '4.0.4_r2.1', 'codename' => 'Ice Cream Sandwich'),
214
            'IMM76K' => array('version' => '4.0.4_r2', 'codename' => 'Ice Cream Sandwich'),
215
            'IMM76I' => array('version' => '4.0.4_r1.2', 'codename' => 'Ice Cream Sandwich'),
216
            'IMM76D' => array('version' => '4.0.4_r1.1', 'codename' => 'Ice Cream Sandwich'),
217
            'IMM76' => array('version' => '4.0.4_r1', 'codename' => 'Ice Cream Sandwich'),
218
            'IML77' => array('version' => '4.0.3_r1.1', 'codename' => 'Ice Cream Sandwich'),
219
            'IML74K' => array('version' => '4.0.3_r1', 'codename' => 'Ice Cream Sandwich'),
220
            'ICL53F' => array('version' => '4.0.2_r1', 'codename' => 'Ice Cream Sandwich'),
221
            'ITL41F' => array('version' => '4.0.1_r1.2', 'codename' => 'Ice Cream Sandwich'),
222
            'ITL41D' => array('version' => '4.0.1_r1.1', 'codename' => 'Ice Cream Sandwich'),
223
            'GWK74' => array('version' => '2.3.7_r1', 'codename' =>  'Gingerbread'),
224
            'GRK39F' => array('version' => '2.3.6_r1', 'codename' =>  'Gingerbread'),
225
            'GRK39C' => array('version' => '2.3.6_r0.9', 'codename' =>  'Gingerbread'),
226
            'GRJ90' => array('version' => '2.3.5_r1', 'codename' =>  'Gingerbread'),
227
            'GRJ22' => array('version' => '2.3.4_r1', 'codename' =>  'Gingerbread'),
228
            'GRJ06D' => array('version' => '2.3.4_r0.9', 'codename' =>  'Gingerbread'),
229
            'GRI54' => array('version' => '2.3.3_r1.1', 'codename' =>  'Gingerbread'),
230
            'GRI40' => array('version' => '2.3.3_r1', 'codename' =>  'Gingerbread'),
231
            'GRH78C' => array('version' => '2.3.2_r1', 'codename' =>  'Gingerbread'),
232
            'GRH78' => array('version' => '2.3.1_r1', 'codename' =>  'Gingerbread'),
233
            'GRH55' => array('version' => '2.3_r1', 'codename' =>  'Gingerbread'),
234
            'FRK76C' => array('version' => '2.2.3_r2' , 'codename' => 'Froyo'),
235
            'FRK76' => array('version' => '2.2.3_r1' , 'codename' => 'Froyo'),
236
            'FRG83G' => array('version' => '2.2.2_r1' , 'codename' => 'Froyo'),
237
            'FRG83D' => array('version' => '2.2.1_r2' , 'codename' => 'Froyo'),
238
            'FRG83' => array('version' => '2.2.1_r1' , 'codename' => 'Froyo'),
239
            'FRG22D' => array('version' => '2.2_r1.3' , 'codename' => 'Froyo'),
240
            'FRG01B' => array('version' => '2.2_r1.2' , 'codename' => 'Froyo'),
241
            'FRF91' => array('version' => '2.2_r1.1' , 'codename' => 'Froyo'),
242
            'FRF85B' => array('version' => '2.2_r1' , 'codename' => 'Froyo'),
243
            'EPF21B' => array('version' => '2.1_r2.1p2', 'codename' => 'Eclair'),
244
            'ESE81' => array('version' => '2.1_r2.1s', 'codename' => 'Eclair'),
245
            'EPE54B' => array('version' => '2.1_r2.1p', 'codename' => 'Eclair'),
246
            'ERE27' => array('version' => '2.1_r2', 'codename' => 'Eclair'),
247
            'ERD79' => array('version' => '2.1_r1', 'codename' => 'Eclair'),
248
            'ESD56' => array('version' => '2.0.1_r1', 'codename' => 'Eclair'),
249
            'ESD20' => array('version' => '2.0_r1', 'codename' => 'Eclair'),
250
            'DMD64' => array('version' => '1.6_r1.5', 'codename' => 'Donut'),
251
            'DRD20' => array('version' => '1.6_r1.4', 'codename' => ''),
252
            'DRD08' => array('version' => '1.6_r1.3', 'codename' => ''),
253
            'DRC92' => array('version' => '1.6_r1.2', 'codename' => ''),
254
        );
255
    }
256
257
    public function getiOsVersions()
258
    {
259
        // Updated from https://en.wikipedia.org/wiki/IOS_version_history
260
        return array(
261
            '7A341' => array('version' => '3.0', 'codename' => ''),
262
            '7A400' => array('version' => '3.1', 'codename' => ''),
263
            '7C144' => array('version' => '3.1.1', 'codename' => ''),
264
            '7C145' => array('version' => '3.1.1', 'codename' => ''),
265
            '7C146' => array('version' => '3.1.1', 'codename' => ''),
266
            '7D11' => array('version' => '3.1.2', 'codename' => ''),
267
            '7E18' => array('version' => '3.1.3', 'codename' => ''),
268
            '7B367' => array('version' => '3.2', 'codename' => ''),
269
            '7B405' => array('version' => '3.2.1', 'codename' => ''),
270
            '7B500' => array('version' => '3.2.2', 'codename' => ''),
271
            '8A293' => array('version' => '4.0', 'codename' => ''),
272
            '8A306' => array('version' => '4.0.1', 'codename' => ''),
273
            '8A400' => array('version' => '4.0.2', 'codename' => ''),
274
            '8B117' => array('version' => '4.1', 'codename' => ''),
275
            '8C148' => array('version' => '4.2.1', 'codename' => ''),
276
            '8C148a' => array('version' => '4.2.1', 'codename' => ''),
277
            '8E128' => array('version' => '4.2.5', 'codename' => ''),
278
            '8E200' => array('version' => '4.2.6', 'codename' => ''),
279
            '8E303' => array('version' => '4.2.7', 'codename' => ''),
280
            '8E401' => array('version' => '4.2.8', 'codename' => ''),
281
            '8E501' => array('version' => '4.2.9', 'codename' => ''),
282
            '8E600' => array('version' => '4.2.10', 'codename' => ''),
283
            '8F190' => array('version' => '4.3', 'codename' => ''),
284
            '8F191' => array('version' => '4.3', 'codename' => ''),
285
            '8G4' => array('version' => '4.3.1', 'codename' => ''),
286
            '8H7' => array('version' => '4.3.2', 'codename' => ''),
287
            '8H8' => array('version' => '4.3.2', 'codename' => ''),
288
            '8J2' => array('version' => '4.3.3', 'codename' => ''),
289
            '8J3' => array('version' => '4.3.3', 'codename' => ''),
290
            '8K2' => array('version' => '4.3.4', 'codename' => ''),
291
            '8L1' => array('version' => '4.3.5', 'codename' => ''),
292
            '9A334' => array('version' => '5.0', 'codename' => ''),
293
            '9A405' => array('version' => '5.0.1', 'codename' => ''),
294
            '9A406' => array('version' => '5.0.1', 'codename' => ''),
295
            '9B176' => array('version' => '5.1', 'codename' => ''),
296
            '9B179' => array('version' => '5.1', 'codename' => ''),
297
            '9B206' => array('version' => '5.1.1', 'codename' => ''),
298
            '9B208' => array('version' => '5.1.1', 'codename' => ''),
299
            '10A403' => array('version' => '6.0', 'codename' => ''),
300
            '10A405' => array('version' => '6.0', 'codename' => ''),
301
            '10A406' => array('version' => '6.0', 'codename' => ''),
302
            '10A523' => array('version' => '6.0.1', 'codename' => ''),
303
            '10A525' => array('version' => '6.0.1', 'codename' => ''),
304
            '10A551' => array('version' => '6.0.2', 'codename' => ''),
305
            '10B141' => array('version' => '6.1', 'codename' => ''),
306
            '10B142' => array('version' => '6.1', 'codename' => ''),
307
            '10B143' => array('version' => '6.1', 'codename' => ''),
308
            '10B144' => array('version' => '6.1', 'codename' => ''),
309
            '10B145' => array('version' => '6.1.1', 'codename' => ''),
310
            '10B146' => array('version' => '6.1.2', 'codename' => ''),
311
            '10B147' => array('version' => '6.1.2', 'codename' => ''),
312
            '10B329' => array('version' => '6.1.3', 'codename' => ''),
313
            '10B350' => array('version' => '6.1.4', 'codename' => ''),
314
            '10B400' => array('version' => '6.1.5', 'codename' => ''),
315
            '10B500' => array('version' => '6.1.6', 'codename' => ''),
316
            '11A465' => array('version' => '7.0', 'codename' => ''),
317
            '11A466' => array('version' => '7.0', 'codename' => ''),
318
            '11A470a' => array('version' => '7.0.1', 'codename' => ''),
319
            '11A501' => array('version' => '7.0.2', 'codename' => ''),
320
            '11B511' => array('version' => '7.0.3', 'codename' => ''),
321
            '11B554a' => array('version' => '7.0.4', 'codename' => ''),
322
            '11B601' => array('version' => '7.0.5', 'codename' => ''),
323
            '11B651' => array('version' => '7.0.6', 'codename' => ''),
324
            '11D167' => array('version' => '7.1', 'codename' => ''),
325
            '11D169' => array('version' => '7.1', 'codename' => ''),
326
            '11D201' => array('version' => '7.1.1', 'codename' => ''),
327
            '11D257' => array('version' => '7.1.2', 'codename' => ''),
328
            '12A365' => array('version' => '8.0', 'codename' => ''),
329
            '12A366' => array('version' => '8.0', 'codename' => ''),
330
            '12A402' => array('version' => '8.0.1', 'codename' => ''),
331
            '12A405' => array('version' => '8.0.2', 'codename' => ''),
332
            '12B410' => array('version' => '8.1', 'codename' => ''),
333
            '12B411' => array('version' => '8.1', 'codename' => ''),
334
            '12B435' => array('version' => '8.1.1', 'codename' => ''),
335
            '12B436' => array('version' => '8.1.1', 'codename' => ''),
336
            '12B440' => array('version' => '8.1.2', 'codename' => ''),
337
            '12D508' => array('version' => '8.2', 'codename' => ''),
338
            '12F69' => array('version' => '8.3', 'codename' => ''),
339
            '13T5365h' => array('version' => '9.1', 'codename' => ''),
340
        );
341
    }
342
343
    public function getFamily($familyName)
344
    {
345
        return $this->data[$familyName];
346
    }
347
}