1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218
|
# frozen_string_literal: true
require_relative "device/base"
require_relative "device/android"
require_relative "device/unknown"
require_relative "device/ipad"
require_relative "device/ipod_touch"
require_relative "device/iphone"
require_relative "device/playstation3"
require_relative "device/playstation4"
require_relative "device/psp"
require_relative "device/psvita"
require_relative "device/kindle"
require_relative "device/kindle_fire"
require_relative "device/wii"
require_relative "device/wiiu"
require_relative "device/blackberry_playbook"
require_relative "device/surface"
require_relative "device/switch"
require_relative "device/tv"
require_relative "device/xbox_one"
require_relative "device/xbox_360"
require_relative "device/samsung"
module Browser
class Device
attr_reader :ua
# Hold the list of device matchers.
# Order is important.
def self.matchers
@matchers ||= [
Samsung,
XboxOne,
Xbox360,
Surface,
TV,
BlackBerryPlaybook,
WiiU,
Wii,
Switch,
KindleFire,
Kindle,
PlayStation4,
PlayStation3,
PSVita,
PSP,
Ipad,
Iphone,
IpodTouch,
Android,
Unknown
]
end
def initialize(ua)
@ua = ua
end
def subject
@subject ||= self.class.matchers
.map {|matcher| matcher.new(ua) }
.find(&:match?)
end
def id
subject.id
end
def name
subject.name
end
# Detect if browser is tablet (currently iPad, Android, Surface or
# Playbook).
def tablet?
ipad? ||
(platform.android? && !detect_mobile?) ||
surface? ||
playbook?
end
# Detect if browser is mobile.
def mobile?
detect_mobile? && !tablet?
end
def ipad?
id == :ipad
end
def unknown?
id == :unknown_device
end
def ipod_touch?
id == :ipod_touch
end
alias_method :ipod?, :ipod_touch?
def iphone?
id == :iphone
end
def ps3?
id == :ps3
end
alias_method :playstation3?, :ps3?
def ps4?
id == :ps4
end
alias_method :playstation4?, :ps4?
def psp?
id == :psp
end
def playstation_vita?
id == :psvita
end
alias_method :vita?, :playstation_vita?
alias_method :psp_vita?, :playstation_vita?
def kindle?
id == :kindle || kindle_fire?
end
def kindle_fire?
id == :kindle_fire
end
def nintendo_wii?
id == :wii
end
alias_method :wii?, :nintendo_wii?
def nintendo_wiiu?
id == :wiiu
end
alias_method :wiiu?, :nintendo_wiiu?
def nintendo_switch?
id == :switch
end
alias_method :switch?, :nintendo_switch?
def blackberry_playbook?
id == :playbook
end
alias_method :playbook?, :blackberry_playbook?
def surface?
id == :surface
end
def tv?
id == :tv
end
# Detect if browser is Silk.
def silk?
ua.include?("Silk")
end
# Detect if browser is running under Xbox.
def xbox?
ua.include?("Xbox")
end
# Detect if browser is running under Xbox 360.
def xbox_360?
id == :xbox_360
end
# Detect if browser is running under Xbox One.
def xbox_one?
id == :xbox_one
end
# Detect if browser is running under PlayStation.
def playstation?
ps3? || ps4?
end
# Detect if browser is Nintendo.
def nintendo?
wii? || wiiu? || switch?
end
# Detect if browser is console (currently Xbox, PlayStation, or Nintendo).
def console?
xbox? || playstation? || nintendo?
end
# Detect if device is a Samsung.
def samsung?
id == :samsung
end
# Regex taken from http://detectmobilebrowsers.com
# rubocop:disable Layout/LineLength
private def detect_mobile?
psp? ||
/zunewp7/i.match?(ua) ||
%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) ||
%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])
end
# rubocop:enable Layout/LineLength
private def platform
@platform ||= Platform.new(ua)
end
private :subject
private :ua
end
end
|