Skip to content
This repository was archived by the owner on Apr 11, 2024. It is now read-only.

Commit dd9d7c1

Browse files
BdR76bnjmnt4n
authored andcommitted
Add a more robust method of detecting Android products.
There are many Android devices in the market, so a regex trick to detect common patterns in the user agent can detect a much greater number of products. Closes #164.
1 parent 6d825df commit dd9d7c1

File tree

2 files changed

+51
-11
lines changed

2 files changed

+51
-11
lines changed

platform.js

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -636,6 +636,19 @@
636636
if (/\bSimulator\b/i.test(ua)) {
637637
product = (product ? product + ' ' : '') + 'Simulator';
638638
}
639+
// Detect Android products.
640+
// Browsers on Android devices typically provide their product IDS after "Android;"
641+
// up to "Build" or ") AppleWebKit".
642+
// Example:
643+
// "Mozilla/5.0 (Linux; Android 8.1.0; Moto G (5) Plus) AppleWebKit/537.36
644+
// (KHTML, like Gecko) Chrome/70.0.3538.80 Mobile Safari/537.36"
645+
if (/\bAndroid\b/.test(os) && !product &&
646+
(data = /\bAndroid[^;]*;(.*?)(?:Build|\) AppleWebKit)\b/i.exec(ua))) {
647+
product = trim(data[1])
648+
// Replace any language codes (eg. "en-US").
649+
.replace(/^[a-z]{2}-[a-z]{2};\s*/i, '')
650+
|| null;
651+
}
639652
// Detect Opera Mini 8+ running in Turbo/Uncompressed mode on iOS.
640653
if (name == 'Opera Mini' && /\bOPiOS\b/.test(ua)) {
641654
description.push('running in Turbo/Uncompressed mode');

test/test.js

Lines changed: 38 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -139,11 +139,12 @@
139139
'version': '2.5'
140140
},
141141

