diff --git a/src/Device.php b/src/Device.php index 77cb867..f2e5ff6 100644 --- a/src/Device.php +++ b/src/Device.php @@ -9,6 +9,7 @@ class Device const IPAD = 'iPad'; const IPHONE = 'iPhone'; const WINDOWS_PHONE = 'Windows Phone'; + const ANDROID_PHONE = 'Android Phone'; /** * @var string diff --git a/src/DeviceDetector.php b/src/DeviceDetector.php index 9df8490..9053bf4 100644 --- a/src/DeviceDetector.php +++ b/src/DeviceDetector.php @@ -19,7 +19,8 @@ public static function detect(Device $device, UserAgent $userAgent) self::checkIpad($device, $userAgent) || self::checkIphone($device, $userAgent) || self::checkWindowsPhone($device, $userAgent) || - self::checkSamsungPhone($device, $userAgent) + self::checkSamsungPhone($device, $userAgent) || + self::checkAndroidPhone($device, $userAgent) ); } @@ -79,7 +80,7 @@ private static function checkWindowsPhone(Device $device, UserAgent $userAgent) } /** - * Determine if the device is Windows Phone. + * Determine if the device is Samsung Phone. * * @param Device $device * @param UserAgent $userAgent @@ -87,8 +88,31 @@ private static function checkWindowsPhone(Device $device, UserAgent $userAgent) */ private static function checkSamsungPhone(Device $device, UserAgent $userAgent) { - if (preg_match('/SAMSUNG SM-([^ ]*)/i', $userAgent->getUserAgentString(), $matches)) { - $device->setName(str_ireplace('SAMSUNG', 'Samsung', $matches[0])); + if (preg_match('/SAMSUNG SM-([^ ]*)/i', $userAgent->getUserAgentString(), $matches)) { + $device->setName(str_ireplace('SAMSUNG', 'Samsung', $matches[0])); + return true; + } + + return false; + } + + + /** + * Determine if the device is an Android Phone if Chrome is in use, and returns the Model-Code in $device setName + * + * @param Device $device + * @param UserAgent $userAgent + * @return bool + */ + private static function checkAndroidPhone(Device $device, UserAgent $userAgent) + { + if (stripos($userAgent->getUserAgentString(), 'Android') !== false) { + if (preg_match('/Linux; (Android [0-9\.]*); (?.*)\) AppleWebKit/', $userAgent->getUserAgentString(), $matches)) { + $device->setName("Android_".preg_replace('/ Build.*$/', '', $matches["modell"])); + return true; + } + + $device->setName($device::ANDROID_PHONE); return true; } return false; diff --git a/tests/BrowserDetector/Tests/_files/UserAgentStrings.xml b/tests/BrowserDetector/Tests/_files/UserAgentStrings.xml index d6628ec..0ab3e8b 100644 --- a/tests/BrowserDetector/Tests/_files/UserAgentStrings.xml +++ b/tests/BrowserDetector/Tests/_files/UserAgentStrings.xml @@ -274,5 +274,610 @@ Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/534.34 (KHTML, like Gecko) wkhtmltopdf-amd64 Safari/534.34 + + Chrome + 62.0.3202.84 + Android + 8.0.0 + Android_SM-G960F + unknown + + Mozilla/5.0 (Linux; Android 8.0.0; SM-G960F Build/R16NW) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.84 Mobile Safari/537.36 + + + + Chrome + 60.0.3112.107 + Android + 7.0 + Android_SM-G892A + unknown + + Mozilla/5.0 (Linux; Android 7.0; SM-G892A Build/NRD90M; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/60.0.3112.107 Mobile Safari/537.36 + + + + Chrome + 58.0.3029.83 + Android + 7.0 + Android_SM-G930VC + unknown + + Mozilla/5.0 (Linux; Android 7.0; SM-G930VC Build/NRD90M; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/58.0.3029.83 Mobile Safari/537.36 + + + + Chrome + 55.0.2883.91 + Android + 6.0.1 + Android_SM-G935S + unknown + + Mozilla/5.0 (Linux; Android 6.0.1; SM-G935S Build/MMB29K; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/55.0.2883.91 Mobile Safari/537.36 + + + + Chrome + 52.0.2743.98 + Android + 6.0.1 + Android_SM-G920V + unknown + + Mozilla/5.0 (Linux; Android 6.0.1; SM-G920V Build/MMB29K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.98 Mobile Safari/537.36 + + + + Chrome + 47.0.2526.83 + Android + 5.1.1 + Android_SM-G928X + unknown + + Mozilla/5.0 (Linux; Android 5.1.1; SM-G928X Build/LMY47X) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.83 Mobile Safari/537.36 + + + + Chrome + 47.0.2526.83 + Android + 6.0.1 + Android_Nexus 6P + unknown + + Mozilla/5.0 (Linux; Android 6.0.1; Nexus 6P Build/MMB29P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.83 Mobile Safari/537.36 + + + + Chrome + 59.0.3071.125 + Android + 7.1.1 + Android_G8231 + unknown + + Mozilla/5.0 (Linux; Android 7.1.1; G8231 Build/41.2.A.0.219; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/59.0.3071.125 Mobile Safari/537.36 + + + + Chrome + 52.0.2743.98 + Android + 6.0.1 + Android_E6653 + unknown + + Mozilla/5.0 (Linux; Android 6.0.1; E6653 Build/32.2.A.0.253) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.98 Mobile Safari/537.36 + + + + Chrome + 61.0.3163.98 + Android + 6.0 + Android_HTC One X10 + unknown + + Mozilla/5.0 (Linux; Android 6.0; HTC One X10 Build/MRA58K; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/61.0.3163.98 Mobile Safari/537.36 + + + + Chrome + 52.0.2743.98 + Android + 6.0 + Android_HTC One M9 + unknown + + Mozilla/5.0 (Linux; Android 6.0; HTC One M9 Build/MRA58K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.98 Mobile Safari/537.3 + + + + Chrome + 52.0.2743.98 + Android + 7.0 + Android_Pixel C + unknown + + Mozilla/5.0 (Linux; Android 7.0; Pixel C Build/NRD90M; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/52.0.2743.98 Safari/537.36 + + + + Chrome + 52.0.2743.98 + Android + 6.0.1 + Android_SGP771 + unknown + + Mozilla/5.0 (Linux; Android 6.0.1; SGP771 Build/32.2.A.0.253; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/52.0.2743.98 Safari/537.36 + + + + Chrome + 55.0.2883.91 + Android + 6.0.1 + Android_SHIELD Tablet K1 + unknown + + Mozilla/5.0 (Linux; Android 6.0.1; SHIELD Tablet K1 Build/MRA58K; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/55.0.2883.91 Safari/537.36 + + + + Chrome + 60.0.3112.116 + Android + 7.0 + Android_SM-T827R4 + unknown + + Mozilla/5.0 (Linux; Android 7.0; SM-T827R4 Build/NRD90M) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.116 Safari/537.36 + + + + Chrome + 47.0.2526.80 + Android + 4.4.3 + Android_KFTHWI + unknown + + Mozilla/5.0 (Linux; Android 4.4.3; KFTHWI Build/KTU84M) AppleWebKit/537.36 (KHTML, like Gecko) Silk/47.1.79 like Chrome/47.0.2526.80 Safari/537.36 + + + + Chrome + 34.0.1847.118 + Android + 5.0.2 + Android_LG-V410/V41020c + unknown + + Mozilla/5.0 (Linux; Android 5.0.2; LG-V410/V41020c Build/LRX22G) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/34.0.1847.118 Safari/537.36 + + + + Chrome + 41.99900.2250.0242 + Android + 5.1 + Android_AFTS + unknown + + Mozilla/5.0 (Linux; Android 5.1; AFTS Build/LMY47O) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/41.99900.2250.0242 Safari/537.36 + + + + Firefox + 64.0.2 + Android + 5.0.2 + Android Phone + unknown + + Mozilla/5.0 (Android 5.0.2; Tablet; rv:64.0.2) Gecko/64.0.2 Firefox/64.0.2 + + + + Firefox + 64.0 + Android + 5.0.2 + Android Phone + unknown + + Mozilla/5.0 (Android 5.0.2; Tablet; rv:64.0) Gecko/64.0 Firefox/64.0 + + + + Firefox + 68.0 + Android + 5.1.1 + Android Phone + unknown + + Mozilla/5.0 (Android 5.1.1; Tablet; rv:68.0) Gecko/68.0 Firefox/68.0 + + + + Firefox + 57.0.1 + Android + 7.0 + Android Phone + unknown + + Mozilla/5.0 (Android 7.0; Mobile; rv:57.0.1) Gecko/57.0.1 Firefox/57.0.1 + + + + Firefox + 57.0 + Android + 7.0 + Android Phone + unknown + + Mozilla/5.0 (Android 7.0; Mobile; rv:57.0) Gecko/57.0 Firefox/57.0 + + + + Firefox + 66.0.3 + Android + 7.0 + Android Phone + unknown + + Mozilla/5.0 (Android 7.0; Mobile; rv:66.0.3) Gecko/66.0.3 Firefox/66.0.3 + + + + Firefox + 66.0.5 + Android + 7.0 + Android Phone + unknown + + Mozilla/5.0 (Android 7.0; Mobile; rv:66.0.5) Gecko/66.0.5 Firefox/66.0.5 + + + + Firefox + 66.0 + Android + 7.0 + Android Phone + unknown + + Mozilla/5.0 (Android 7.0; Mobile; rv:66.0) Gecko/66.0 Firefox/66.0 + + + + Firefox + 67.0.2 + Android + 7.0 + Android Phone + unknown + + Mozilla/5.0 (Android 7.0; Mobile; rv:67.0.2) Gecko/67.0.2 Firefox/67.0.2 + + + + Firefox + 67.0 + Android + 7.0 + Android Phone + unknown + + Mozilla/5.0 (Android 7.0; Mobile; rv:67.0) Gecko/67.0 Firefox/67.0 + + + + Firefox + 65.0.1 + Android + 7.0 + Android Phone + unknown + + Mozilla/5.0 (Android 7.0; Tablet; rv:65.0.1) Gecko/65.0.1 Firefox/65.0.1 + + + + Firefox + 65.0 + Android + 7.0 + Android Phone + unknown + + Mozilla/5.0 (Android 7.0; Tablet; rv:65.0) Gecko/65.0 Firefox/65.0 + + + + Firefox + 67.0 + Android + 7.0 + Android Phone + unknown + + Mozilla/5.0 (Android 7.0; Tablet; rv:67.0) Gecko/67.0 Firefox/67.0 + + + + Firefox + 66.0.2 + Android + 7.1.1 + Android Phone + unknown + + Mozilla/5.0 (Android 7.1.1; Mobile; rv:66.0.2) Gecko/66.0.2 Firefox/66.0.2 + + + + Firefox + 66.0 + Android + 7.1.1 + Android Phone + unknown + + Mozilla/5.0 (Android 7.1.1; Mobile; rv:66.0) Gecko/66.0 Firefox/66.0 + + + + Firefox + 62.0.2 + Android + 8.0.0 + Android Phone + unknown + + Mozilla/5.0 (Android 8.0.0; Mobile; rv:62.0.2) Gecko/62.0.2 Firefox/62.0.2 + + + + Firefox + 62.0 + Android + 8.0.0 + Android Phone + unknown + + Mozilla/5.0 (Android 8.0.0; Mobile; rv:62.0) Gecko/62.0 Firefox/62.0 + + + + Firefox + 66.0.2 + Android + 8.0.0 + Android Phone + unknown + + Mozilla/5.0 (Android 8.0.0; Mobile; rv:66.0.2) Gecko/66.0.2 Firefox/66.0.2 + + + + Firefox + 66.0 + Android + 8.0.0 + Android Phone + unknown + + Mozilla/5.0 (Android 8.0.0; Mobile; rv:66.0) Gecko/66.0 Firefox/66.0 + + + + Firefox + 68.0 + Android + 8.0.0 + Android Phone + unknown + + Mozilla/5.0 (Android 8.0.0; Mobile; rv:68.0) Gecko/68.0 Firefox/68.0 + + + + Firefox + 1.4.0 + Android + 8.1.0 + Android Phone + unknown + + Mozilla/5.0 (Android 8.1.0; Tablet; rv:1.4.0) Gecko/1.4.0 Firefox/1.4.0 + + + + Firefox + 56.0 + Android + 8.1.0 + Android Phone + unknown + + Mozilla/5.0 (Android 8.1.0; Tablet; rv:56.0) Gecko/56.0 Firefox/56.0 + + + + Firefox + 63.0 + Android + 8.1.0 + Android Phone + unknown + + Mozilla/5.0 (Android 8.1.0; Tablet; rv:63.0) Gecko/63.0 Firefox/63.0 + + + + Firefox + 68.0 + Android + 8.1.0 + Android Phone + unknown + + Mozilla/5.0 (Android 8.1.0; Tablet; rv:68.0) Gecko/68.0 Firefox/68.0 + + + + Firefox + 68.1.1 + Android + 8.1.0 + Android Phone + unknown + + Mozilla/5.0 (Android 8.1.0; Tablet; rv:68.1.1) Gecko/68.1.1 Firefox/68.1.1 + + + + Firefox + 63.0.2 + Android + 9 + Android Phone + unknown + + Mozilla/5.0 (Android 9; Mobile; rv:63.0.2) Gecko/63.0.2 Firefox/63.0.2 + + + + Firefox + 63.0 + Android + 9 + Android Phone + unknown + + Mozilla/5.0 (Android 9; Mobile; rv:63.0) Gecko/63.0 Firefox/63.0 + + + + Firefox + 65.0.1 + Android + 9 + Android Phone + unknown + + Mozilla/5.0 (Android 9; Mobile; rv:65.0.1) Gecko/65.0.1 Firefox/65.0.1 + + + + Firefox + 65.0 + Android + 9 + Android Phone + unknown + + Mozilla/5.0 (Android 9; Mobile; rv:65.0) Gecko/65.0 Firefox/65.0 + + + + Firefox + 66.0.2 + Android + 9 + Android Phone + unknown + + Mozilla/5.0 (Android 9; Mobile; rv:66.0.2) Gecko/66.0.2 Firefox/66.0.2 + + + + Firefox + 66.0 + Android + 9 + Android Phone + unknown + + Mozilla/5.0 (Android 9; Mobile; rv:66.0) Gecko/66.0 Firefox/66.0 + + + + Firefox + 67.0.3 + Android + 9 + Android Phone + unknown + + Mozilla/5.0 (Android 9; Mobile; rv:67.0.3) Gecko/67.0.3 Firefox/67.0.3 + + + + Firefox + 67.0 + Android + 9 + Android Phone + unknown + + Mozilla/5.0 (Android 9; Mobile; rv:67.0) Gecko/67.0 Firefox/67.0 + + + + Firefox + 68.0 + Android + 9 + Android Phone + unknown + + Mozilla/5.0 (Android 9; Mobile; rv:68.0) Gecko/68.0 Firefox/68.0 + + + + Firefox + 68.1.1 + Android + 9 + Android Phone + unknown + + Mozilla/5.0 (Android 9; Mobile; rv:68.1.1) Gecko/68.1.1 Firefox/68.1.1 + + + + Firefox + 68.2.0 + Android + 9 + Android Phone + unknown + + Mozilla/5.0 (Android 9; Mobile; rv:68.2.0) Gecko/68.2.0 Firefox/68.2.0 + + + + Firefox + 68.0 + Android + 9 + Android Phone + unknown + + Mozilla/5.0 (Android 9; Tablet; rv:68.0) Gecko/68.0 Firefox/68.0 + +