@@ -35,7 +35,7 @@ public static class UserAgentHelpers
3535
3636 private static readonly Regex _appleMachineRegex = new Regex ( @"\b(iPhone|iPad)\d{1,2},\d{1,2}\b" , RegexOptions . Compiled | RegexOptions . CultureInvariant ) ;
3737 private static readonly Regex _onePlusRegex = new Regex ( @"\bCPH\d{4}\b" , RegexOptions . Compiled | RegexOptions . CultureInvariant ) ;
38- private static readonly Regex _xiaomiSkuRegex = new Regex ( @"\b\d{5}[A-Z]{2}\d{2}[A- Z0-9]{1,3 }\b" , RegexOptions . Compiled | RegexOptions . CultureInvariant ) ;
38+ private static readonly Regex _xiaomiSkuRegex = new Regex ( @"\b\d{5}[A-Z0-9]{5,8 }\b" , RegexOptions . Compiled | RegexOptions . CultureInvariant ) ;
3939
4040 /// <summary>
4141 /// Determines the type of device based on the provided user agent string.
@@ -150,7 +150,7 @@ private static bool ContainsAny(string haystack, params string[] needles)
150150 var isMobile = ual . Contains ( "mobile" ) ;
151151 var model = TryExtractAndroidModel ( ua ) ;
152152
153- var knownCode = model != null ? TryGetFirstKnownDeviceCode ( model ) : null ;
153+ var knownCode = model != null ? TryGetFirstKnownDeviceCode ( model ) : TryGetFirstKnownDeviceCode ( ua ) ;
154154 if ( knownCode != null )
155155 {
156156 return knownCode ;
@@ -251,6 +251,16 @@ private static UserAgentDeviceType ResolveSamsungType(string samsungModelCode)
251251 if ( ! p . Success ) return null ;
252252
253253 var parts = p . Groups [ 1 ] . Value . Split ( ';' ) ;
254+ var hasTabletToken = false ;
255+ for ( var k = 0 ; k < parts . Length ; k ++ )
256+ {
257+ if ( parts [ k ] . Trim ( ) . Equals ( "tablet" , StringComparison . OrdinalIgnoreCase ) )
258+ {
259+ hasTabletToken = true ;
260+ break ;
261+ }
262+ }
263+
254264 for ( var i = 0 ; i < parts . Length ; i ++ )
255265 {
256266 var token = parts [ i ] . Trim ( ) ;
@@ -263,7 +273,14 @@ private static UserAgentDeviceType ResolveSamsungType(string samsungModelCode)
263273
264274 // ignore common noise tokens
265275 if ( cand . Equals ( "wv" , StringComparison . OrdinalIgnoreCase )
266- || cand . Equals ( "mobile" , StringComparison . OrdinalIgnoreCase ) )
276+ || cand . Equals ( "mobile" , StringComparison . OrdinalIgnoreCase )
277+ || cand . Equals ( "tablet" , StringComparison . OrdinalIgnoreCase ) )
278+ {
279+ continue ;
280+ }
281+
282+ // If this UA explicitly says "Tablet", then tokens like "rv:102.0" are not a device model.
283+ if ( hasTabletToken && cand . StartsWith ( "rv:" , StringComparison . OrdinalIgnoreCase ) )
267284 {
268285 continue ;
269286 }
0 commit comments