142-
'Android Browser (like Safari 4.x) on Android 2.1': {
142+
'Android Browser (like Safari 4.x) on Sprint APA9292KT (Android 2.1)': {
143143
'ua': 'Mozilla/5.0 (Linux; U; Android 2.1-update1; en-us; Sprint APA9292KT Build/ERE27) AppleWebKit/530.17 (KHTML, like Gecko)',
144144
'layout': 'WebKit',
145145
'name': 'Android Browser',
146-
'os': 'Android 2.1'
146+
'os': 'Android 2.1',
147+
'product': 'Sprint APA9292KT'
147148
},
148149

149150
'Android Browser (like Chrome 8.0) on Asus Transformer': {
@@ -165,6 +166,15 @@
165166
'os': 'Android'
166167
},
167168

169+
'Android Browser 4.0 (like Chrome 33.0.0.0) on HUAWEI H891L (Android 4.4.4)': {
170+
'ua': 'Mozilla/5.0 (Linux; Android 4.4.4; HUAWEI H891L Build/HuaweiH891L) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/33.0.0.0 Mobile Safari/537.36',
171+
'layout': 'Blink',
172+
'name': 'Android Browser',
173+
'os': 'Android 4.4.4',
174+
'product': 'HUAWEI H891L',
175+
'version': '4.0'
176+
},
177+
168178
'Android Browser 1.0 (like Chrome 18.0.1025.308) on Samsung Galaxy S4 (Android 4.2.2)': {
169179
'ua' : 'Mozilla/5.0 (Linux; Android 4.2.2; en-au; SAMSUNG GT-I9500 Build/JDQ39) AppleWebKit/535.19 (KHTML, like Gecko) Version/1.0 Chrome/18.0.1025.308 Mobile Safari/535.19',
170180
'layout': 'WebKit',
@@ -241,12 +251,13 @@
241251
'version': '4.0'
242252
},
243253

244-
'Android Browser 4.0 (like Chrome 33.0.0.0) on Android 4.4.4': {
254+
'Android Browser 4.0 (like Chrome 33.0.0.0) on SGH-M919 (Android 4.4.4)': {
245255
'ua': 'Mozilla/5.0 (Linux; Android 4.4.4; SGH-M919 Build/KTU84P) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/33.0.0.0 Mobile Safari/537.36',
246256
'layout': 'Blink',
247257
'likeChrome': true,
248258
'name': 'Android Browser',
249259
'os': 'Android 4.4.4',
260+
'product': 'SGH-M919',
250261
'version': '4.0'
251262
},
252263

@@ -272,21 +283,23 @@
272283
'version': '4.0'
273284
},
274285

275-
'Android Browser 4.0 (like Chrome 40.0.2214.89) on Android 5.1.1': {
286+
'Android Browser 4.0 (like Chrome 40.0.2214.89) on SGP521 (Android 5.1.1)': {
276287
'ua': 'Mozilla/5.0 (Linux; Android 5.1.1; SGP521 Build/23.4.A.0.546) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/40.0.2214.89 Safari/537.36',
277288
'layout': 'Blink',
278289
'likeChrome': true,
279290
'name': 'Android Browser',
280291
'os': 'Android 5.1.1',
292+
'product': 'SGP521',
281293
'version': '4.0'
282294
},
283295

284-
'Android Browser 4.0 (like Chrome 42.0.2311.129) on Android 5.1': {
296+
'Android Browser 4.0 (like Chrome 42.0.2311.129) on XT1254 (Android 5.1)': {
285297
'ua': 'Mozilla/5.0 (Linux; Android 5.1; XT1254 Build/SU4TL-44; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/42.0.2311.129 Mobile Safari/537.36',
286298
'layout': 'Blink',
287299
'likeChrome': true,
288300
'name': 'Android Browser',
289301
'os': 'Android 5.1',
302+
'product': 'XT1254',
290303
'version': '4.0'
291304
},
292305

@@ -635,6 +648,15 @@
635648
'version': '45.0.2454.94'
636649
},
637650

651+
'Chrome Mobile 70.0.3538.80 on Moto G (5) Plus (Android 8.1.0)': {
652+
'ua': 'Mozilla/5.0 (Linux; Android 8.1.0; Moto G (5) Plus) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.80 Mobile Safari/537.36',
653+
'layout': 'Blink',
654+
'name': 'Chrome Mobile',
655+
'os': 'Android 8.1.0',
656+
'product': 'Moto G (5) Plus',
657+
'version': '70.0.3538.80'
658+
},
659+
638660
'Chrome Mobile (desktop mode) on iOS 4.3+': {
639661
'ua': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/534.53.11 (KHTML, like Gecko) Version/5.1.3 Safari/534.53.10',
640662
'layout': 'WebKit',
@@ -2561,12 +2583,13 @@
25612583
'version': '30.0.1650.0'
25622584
},
25632585

2564-
'SRWare Iron Mobile 74.0.3729.136 (like Chrome 74.0.3729.136) on Android 10': {
2586+
'SRWare Iron 74.0.3729.136 (like Chrome 74.0.3729.136) on LYA-L0C (Android 10)': {
25652587
'ua': 'Mozilla/5.0 (Linux; Android 10; LYA-L0C) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.136 Mobile Iron Safari/537.36',
25662588
'layout': 'Blink',
25672589
'likeChrome': true,
2568-
'name': 'SRWare Iron Mobile',
2590+
'name': 'SRWare Iron',
25692591
'os': 'Android 10',
2592+
'product': 'LYA-L0C',
25702593
'version': '74.0.3729.136'
25712594
},
25722595

@@ -2612,12 +2635,13 @@
26122635
'version': '3.0.10#{alpha}'
26132636
},
26142637

2615-
'UC Browser 11.3.0.950 (like Chrome 12.x) on Android 5.0':{
2638+
'UC Browser 11.3.0.950 (like Chrome 12.x) on SM-N900 (Android 5.0)':{
26162639
'ua': 'Mozilla/5.0 (Linux; U; Android 5.0; en-US; SM-N900 Build/LRX21V) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 UCBrowser/11.3.0.950 U3/0.8.0 Mobile Safari/534.30',
26172640
'layout': 'WebKit',
26182641
'likeChrome': true,
26192642
'name': 'UC Browser',
26202643
'os': 'Android 5.0',
2644+
'product': 'SM-N900',
26212645
'version': '11.3.0.950'
26222646
},
26232647

@@ -2631,21 +2655,23 @@
26312655
'version': '11.3.5.1203'
26322656
},
26332657

2634-
'UC Browser 13.2.0.1296 (like Chrome 57.0.2987.108) on Android 10':{
2658+
'UC Browser 13.2.0.1296 (like Chrome 57.0.2987.108) on SM-N975F (Android 10)':{
26352659
'ua': 'Mozilla/5.0 (Linux; U; Android 10; ar-SA; SM-N975F Build/QP1A.190711.020) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/57.0.2987.108 UCBrowser/13.2.0.1296 Mobile Safari/537.36',
26362660
'layout': 'Blink',
26372661
'likeChrome': true,
26382662
'name': 'UC Browser',
26392663
'os': 'Android 10',
2664+
'product': 'SM-N975F',
26402665
'version': '13.2.0.1296'
26412666
},
26422667

2643-
'UC Browser 13.2.0.1296 (speed mode; like Chrome 12.x) on Android 9':{
2668+
'UC Browser 13.2.0.1296 (speed mode; like Chrome 12.x) on Redmi Note 5 Pro (Android 9)':{
26442669
'ua': 'Mozilla/5.0 (Linux; U; Android 9; en-US; Redmi Note 5 Pro Build/PKQ1.180904.001) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 UCBrowser/13.2.0.1296 (SpeedMode) U4/1.0 UCWEB/2.0 Mobile Safari/534.30',
26452670
'layout': 'WebKit',
26462671
'likeChrome': true,
26472672
'name': 'UC Browser',
26482673
'os': 'Android 9',
2674+
'product': 'Redmi Note 5 Pro',
26492675
'version': '13.2.0.1296'
26502676
},
26512677

@@ -2742,12 +2768,13 @@
27422768
'product': 'Wii U'
27432769
},
27442770

2745-
'Yandex Browser 20.4.5.63.00 (like Chrome 81.0.4044.138) on Android 8.1.0': {
2771+
'Yandex Browser 20.4.5.63.00 (like Chrome 81.0.4044.138) on SM-J260F (Android 8.1.0)': {
27462772
'ua': 'Mozilla/5.0 (Linux; arm; Android 8.1.0; SM-J260F) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 YaBrowser/20.4.5.63.00 SA/1 Mobile Safari/537.36',
27472773
'layout': 'Blink',
27482774
'likeChrome': true,
27492775
'name': 'Yandex Browser',
27502776
'os': 'Android 8.1.0',
2777+
'product': 'SM-J260F',
27512778
'version': '20.4.5.63.00'
27522779
},
27532780

0 commit comments

Comments
 (0)