Файл: vendor/whichbrowser/parser/src/Analyser/Header/Useragent/Application.php
Строк: 472
<?php
namespace WhichBrowserAnalyserHeaderUseragent;
use WhichBrowserConstants;
use WhichBrowserData;
use WhichBrowserModelFamily;
use WhichBrowserModelUsing;
use WhichBrowserModelVersion;
trait Application
{
private function &detectApplication($ua)
{
/* Detect applications */
$this->detectSpecificApplications($ua);
$this->detectRemainingApplications($ua);
return $this;
}
private function detectSpecificApplications($ua)
{
/* Sony Updatecenter */
if (preg_match('/^(.*) Build/.* (?:com.sonyericsson.updatecenter|UpdateCenter)/[A-Z0-9.]+$/iu', $ua, $match)) {
$this->data->browser->name = 'Sony Update Center';
$this->data->browser->version = null;
$this->data->browser->type = ConstantsBrowserType::APP;
$this->data->os->reset([
'name' => 'Android'
]);
$this->data->device->model = $match[1];
$this->data->device->identified |= ConstantsId::PATTERN;
$this->data->device->type = ConstantsDeviceType::MOBILE;
$device = DataDeviceModels::identify('android', $match[1]);
if ($device->identified) {
$device->identified |= $this->data->device->identified;
$this->data->device = $device;
}
}
/* Sony Select SDK */
if (preg_match('/Android [0-9.]+; (.*) Sony/.*SonySelectSDK/([0-9.]+)/iu', $ua, $match)) {
$this->data->browser->reset();
$this->data->browser->type = ConstantsBrowserType::APP;
$this->data->browser->using = new WhichBrowserModelUsing([
'name' => 'Sony Select SDK',
'version' => new Version([ 'value' => $match[2], 'details' => 2 ])
]);
$this->data->device->model = $match[1];
$this->data->device->identified |= ConstantsId::PATTERN;
$this->data->device->type = ConstantsDeviceType::MOBILE;
$device = DataDeviceModels::identify('android', $match[1]);
if ($device->identified) {
$device->identified |= $this->data->device->identified;
$this->data->device = $device;
}
}
/* Samsung Mediahub */
if (preg_match('/^Stamhub [^/]+/([^;]+);.*:([0-9.]+)/[^/]+/[^:]+:user/release-keys$/iu', $ua, $match)) {
$this->data->browser->name = 'Mediahub';
$this->data->browser->version = null;
$this->data->browser->type = ConstantsBrowserType::APP_MEDIAPLAYER;
$this->data->os->reset([
'name' => 'Android',
'version' => new Version([ 'value' => $match[2] ])
]);
$this->data->device->model = $match[1];
$this->data->device->identified |= ConstantsId::PATTERN;
$this->data->device->type = ConstantsDeviceType::MOBILE;
$device = DataDeviceModels::identify('android', $match[1]);
if ($device->identified) {
$device->identified |= $this->data->device->identified;
$this->data->device = $device;
}
}
/* "Android Application" */
if (preg_match('/Android Application/iu', $ua)) {
if (preg_match('/^(.+) Android Application ([0-9]+, .+ v[0-9.]+) - [a-z-]+ (.*) [a-z_-]+ - [0-9A-F]{8,8}-[0-9A-F]{4,4}-[0-9A-F]{4,4}-[0-9A-F]{4,4}-[0-9A-F]{12,12}$/iu', $ua, $match)) {
$this->data->browser->name = $match[1];
$this->data->browser->version = null;
$this->data->browser->type = ConstantsBrowserType::APP;
$this->data->os->reset([
'name' => 'Android'
]);
$this->data->device->model = $match[2];
$this->data->device->identified |= ConstantsId::PATTERN;
$this->data->device->type = ConstantsDeviceType::MOBILE;
$device = DataDeviceModels::identify('android', $match[2]);
if ($device->identified) {
$device->identified |= $this->data->device->identified;
$this->data->device = $device;
}
}
if (preg_match('/^(.+) Android Application - (.*) Build/(.+) - [0-9A-F]{8,8}-[0-9A-F]{4,4}-[0-9A-F]{4,4}-[0-9A-F]{4,4}-[0-9A-F]{12,12}$/iu', $ua, $match)) {
$this->data->browser->name = $match[1];
$this->data->browser->version = null;
$this->data->browser->type = ConstantsBrowserType::APP;
$this->data->os->reset([
'name' => 'Android'
]);
$version = DataBuildIds::identify($match[3]);
if ($version) {
$this->data->os->version = $version;
}
$this->data->device->model = $match[2];
$this->data->device->identified |= ConstantsId::PATTERN;
$this->data->device->type = ConstantsDeviceType::MOBILE;
$device = DataDeviceModels::identify('android', $match[2]);
if ($device->identified) {
$device->identified |= $this->data->device->identified;
$this->data->device = $device;
}
}
if (preg_match('/^(.+) Android Application - [a-z-]+ (.*) [a-z_-]+$/iu', $ua, $match)) {
$this->data->browser->name = $match[1];
$this->data->browser->version = null;
$this->data->browser->type = ConstantsBrowserType::APP;
$this->data->os->reset([
'name' => 'Android'
]);
$this->data->device->model = $match[2];
$this->data->device->identified |= ConstantsId::PATTERN;
$this->data->device->type = ConstantsDeviceType::MOBILE;
$device = DataDeviceModels::identify('android', $match[2]);
if ($device->identified) {
$device->identified |= $this->data->device->identified;
$this->data->device = $device;
}
}
}
/* AiMeiTuan */
if (preg_match('/^AiMeiTuan /[^-]+-([0-9.]+)-(.*)-[0-9]+x[0-9]+-/iu', $ua, $match)) {
$this->data->browser->name = 'AiMeiTuan';
$this->data->browser->version = null;
$this->data->browser->type = ConstantsBrowserType::APP;
$this->data->os->reset([
'name' => 'Android',
'version' => new Version([ 'value' => $match[1] ])
]);
$this->data->device->model = $match[2];
$this->data->device->identified |= ConstantsId::PATTERN;
$this->data->device->type = ConstantsDeviceType::MOBILE;
$device = DataDeviceModels::identify('android', $match[2]);
if ($device->identified) {
$device->identified |= $this->data->device->identified;
$this->data->device = $device;
}
}
/* Instagram */
if (preg_match('/^Instagram ([0-9.]+) Android (?:IC )?([0-9]+/([0-9.]+); [0-9]+dpi; [0-9]+x[0-9]+; [^;]+; ([^;]*);/iu', $ua, $match)) {
$this->data->browser->name = 'Instagram';
$this->data->browser->version = new Version([ 'value' => $match[1] ]);
$this->data->browser->type = ConstantsBrowserType::APP_SOCIAL;
$this->data->os->reset([
'name' => 'Android',
'version' => new Version([ 'value' => $match[2] ])
]);
$this->data->device->model = $match[3];
$this->data->device->identified |= ConstantsId::PATTERN;
$this->data->device->type = ConstantsDeviceType::MOBILE;
$device = DataDeviceModels::identify('android', $match[3]);
if ($device->identified) {
$device->identified |= $this->data->device->identified;
$this->data->device = $device;
}
}
/* Pinterest */
if (preg_match('/^Pinterest for Android( Tablet)?/([0-9.]+) (([^;]+); ([0-9.]+))/iu', $ua, $match)) {
$this->data->browser->name = 'Pinterest';
$this->data->browser->version = new Version([ 'value' => $match[2] ]);
$this->data->browser->type = ConstantsBrowserType::APP_SOCIAL;
$this->data->os->reset([
'name' => 'Android',
'version' => new Version([ 'value' => $match[4] ])
]);
$this->data->device->model = $match[3];
$this->data->device->identified |= ConstantsId::PATTERN;
$this->data->device->type = $match[1] == ' Tablet' ? ConstantsDeviceType::TABLET : ConstantsDeviceType::MOBILE;
$device = DataDeviceModels::identify('android', $match[3]);
if ($device->identified) {
$device->identified |= $this->data->device->identified;
$this->data->device = $device;
}
}
/* Dr. Web Anti-Virus */
if (preg_match('/Dr.Web anti-virus Light Version: ([0-9.]+) Device model: (.*) Firmware version: ([0-9.]+)/u', $ua, $match)) {
$this->data->browser->name = 'Dr. Web Light';
$this->data->browser->version = new Version([ 'value' => $match[1], 'details' => 2 ]);
$this->data->browser->type = ConstantsBrowserType::APP_ANTIVIRUS;
$this->data->os->reset([
'name' => 'Android',
'version' => new Version([ 'value' => $match[3] ])
]);
$this->data->device->type = ConstantsDeviceType::MOBILE;
$device = DataDeviceModels::identify('android', $match[2]);
if ($device->identified) {
$device->identified |= $this->data->device->identified;
$this->data->device = $device;
}
}
/* Google Earth */
if (preg_match('/GoogleEarth/([0-9.]+)(Android;Android ((.+)-[^-]+-user-([0-9.]+));/u', $ua, $match)) {
$this->data->browser->name = 'Google Earth';
$this->data->browser->version = new Version([ 'value' => $match[1], 'details' => 2 ]);
$this->data->browser->type = ConstantsBrowserType::APP;
$this->data->os->reset([
'name' => 'Android',
'version' => new Version([ 'value' => $match[3] ])
]);
$this->data->device->type = ConstantsDeviceType::MOBILE;
$device = DataDeviceModels::identify('android', $match[2]);
if ($device->identified) {
$device->identified |= $this->data->device->identified;
$this->data->device = $device;
}
}
/* Groupon */
if (preg_match('/Groupon/([0-9.]+) (Android ([0-9.]+); [^/]+ / [A-Z][a-z]+ ([^;]*);/u', $ua, $match)) {
$this->data->browser->name = 'Groupon';
$this->data->browser->version = new Version([ 'value' => $match[1], 'details' => 2 ]);
$this->data->browser->type = ConstantsBrowserType::APP_SHOPPING;
$this->data->os->reset([
'name' => 'Android',
'version' => new Version([ 'value' => $match[2] ])
]);
$this->data->device->type = ConstantsDeviceType::MOBILE;
$this->data->device->model = $match[3];
$device = DataDeviceModels::identify('android', $match[3]);
if ($device->identified) {
$device->identified |= $this->data->device->identified;
$this->data->device = $device;
}
}
/* Whatsapp */
if (preg_match('/WhatsApp+?/([0-9.]+) (Android|S60Version|WP7)/([0-9._]+) Device/([^-]+)-(.*)(?:-([0-9]+.[0-9]+))?(?:-H[0-9]+.[0-9]+.[0-9]+.[0-9]+)?$/uU', $ua, $match)) {
$this->data->browser->name = 'WhatsApp';
$this->data->browser->version = new Version([ 'value' => $match[1], 'details' => 2 ]);
$this->data->browser->type = ConstantsBrowserType::APP_CHAT;
$this->data->device->type = ConstantsDeviceType::MOBILE;
$this->data->device->manufacturer = $match[4];
$this->data->device->model = $match[5];
$this->data->device->identified |= ConstantsId::PATTERN;
if ($match[2] == 'Android') {
$this->data->os->reset([
'name' => 'Android',
'version' => new Version([ 'value' => str_replace('_', '.', $match[3]) ])
]);
$device = DataDeviceModels::identify('android', $match[5]);
if ($device->identified) {
$device->identified |= $this->data->device->identified;
$this->data->device = $device;
}
}
if ($match[2] == 'WP7') {
$this->data->os->reset([
'name' => 'Windows Phone',
'version' => new Version([ 'value' => $match[3], 'details' => 2 ])
]);
$device = DataDeviceModels::identify('wp', $match[5]);
if ($device->identified) {
$device->identified |= $this->data->device->identified;
$this->data->device = $device;
}
}
if ($match[2] == 'S60Version') {
$this->data->os->reset([
'name' => 'Series60',
'version' => new Version([ 'value' => $match[3] ]),
'family' => new Family([ 'name' => 'Symbian' ])
]);
$device = DataDeviceModels::identify('symbian', $match[5]);
if ($device->identified) {
$device->identified |= $this->data->device->identified;
$this->data->device = $device;
}
}
if ($match[2] == 'WP7') {
$this->data->os->reset([
'name' => 'Windows Phone',
'version' => new Version([ 'value' => $match[3], 'details' => 2 ])
]);
$device = DataDeviceModels::identify('wp', $match[5]);
if ($device->identified) {
$device->identified |= $this->data->device->identified;
$this->data->device = $device;
}
}
}
/* Yahoo */
if (preg_match('/YahooMobile(?:Messenger|Mail|Weather)/1.0 (Android (Messenger|Mail|Weather); ([0-9.]+)) ([^;]+; ?[^;]+; ?([^;]+); ?([0-9.]+)/[^;)/]+)/u', $ua, $match)) {
$this->data->browser->name = 'Yahoo ' . $match[1];
$this->data->browser->version = new Version([ 'value' => $match[2], 'details' => 3 ]);
switch ($match[1]) {
case 'Messenger':
$this->data->browser->type = ConstantsBrowserType::APP_CHAT;
break;
case 'Mail':
$this->data->browser->type = ConstantsBrowserType::APP_EMAIL;
break;
case 'Weather':
$this->data->browser->type = ConstantsBrowserType::APP_NEWS;
break;
}
$this->data->os->reset([
'name' => 'Android',
'version' => new Version([ 'value' => $match[4] ])
]);
$this->data->device->type = ConstantsDeviceType::MOBILE;
$device = DataDeviceModels::identify('android', $match[3]);
if ($device->identified) {
$device->identified |= $this->data->device->identified;
$this->data->device = $device;
}
}
/* Yahoo Mobile App */
if (preg_match('/YahooJMobileApp/[0-9.]+ (Android [a-z]+; ([0-9.]+)) ([^;]+; ?[^;]+; ?[^;]+; ?([^;]+); ?([0-9.]+)/[^;)/]+)/u', $ua, $match)) {
$this->data->browser->name = 'Yahoo Mobile';
$this->data->browser->version = new Version([ 'value' => $match[1], 'details' => 3 ]);
$this->data->browser->type = ConstantsBrowserType::APP_SEARCH;
$this->data->os->reset([
'name' => 'Android',
'version' => new Version([ 'value' => $match[3] ])
]);
$this->data->device->type = ConstantsDeviceType::MOBILE;
$device = DataDeviceModels::identify('android', $match[2]);
if ($device->identified) {
$device->identified |= $this->data->device->identified;
$this->data->device = $device;
}
}
/* ICQ */
if (preg_match('/ICQ_Android/([0-9.]+) (Android; [0-9]+; ([0-9.]+); [^;]+; ([^;]+);/u', $ua, $match)) {
$this->data->browser->name = 'ICQ';
$this->data->browser->version = new Version([ 'value' => $match[1], 'details' => 3 ]);
$this->data->browser->type = ConstantsBrowserType::APP_CHAT;
$this->data->os->reset([
'name' => 'Android',
'version' => new Version([ 'value' => $match[2] ])
]);
$this->data->device->type = ConstantsDeviceType::MOBILE;
$device = DataDeviceModels::identify('android', $match[3]);
if ($device->identified) {
$device->identified |= $this->data->device->identified;
$this->data->device = $device;
}
}
/* Facebook for Android */
if (preg_match('/^[FBAN/(FB4A|PAAA);.*FBDV/([^;]+);.*FBSV/([0-9.]+);/u', $ua, $match)) {
if ($match[1] == 'FB4A') {
$this->data->browser->name = 'Facebook';
$this->data->browser->version = null;
$this->data->browser->type = ConstantsBrowserType::APP_SOCIAL;
}
if ($match[1] == 'PAAA') {
$this->data->browser->name = 'Facebook Pages';
$this->data->browser->version = null;
$this->data->browser->type = ConstantsBrowserType::APP_SOCIAL;
}
$this->data->os->reset([
'name' => 'Android',
'version' => new Version([ 'value' => $match[3] ])
]);
$this->data->device->type = ConstantsDeviceType::MOBILE;
$device = DataDeviceModels::identify('android', $match[2]);
if ($device->identified) {
$device->identified |= $this->data->device->identified;
$this->data->device = $device;
}
}
/* VK */
if (preg_match('/^VKAndroidApp/([0-9.]+)-[0-9]+ (Android ([^;]+); SDK [^;]+; [^;]+; [a-z]+ ([^;]+);/iu', $ua, $match)) {
$this->data->browser->name = 'VK';
$this->data->browser->version = new Version([ 'value' => $match[1], 'details' => 2 ]);
$this->data->browser->type = ConstantsBrowserType::APP_SOCIAL;
$this->data->os->reset([
'name' => 'Android',
'version' => new Version([ 'value' => $match[2] ])
]);
$this->data->device->model = $match[3];
$this->data->device->identified |= ConstantsId::PATTERN;
$this->data->device->type = ConstantsDeviceType::MOBILE;
$device = DataDeviceModels::identify('android', $match[3]);
if ($device->identified) {
$device->identified |= $this->data->device->identified;
$this->data->device = $device;
}
}
}
private function detectRemainingApplications($ua)
{
if ($data = DataApplications::identifyOther($ua)) {
$this->data->browser->set($data['browser']);
if (!empty($data['device'])) {
$this->data->device->set($data['device']);
}
}
}
}