browser 4.2.0 → 5.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +32 -1
- data/FUNDING.yml +3 -0
- data/README.md +97 -47
- data/bots.yml +1 -1
- data/lib/browser/base.rb +61 -6
- data/lib/browser/browser.rb +22 -2
- data/lib/browser/chrome.rb +7 -1
- data/lib/browser/device.rb +9 -2
- data/lib/browser/device/samsung.rb +33 -0
- data/lib/browser/device/unknown.rb +1 -1
- data/lib/browser/google_search_app.rb +21 -0
- data/lib/browser/huawei_browser.rb +21 -0
- data/lib/browser/maxthon.rb +21 -0
- data/lib/browser/miui_browser.rb +21 -0
- data/lib/browser/platform.rb +4 -4
- data/lib/browser/platform/ios.rb +1 -1
- data/lib/browser/platform/mac.rb +1 -1
- data/lib/browser/platform/{other.rb → unknown.rb} +3 -3
- data/lib/browser/platform/windows.rb +1 -1
- data/lib/browser/safari.rb +9 -1
- data/lib/browser/sougou_browser.rb +24 -0
- data/lib/browser/{generic.rb → unknown.rb} +3 -3
- data/lib/browser/version.rb +1 -1
- data/samsung.yml +138 -0
- data/test/browser_test.rb +37 -6
- data/test/ua.yml +16 -4
- data/test/unit/adobe_air_test.rb +1 -1
- data/test/unit/alipay_test.rb +6 -0
- data/test/unit/console_test.rb +2 -2
- data/test/unit/device_test.rb +29 -2
- data/test/unit/duck_duck_go_test.rb +2 -0
- data/test/unit/google_search_app_test.rb +54 -0
- data/test/unit/huawei_browser_test.rb +25 -0
- data/test/unit/maxthon_test.rb +25 -0
- data/test/unit/meta_test.rb +9 -0
- data/test/unit/miui_browser_test.rb +25 -0
- data/test/unit/opera_test.rb +1 -0
- data/test/unit/platform_test.rb +6 -6
- data/test/unit/qq_test.rb +12 -0
- data/test/unit/safari_test.rb +12 -7
- data/test/unit/sougou_browser_test.rb +41 -0
- metadata +26 -8
data/lib/browser/browser.rb
CHANGED
@@ -15,7 +15,7 @@ require_relative "firefox"
|
|
15
15
|
require_relative "edge"
|
16
16
|
require_relative "opera"
|
17
17
|
require_relative "blackberry"
|
18
|
-
require_relative "
|
18
|
+
require_relative "unknown"
|
19
19
|
require_relative "phantom_js"
|
20
20
|
require_relative "uc_browser"
|
21
21
|
require_relative "nokia"
|
@@ -32,6 +32,11 @@ require_relative "sputnik"
|
|
32
32
|
require_relative "snapchat"
|
33
33
|
require_relative "duck_duck_go"
|
34
34
|
require_relative "samsung_browser"
|
35
|
+
require_relative "huawei_browser"
|
36
|
+
require_relative "miui_browser"
|
37
|
+
require_relative "maxthon"
|
38
|
+
require_relative "sougou_browser"
|
39
|
+
require_relative "google_search_app"
|
35
40
|
|
36
41
|
require_relative "bot"
|
37
42
|
require_relative "bot/empty_user_agent_matcher"
|
@@ -46,10 +51,20 @@ require_relative "meta"
|
|
46
51
|
module Browser
|
47
52
|
EMPTY_STRING = ""
|
48
53
|
|
54
|
+
Error = Class.new(StandardError)
|
55
|
+
|
49
56
|
def self.root
|
50
57
|
@root ||= Pathname.new(File.expand_path("../..", __dir__))
|
51
58
|
end
|
52
59
|
|
60
|
+
class << self
|
61
|
+
attr_accessor :user_agent_size_limit
|
62
|
+
attr_accessor :accept_language_size_limit
|
63
|
+
end
|
64
|
+
|
65
|
+
self.user_agent_size_limit = 2048
|
66
|
+
self.accept_language_size_limit = 2048
|
67
|
+
|
53
68
|
# Hold the list of browser matchers.
|
54
69
|
# Order is important.
|
55
70
|
def self.matchers
|
@@ -75,9 +90,14 @@ module Browser
|
|
75
90
|
Sputnik, # must be placed before Chrome and Safari
|
76
91
|
DuckDuckGo, # must be placed before Chrome and Safari
|
77
92
|
SamsungBrowser, # must be placed before Chrome and Safari
|
93
|
+
HuaweiBrowser, # must be placed before Chrome and Safari
|
94
|
+
MiuiBrowser, # must be placed before Chrome and Safari
|
95
|
+
Maxthon, # must be placed before Chrome and Safari
|
96
|
+
SougouBrowser, # must be placed before Chrome and Safari
|
97
|
+
GoogleSearchApp, # must be placed before Chrome and Safari
|
78
98
|
Chrome,
|
79
99
|
Safari,
|
80
|
-
|
100
|
+
Unknown
|
81
101
|
]
|
82
102
|
end
|
83
103
|
|
data/lib/browser/chrome.rb
CHANGED
@@ -27,7 +27,13 @@ module Browser
|
|
27
27
|
!duck_duck_go? &&
|
28
28
|
!yandex? &&
|
29
29
|
!sputnik? &&
|
30
|
-
!samsung_browser?
|
30
|
+
!samsung_browser? &&
|
31
|
+
!huawei_browser? &&
|
32
|
+
!miui_browser? &&
|
33
|
+
!maxthon? &&
|
34
|
+
!qq? &&
|
35
|
+
!sougou_browser? &&
|
36
|
+
!google_search_app?
|
31
37
|
end
|
32
38
|
end
|
33
39
|
end
|
data/lib/browser/device.rb
CHANGED
@@ -20,6 +20,7 @@ require_relative "device/switch"
|
|
20
20
|
require_relative "device/tv"
|
21
21
|
require_relative "device/xbox_one"
|
22
22
|
require_relative "device/xbox_360"
|
23
|
+
require_relative "device/samsung"
|
23
24
|
|
24
25
|
module Browser
|
25
26
|
class Device
|
@@ -29,6 +30,7 @@ module Browser
|
|
29
30
|
# Order is important.
|
30
31
|
def self.matchers
|
31
32
|
@matchers ||= [
|
33
|
+
Samsung,
|
32
34
|
XboxOne,
|
33
35
|
Xbox360,
|
34
36
|
Surface,
|
@@ -88,7 +90,7 @@ module Browser
|
|
88
90
|
end
|
89
91
|
|
90
92
|
def unknown?
|
91
|
-
id == :
|
93
|
+
id == :unknown_device
|
92
94
|
end
|
93
95
|
|
94
96
|
def ipod_touch?
|
@@ -191,13 +193,18 @@ module Browser
|
|
191
193
|
xbox? || playstation? || nintendo?
|
192
194
|
end
|
193
195
|
|
196
|
+
# Detect if device is a Samsung.
|
197
|
+
def samsung?
|
198
|
+
id == :samsung
|
199
|
+
end
|
200
|
+
|
194
201
|
# Regex taken from http://detectmobilebrowsers.com
|
195
202
|
# rubocop:disable Layout/LineLength
|
196
203
|
private def detect_mobile?
|
197
204
|
psp? ||
|
198
205
|
/zunewp7/i.match(ua) ||
|
199
206
|
%r{(android|bb\d+|meego).+mobile|avantgo|bada/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino}i.match(ua) ||
|
200
|
-
%r{1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s
|
207
|
+
%r{1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw-(n|u)|c55/|capi|ccwa|cdm-|cell|chtm|cldc|cmd-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc-s|devi|dica|dmob|do(c|p)o|ds(12|-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(-|_)|g1 u|g560|gene|gf-5|g-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd-(m|p|t)|hei-|hi(pt|ta)|hp( i|ip)|hs-c|ht(c(-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i-(20|go|ma)|i230|iac( |-|/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |/)|klon|kpt |kwc-|kyo(c|k)|le(no|xi)|lg( g|/(k|l|u)|50|54|-[a-w])|libw|lynx|m1-w|m3ga|m50/|ma(te|ui|xo)|mc(01|21|ca)|m-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|-([1-8]|c))|phil|pire|pl(ay|uc)|pn-2|po(ck|rt|se)|prox|psio|pt-g|qa-a|qc(07|12|21|32|60|-[2-7]|i-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55/|sa(ge|ma|mm|ms|ny|va)|sc(01|h-|oo|p-)|sdk/|se(c(-|0|1)|47|mc|nd|ri)|sgh-|shar|sie(-|m)|sk-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h-|v-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl-|tdg-|tel(i|m)|tim-|t-mo|to(pl|sh)|ts(70|m-|m3|m5)|tx-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas-|your|zeto|zte-}i.match(ua[0..3])
|
201
208
|
end
|
202
209
|
# rubocop:enable Layout/LineLength
|
203
210
|
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Browser
|
4
|
+
class Device
|
5
|
+
class Samsung < Base
|
6
|
+
REGEX = /\(Linux.*?; Android.*?; (SAMSUNG )?(SM-[A-Z0-9]+).*?\)/i.freeze
|
7
|
+
|
8
|
+
def self.names
|
9
|
+
@names ||= YAML.load_file(Browser.root.join("samsung.yml").to_s)
|
10
|
+
end
|
11
|
+
|
12
|
+
def id
|
13
|
+
:samsung
|
14
|
+
end
|
15
|
+
|
16
|
+
def name
|
17
|
+
"Samsung #{self.class.names[code] || code}"
|
18
|
+
end
|
19
|
+
|
20
|
+
def code
|
21
|
+
matches && matches[2]
|
22
|
+
end
|
23
|
+
|
24
|
+
def matches
|
25
|
+
@matches ||= ua.match(REGEX)
|
26
|
+
end
|
27
|
+
|
28
|
+
def match?
|
29
|
+
!!matches
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Browser
|
4
|
+
class GoogleSearchApp < Chrome
|
5
|
+
def id
|
6
|
+
:google_search_app
|
7
|
+
end
|
8
|
+
|
9
|
+
def name
|
10
|
+
"Google Search App"
|
11
|
+
end
|
12
|
+
|
13
|
+
def full_version
|
14
|
+
ua[%r{GSA/([\d.]+\d)}, 1] || super
|
15
|
+
end
|
16
|
+
|
17
|
+
def match?
|
18
|
+
ua =~ /GSA/
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Browser
|
4
|
+
class HuaweiBrowser < Base
|
5
|
+
def id
|
6
|
+
:huawei_browser
|
7
|
+
end
|
8
|
+
|
9
|
+
def name
|
10
|
+
"Huawei Browser"
|
11
|
+
end
|
12
|
+
|
13
|
+
def full_version
|
14
|
+
ua[%r{(?:HuaweiBrowser)/([\d.]+)}i, 1] || "0.0"
|
15
|
+
end
|
16
|
+
|
17
|
+
def match?
|
18
|
+
ua =~ /HuaweiBrowser/i
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Browser
|
4
|
+
class Maxthon < Base
|
5
|
+
def id
|
6
|
+
:maxthon
|
7
|
+
end
|
8
|
+
|
9
|
+
def name
|
10
|
+
"Maxthon"
|
11
|
+
end
|
12
|
+
|
13
|
+
def full_version
|
14
|
+
ua[%r{(?:Maxthon)/([\d.]+)}i, 1] || "0.0"
|
15
|
+
end
|
16
|
+
|
17
|
+
def match?
|
18
|
+
ua =~ /Maxthon/i
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Browser
|
4
|
+
class MiuiBrowser < Base
|
5
|
+
def id
|
6
|
+
:miui_browser
|
7
|
+
end
|
8
|
+
|
9
|
+
def name
|
10
|
+
"Miui Browser"
|
11
|
+
end
|
12
|
+
|
13
|
+
def full_version
|
14
|
+
ua[%r{MiuiBrowser/([\d.]+)}, 1] || "0.0"
|
15
|
+
end
|
16
|
+
|
17
|
+
def match?
|
18
|
+
ua =~ /MiuiBrowser/
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
data/lib/browser/platform.rb
CHANGED
@@ -10,7 +10,7 @@ require_relative "platform/windows_mobile"
|
|
10
10
|
require_relative "platform/firefox_os"
|
11
11
|
require_relative "platform/blackberry"
|
12
12
|
require_relative "platform/android"
|
13
|
-
require_relative "platform/
|
13
|
+
require_relative "platform/unknown"
|
14
14
|
require_relative "platform/chrome_os"
|
15
15
|
require_relative "platform/adobe_air"
|
16
16
|
|
@@ -35,7 +35,7 @@ module Browser
|
|
35
35
|
FirefoxOS,
|
36
36
|
Windows,
|
37
37
|
Linux,
|
38
|
-
|
38
|
+
Unknown
|
39
39
|
]
|
40
40
|
end
|
41
41
|
|
@@ -61,8 +61,8 @@ module Browser
|
|
61
61
|
id == :android && detect_version?(version, expected_version)
|
62
62
|
end
|
63
63
|
|
64
|
-
def
|
65
|
-
id == :
|
64
|
+
def unknown?
|
65
|
+
id == :unknown_platform
|
66
66
|
end
|
67
67
|
|
68
68
|
def linux?
|
data/lib/browser/platform/ios.rb
CHANGED
@@ -5,7 +5,7 @@ module Browser
|
|
5
5
|
class IOS < Base
|
6
6
|
MATCHER = /(iPhone|iPad|iPod)/.freeze
|
7
7
|
VERSION_MATCHER =
|
8
|
-
/OS (
|
8
|
+
/OS (?<major>\d+)_(?<minor>\d+)_?(?<patch>\d+)?/.freeze
|
9
9
|
|
10
10
|
def version
|
11
11
|
matches = VERSION_MATCHER.match(ua)
|
data/lib/browser/platform/mac.rb
CHANGED
data/lib/browser/safari.rb
CHANGED
@@ -22,10 +22,18 @@ module Browser
|
|
22
22
|
ua !~ /PhantomJS|FxiOS/ &&
|
23
23
|
!edge? &&
|
24
24
|
!chrome? &&
|
25
|
+
!opera? &&
|
25
26
|
!samsung_browser? &&
|
27
|
+
!huawei_browser? &&
|
28
|
+
!miui_browser? &&
|
26
29
|
!duck_duck_go? &&
|
27
30
|
!yandex? &&
|
28
|
-
!sputnik?
|
31
|
+
!sputnik? &&
|
32
|
+
!maxthon? &&
|
33
|
+
!qq? &&
|
34
|
+
!alipay? &&
|
35
|
+
!sougou_browser? &&
|
36
|
+
!google_search_app?
|
29
37
|
end
|
30
38
|
end
|
31
39
|
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Browser
|
4
|
+
class SougouBrowser < Base
|
5
|
+
def id
|
6
|
+
:sougou_browser
|
7
|
+
end
|
8
|
+
|
9
|
+
def name
|
10
|
+
"Sougou Browser"
|
11
|
+
end
|
12
|
+
|
13
|
+
# We can't get the real version on desktop device from the ua string
|
14
|
+
def full_version
|
15
|
+
ua[%r{(?:SogouMobileBrowser)/([\d.]+)}, 1] || "0.0"
|
16
|
+
end
|
17
|
+
|
18
|
+
# SogouMobileBrowser for mobile device
|
19
|
+
# SE for desktop device
|
20
|
+
def match?
|
21
|
+
ua =~ /SogouMobileBrowser/i || ua =~ / SE /
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -1,18 +1,18 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module Browser
|
4
|
-
class
|
4
|
+
class Unknown < Base
|
5
5
|
NAMES = {
|
6
6
|
"QuickTime" => "QuickTime",
|
7
7
|
"CoreMedia" => "Apple CoreMedia"
|
8
8
|
}.freeze
|
9
9
|
|
10
10
|
def id
|
11
|
-
:
|
11
|
+
:unknown_browser
|
12
12
|
end
|
13
13
|
|
14
14
|
def name
|
15
|
-
infer_name || "
|
15
|
+
infer_name || "Unknown Browser"
|
16
16
|
end
|
17
17
|
|
18
18
|
def full_version
|
data/lib/browser/version.rb
CHANGED
data/samsung.yml
ADDED
@@ -0,0 +1,138 @@
|
|
1
|
+
# Source: https://en.wikipedia.org/wiki/Samsung_Galaxy
|
2
|
+
SM-G900H: Galaxy S5 Exynos
|
3
|
+
SM-A320FL: Galaxy A3
|
4
|
+
SM-G780F: Galaxy S20 Fan Edition
|
5
|
+
SM-G781B: Galaxy S20 Fan Edition
|
6
|
+
SM-F196B: Galaxy Z Fold2 5G
|
7
|
+
SM-G928A: Galaxy S6 Edge+
|
8
|
+
SM-G928AZ: Galaxy S6 Edge+
|
9
|
+
SM-G928D: Galaxy S6 Edge+
|
10
|
+
SM-G928F: Galaxy S6 Edge+
|
11
|
+
SM-G928FD: Galaxy S6 Edge+
|
12
|
+
SM-G928I: Galaxy S6 Edge+
|
13
|
+
SM-G928K: Galaxy S6 Edge+
|
14
|
+
SM-G928L: Galaxy S6 Edge+
|
15
|
+
SM-G928P: Galaxy S6 Edge+
|
16
|
+
SM-G928PZ: Galaxy S6 Edge+
|
17
|
+
SM-G928R4: Galaxy S6 Edge+
|
18
|
+
SM-G928R7: Galaxy S6 Edge+
|
19
|
+
SM-G928S: Galaxy S6 Edge+
|
20
|
+
SM-G928T: Galaxy S6 Edge+
|
21
|
+
SM-G928T1: Galaxy S6 Edge+
|
22
|
+
SM-G928TR: Galaxy S6 Edge+
|
23
|
+
SM-G928V: Galaxy S6 Edge+
|
24
|
+
SM-G9280: Galaxy S6 Edge+
|
25
|
+
SM-G9288: Galaxy S6 Edge+
|
26
|
+
SM-G9289: Galaxy S6 Edge+
|
27
|
+
SM-A8000: Galaxy A8
|
28
|
+
SM-A800F: Galaxy A8
|
29
|
+
SM-A800I: Galaxy A8
|
30
|
+
SM-A800S: Galaxy A8
|
31
|
+
SM-A800Y: Galaxy A8
|
32
|
+
SM-N9200: Galaxy Note 5
|
33
|
+
SM-N920C: Galaxy Note 5
|
34
|
+
SM-N920T: Galaxy Note 5
|
35
|
+
SM-N920A: Galaxy Note 5
|
36
|
+
SM-N920I: Galaxy Note 5
|
37
|
+
SM-N9208: Galaxy Note 5
|
38
|
+
SM-G903FP: Galaxy S5 Neo
|
39
|
+
SM-G903WP: Galaxy S5 Neo
|
40
|
+
SM-G925A: Galaxy S6 Edge
|
41
|
+
SM-G925AZ: Galaxy S6 Edge
|
42
|
+
SM-G925F: Galaxy S6 Edge
|
43
|
+
SM-G925I: Galaxy S6 Edge
|
44
|
+
SM-G925K: Galaxy S6 Edge
|
45
|
+
SM-G925L: Galaxy S6 Edge
|
46
|
+
SM-G925P: Galaxy S6 Edge
|
47
|
+
SM-G925PZ: Galaxy S6 Edge
|
48
|
+
SM-G925R4: Galaxy S6 Edge
|
49
|
+
SM-G925R7: Galaxy S6 Edge
|
50
|
+
SM-G925S: Galaxy S6 Edge
|
51
|
+
SM-G925T: Galaxy S6 Edge
|
52
|
+
SM-G925T1: Galaxy S6 Edge
|
53
|
+
SM-G925TR: Galaxy S6 Edge
|
54
|
+
SM-G925V: Galaxy S6 Edge
|
55
|
+
SM-G9250: Galaxy S6 Edge
|
56
|
+
SM-G9258: Galaxy S6 Edge
|
57
|
+
SM-G9259: Galaxy S6 Edge
|
58
|
+
SM-G920A: Galaxy S6
|
59
|
+
SM-G920AZ: Galaxy S6
|
60
|
+
SM-G920D: Galaxy S6
|
61
|
+
SM-G920F: Galaxy S6
|
62
|
+
SM-G920FD: Galaxy S6
|
63
|
+
SM-G920I: Galaxy S6
|
64
|
+
SM-G920K: Galaxy S6
|
65
|
+
SM-G920L: Galaxy S6
|
66
|
+
SM-G920P: Galaxy S6
|
67
|
+
SM-G920PZ: Galaxy S6
|
68
|
+
SM-G920R4: Galaxy S6
|
69
|
+
SM-G920R7: Galaxy S6
|
70
|
+
SM-G920S: Galaxy S6
|
71
|
+
SM-G920T: Galaxy S6
|
72
|
+
SM-G920T1: Galaxy S6
|
73
|
+
SM-G920TR: Galaxy S6
|
74
|
+
SM-G920V: Galaxy S6
|
75
|
+
SM-G9200: Galaxy S6
|
76
|
+
SM-G9208: Galaxy S6
|
77
|
+
SM-G9209: Galaxy S6
|
78
|
+
SM-A700F: Galaxy A7
|
79
|
+
SM-A700FD: Galaxy A7
|
80
|
+
SM-A700FQ: Galaxy A7
|
81
|
+
SM-A700H: Galaxy A7
|
82
|
+
SM-A700K: Galaxy A7
|
83
|
+
SM-A700L: Galaxy A7
|
84
|
+
SM-A700M: Galaxy A7
|
85
|
+
SM-A700S: Galaxy A7
|
86
|
+
SM-A700X: Galaxy A7
|
87
|
+
SM-A700YD: Galaxy A7
|
88
|
+
SM-A700YZ: Galaxy A7
|
89
|
+
SM-A7000: Galaxy A7
|
90
|
+
SM-A7009: Galaxy A7
|
91
|
+
SM-A7009W: Galaxy A7
|
92
|
+
SM-G530BT: Galaxy Grand Prime
|
93
|
+
SM-G530F: Galaxy Grand Prime
|
94
|
+
SM-G530FQ: Galaxy Grand Prime
|
95
|
+
SM-G530FZ: Galaxy Grand Prime
|
96
|
+
SM-G530H: Galaxy Grand Prime
|
97
|
+
SM-G530M: Galaxy Grand Prime
|
98
|
+
SM-G530MU: Galaxy Grand Prime
|
99
|
+
SM-G530P: Galaxy Grand Prime
|
100
|
+
SM-G530R4: Galaxy Grand Prime
|
101
|
+
SM-G530R7: Galaxy Grand Prime
|
102
|
+
SM-G530T: Galaxy Grand Prime
|
103
|
+
SM-G530W: Galaxy Grand Prime
|
104
|
+
SM-G530Y: Galaxy Grand Prime
|
105
|
+
SM-G5306W: Galaxy Grand Prime
|
106
|
+
SM-G5308W: Galaxy Grand Prime
|
107
|
+
SM-G5309W: Galaxy Grand Prime
|
108
|
+
SM-J7109: Galaxy J7
|
109
|
+
SM-J710F: Galaxy J7
|
110
|
+
SM-J710FN: Galaxy J7
|
111
|
+
SM-J710H: Galaxy J7
|
112
|
+
SM-J710MN: Galaxy J7
|
113
|
+
SM-J710FQ: Galaxy J7
|
114
|
+
SM-J710K: Galaxy J7
|
115
|
+
SM-J710K: Galaxy J7
|
116
|
+
SM-J710GN: Galaxy J7
|
117
|
+
SM-J5109: Galaxy J5
|
118
|
+
SM-J510F: Galaxy J5
|
119
|
+
SM-J510FN: Galaxy J5
|
120
|
+
SM-J510H: Galaxy J5
|
121
|
+
SM-J510G: Galaxy J5
|
122
|
+
SM-J510MN: Galaxy J5
|
123
|
+
SM-J510Y: Galaxy J5
|
124
|
+
SM-J5108: Galaxy J5
|
125
|
+
SM-J510K: Galaxy J5
|
126
|
+
SM-J510L: Galaxy J5
|
127
|
+
SM-J510S: Galaxy J5
|
128
|
+
SM-J510UN: Galaxy J5
|
129
|
+
SM-G570F: Galaxy J2 Prime
|
130
|
+
SM-G570M: Galaxy J2 Prime
|
131
|
+
SM-G532F: Galaxy J2 Prime
|
132
|
+
SM-G532M: Galaxy J2 Prime
|
133
|
+
SM-G532G: Galaxy J2 Prime
|
134
|
+
SM-G610F: Galaxy J7 Prime
|
135
|
+
SM-G610M: Galaxy J7 Prime
|
136
|
+
SM-G975F: Galaxy S10+
|
137
|
+
SM-G960F: Galaxy S9
|
138
|
+
SM-F700F: Galaxy Z Flip
|