diff --git a/composer.json b/composer.json index 68f38f189..fa2872719 100644 --- a/composer.json +++ b/composer.json @@ -23,6 +23,7 @@ "doctrine/dbal": "^4.2", "doctrine/migrations": "^3.8", "doctrine/orm": "^3.3", + "donatj/phpuseragentparser": "^1.10", "endroid/qr-code": "^6.0", "friendsofphp/proxy-manager-lts": "^1.0", "geoip2/geoip2": "^3.0", @@ -39,7 +40,6 @@ "mezzio/mezzio-fastroute": "^3.12", "mezzio/mezzio-problem-details": "^1.15", "mlocati/ip-lib": "^1.18.1", - "mobiledetect/mobiledetectlib": "4.8.x-dev#920c549 as 4.9", "pagerfanta/core": "^3.8", "ramsey/uuid": "^4.7", "shlinkio/doctrine-specification": "^2.1.1", diff --git a/module/Core/src/Model/DeviceType.php b/module/Core/src/Model/DeviceType.php index a4a15cdcd..c63b2dff5 100644 --- a/module/Core/src/Model/DeviceType.php +++ b/module/Core/src/Model/DeviceType.php @@ -2,7 +2,8 @@ namespace Shlinkio\Shlink\Core\Model; -use Detection\MobileDetect; +use donatj\UserAgent\Platforms; +use donatj\UserAgent\UserAgentParser; enum DeviceType: string { @@ -12,17 +13,13 @@ enum DeviceType: string public static function matchFromUserAgent(string $userAgent): self|null { - $detect = new MobileDetect(); - $detect->setUserAgent($userAgent); + static $uaParser = new UserAgentParser(); + $ua = $uaParser->parse($userAgent); - return match (true) { -// $detect->is('iOS') && $detect->isTablet() => self::IOS, // TODO To detect iPad only -// $detect->is('iOS') && ! $detect->isTablet() => self::IOS, // TODO To detect iPhone only -// $detect->is('androidOS') && $detect->isTablet() => self::ANDROID, // TODO To detect Android tablets -// $detect->is('androidOS') && ! $detect->isTablet() => self::ANDROID, // TODO To detect Android phones - $detect->is('iOS') => self::IOS, // Detects both iPhone and iPad - $detect->is('androidOS') => self::ANDROID, // Detects both android phones and android tablets - ! $detect->isMobile() && ! $detect->isTablet() => self::DESKTOP, + return match ($ua->platform()) { + Platforms::IPHONE, Platforms::IPAD => self::IOS, // Detects both iPhone and iPad (except iPadOS 13+) + Platforms::ANDROID => self::ANDROID, // Detects both android phones and android tablets + Platforms::LINUX, Platforms::WINDOWS, Platforms::MACINTOSH, Platforms::CHROME_OS => self::DESKTOP, default => null, }; }