/*
* Copyright 2008-2010 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package es.alvsanand.webpage.common;
public class UAgentInfo {
// User-Agent and Accept HTTP request headers
private String userAgent = "";
private String httpAccept = "";
// Optional: store values for quickly accessing same info multiple times.
// Call InitDeviceScan() to initialize these values.
private boolean iphone = false;
private boolean tierIphone = false;
private boolean tierRichCss = false;
private boolean tierGenericMobile = false;
// Initialize some initial smartphone string variables.
public static final String engineWebKit = "webkit";
public static final String deviceAndroid = "android";
public static final String deviceIphone = "iphone";
public static final String deviceIpod = "ipod";
public static final String deviceIpad = "ipad";
public static final String deviceMacPpc = "macintosh"; //Used for disambiguation
public static final String deviceSymbian = "symbian";
public static final String deviceS60 = "series60";
public static final String deviceS70 = "series70";
public static final String deviceS80 = "series80";
public static final String deviceS90 = "series90";
public static final String deviceWinPhone7 = "windows phone os 7";
public static final String deviceWinMob = "windows ce";
public static final String deviceWindows = "windows";
public static final String deviceIeMob = "iemobile";
public static final String devicePpc = "ppc"; //Stands for PocketPC
public static final String enginePie = "wm5 pie"; //An old Windows Mobile
public static final String deviceBB = "blackberry";
public static final String vndRIM = "vnd.rim"; //Detectable when BB devices emulate IE or Firefox
public static final String deviceBBStorm = "blackberry95"; //Storm 1 and 2
public static final String deviceBBBold = "blackberry97"; //Bold
public static final String deviceBBTour = "blackberry96"; //Tour
public static final String deviceBBCurve = "blackberry89"; //Curve 2
public static final String deviceBBTorch = "blackberry 98"; //Torch
public static final String devicePalm = "palm";
public static final String deviceWebOS = "webos"; //For Palm's new WebOS devices
public static final String engineBlazer = "blazer"; //Old Palm
public static final String engineXiino = "xiino"; //Another old Palm
public static final String deviceKindle = "kindle"; //Amazon Kindle, eInk one.
public static final String deviceNuvifone = "nuvifone"; //Garmin Nuvifone
//Initialize variables for mobile-specific content.
public static final String vndwap = "vnd.wap";
public static final String wml = "wml";
//Initialize variables for other random devices and mobile browsers.
public static final String deviceBrew = "brew";
public static final String deviceDanger = "danger";
public static final String deviceHiptop = "hiptop";
public static final String devicePlaystation = "playstation";
public static final String deviceNintendoDs = "nitro";
public static final String deviceNintendo = "nintendo";
public static final String deviceWii = "wii";
public static final String deviceXbox = "xbox";
public static final String deviceArchos = "archos";
public static final String engineOpera = "opera"; //Popular browser
public static final String engineNetfront = "netfront"; //Common embedded OS browser
public static final String engineUpBrowser = "up.browser"; //common on some phones
public static final String engineOpenWeb = "openweb"; //Transcoding by OpenWave server
public static final String deviceMidp = "midp"; //a mobile Java technology
public static final String uplink = "up.link";
public static final String engineTelecaQ = "teleca q"; //a modern feature phone browser
public static final String devicePda = "pda"; //some devices report themselves as PDAs
public static final String mini = "mini"; //Some mobile browsers put "mini" in their names.
public static final String mobile = "mobile"; //Some mobile browsers put "mobile" in their user agent strings.
public static final String mobi = "mobi"; //Some mobile browsers put "mobi" in their user agent strings.
//Use Maemo, Tablet, and Linux to test for Nokia"s Internet Tablets.
public static final String maemo = "maemo";
public static final String maemoTablet = "tablet";
public static final String linux = "linux";
public static final String qtembedded = "qt embedded"; //for Sony Mylo
public static final String mylocom2 = "com2"; //for Sony Mylo also
//In some UserAgents, the only clue is the manufacturer.
public static final String manuSonyEricsson = "sonyericsson";
public static final String manuericsson = "ericsson";
public static final String manuSamsung1 = "sec-sgh";
public static final String manuSony = "sony";
public static final String manuHtc = "htc"; //Popular Android and WinMo manufacturer
//In some UserAgents, the only clue is the operator.
public static final String svcDocomo = "docomo";
public static final String svcKddi = "kddi";
public static final String svcVodafone = "vodafone";
//Disambiguation strings.
public static final String disUpdate = "update"; //pda vs. update
/**
* Initialize the userAgent and httpAccept variables
*
* @param userAgent the User-Agent header
* @param httpAccept the Accept header
*/
public UAgentInfo(String userAgent, String httpAccept) {
if (userAgent != null) {
this.userAgent = userAgent.toLowerCase();
}
if (httpAccept != null) {
this.httpAccept = httpAccept.toLowerCase();
}
//Intialize key stored values.
initDeviceScan();
}
/**
* Return the lower case HTTP_USER_AGENT
*/
public String getUserAgent() {
return userAgent;
}
/**
* Return the lower case HTTP_ACCEPT
*/
public String getHttpAccept() {
return httpAccept;
}
/**
* Return whether the device is an Iphone or iPod Touch
*/
public boolean getIsIphone() {
return iphone;
}
/**
* Return whether the device is in the Iphone Tier.
*/
public boolean getIsTierIphone() {
return tierIphone;
}
/**
* Return whether the device is an Iphone or iPod Touch
*/
public boolean getIsTierRichCss() {
return tierRichCss;
}
/**
* Return whether the device is an Iphone or iPod Touch
*/
public boolean getIsTierGenericMobile() {
return tierGenericMobile;
}
/**
* Initialize Key Stored Values.
*/
public void initDeviceScan() {
this.iphone = isIphoneOrIpod();
this.tierIphone = isTierIphone();
this.tierRichCss = isTierRichCss();
this.tierGenericMobile = isTierOtherPhones();
}
/**
* Detects if the current device is an iPhone.
*/
public boolean isIphone() {
// The iPad and iPod touch say they're an iPhone! So let's disambiguate.
if (userAgent.indexOf(deviceIphone) != -1 &&
!isIpad() &&
!isIpod()) {
return true;
}
return false;
}
/**
* Detects if the current device is an iPod Touch.
*/
public boolean isIpod() {
if (userAgent.indexOf(deviceIpod) != -1) {
return true;
}
return false;
}
/**
* Detects if the current device is an iPad tablet.
*/
public boolean isIpad() {
if (userAgent.indexOf(deviceIpad) != -1
&& isWebkit()) {
return true;
}
return false;
}
/**
* Detects if the current device is an iPhone or iPod Touch.
*/
public boolean isIphoneOrIpod() {
//We repeat the searches here because some iPods may report themselves as an iPhone, which would be okay.
if (userAgent.indexOf(deviceIphone) != -1
|| userAgent.indexOf(deviceIpod) != -1) {
return true;
}
return false;
}
/**
* Detects if the current device is an Android OS-based device.
*/
public boolean isAndroid() {
if (userAgent.indexOf(deviceAndroid) != -1) {
return true;
}
return false;
}
/**
* Detects if the current device is an Android OS-based device and
* the browser is based on WebKit.
*/
public boolean isAndroidWebKit() {
if (isAndroid() && isWebkit()) {
return true;
}
return false;
}
/**
* Detects if the current browser is based on WebKit.
*/
public boolean isWebkit() {
if (userAgent.indexOf(engineWebKit) != -1) {
return true;
}
return false;
}
/**
* Detects if the current browser is the S60 Open Source Browser.
*/
public boolean isS60OssBrowser() {
//First, test for WebKit, then make sure it's either Symbian or S60.
if (isWebkit()
&& (userAgent.indexOf(deviceSymbian) != -1
|| userAgent.indexOf(deviceS60) != -1)) {
return true;
}
return false;
}
/**
*
* Detects if the current device is any Symbian OS-based device,
* including older S60, Series 70, Series 80, Series 90, and UIQ,
* or other browsers running on these devices.
*/
public boolean isSymbianOS() {
if (userAgent.indexOf(deviceSymbian) != -1
|| userAgent.indexOf(deviceS60) != -1
|| userAgent.indexOf(deviceS70) != -1
|| userAgent.indexOf(deviceS80) != -1
|| userAgent.indexOf(deviceS90) != -1) {
return true;
}
return false;
}
/**
* Detects if the current browser is a
* Windows Phone 7 device.
*/
public boolean DetectWindowsPhone7() {
if (userAgent.indexOf(deviceWinPhone7) != -1) {
return true;
}
return false;
}
/**
* Detects if the current browser is a Windows Mobile device.
* Excludes Windows Phone 7 devices.
* Focuses on Windows Mobile 6.xx and earlier.
*/
public boolean isWindowsMobile() {
//Exclude new Windows Phone 7.
if (DetectWindowsPhone7()) {
return false;
}
//Most devices use 'Windows CE', but some report 'iemobile'
// and some older ones report as 'PIE' for Pocket IE.
// We also look for instances of HTC and Windows for many of their WinMo devices.
if (userAgent.indexOf(deviceWinMob) != -1
|| userAgent.indexOf(deviceWinMob) != -1
|| userAgent.indexOf(deviceIeMob) != -1
|| userAgent.indexOf(enginePie) != -1
|| (userAgent.indexOf(manuHtc) != -1 && userAgent.indexOf(deviceWindows) != -1)
|| (isWapWml() && userAgent.indexOf(deviceWindows) != -1)) {
return true;
}
//Test for Windows Mobile PPC but not old Macintosh PowerPC.
if (userAgent.indexOf(devicePpc) != -1 &&
!(userAgent.indexOf(deviceMacPpc) != -1))
return true;
return false;
}
/**
* Detects if the current browser is a BlackBerry of some sort.
*/
public boolean isBlackBerry() {
if (userAgent.indexOf(deviceBB) != -1 || httpAccept.indexOf(vndRIM) != -1) {
return true;
}
return false;
}
/**
* Detects if the current browser is a BlackBerry device AND uses a
* WebKit-based browser. These are signatures for the new BlackBerry OS 6.
* Examples: Torch
*/
public boolean DetectBlackBerryWebKit() {
if (userAgent.indexOf(deviceBB) != -1 &&
userAgent.indexOf(engineWebKit) != -1) {
return true;
}
return false;
}
/**
* Detects if the current browser is a BlackBerry Touch
* device, such as the Storm or Torch
*/
public boolean isBlackBerryTouch() {
if (userAgent.indexOf(deviceBBStorm) != -1 ||
userAgent.indexOf(deviceBBTorch) != -1) {
return true;
}
return false;
}
/**
* Detects if the current browser is a BlackBerry device AND
* has a more capable recent browser.
* Examples, Storm, Bold, Tour, Curve2
* Excludes the new BlackBerry OS 6 browser!!
*/
public boolean isBlackBerryHigh() {
//Disambiguate for BlackBerry OS 6 (WebKit) browser
if (DetectBlackBerryWebKit())
return false;
if (isBlackBerry()) {
if (isBlackBerryTouch()
|| userAgent.indexOf(deviceBBBold) != -1
|| userAgent.indexOf(deviceBBTour) != -1
|| userAgent.indexOf(deviceBBCurve) != -1) {
return true;
} else {
return false;
}
} else {
return false;
}
}
/**
* Detects if the current browser is a BlackBerry device AND
* has an older, less capable browser.
* Examples: Pearl, 8800, Curve1
*/
public boolean isBlackBerryLow() {
if (isBlackBerry()) {
//Assume that if it's not in the High tier, then it's Low
if (isBlackBerryHigh()) {
return false;
} else {
return true;
}
} else {
return false;
}
}
/**
* Detects if the current browser is on a PalmOS device.
*/
public boolean isPalmOS() {
//Most devices nowadays report as 'Palm', but some older ones reported as Blazer or Xiino.
if (userAgent.indexOf(devicePalm) != -1
|| userAgent.indexOf(engineBlazer) != -1
|| userAgent.indexOf(engineXiino) != -1) {
//Make sure it's not WebOS first
if (isPalmWebOS()) {
return false;
} else {
return true;
}
}
return false;
}
/**
* Detects if the current browser is on a Palm device
* running the new WebOS.
*/
public boolean isPalmWebOS() {
if (userAgent.indexOf(deviceWebOS) != -1) {
return true;
}
return false;
}
/**
* Detects if the current browser is a
* Garmin Nuvifone.
*/
public boolean isGarminNuvifone() {
if (userAgent.indexOf(deviceNuvifone) != -1) {
return true;
}
return false;
}
/**
* Check to see whether the device is any device
* in the 'smartphone' category.
*/
public boolean isSmartphone() {
return (isIphoneOrIpod()
|| isS60OssBrowser()
|| isSymbianOS()
|| isAndroid()
|| isWindowsMobile()
|| DetectWindowsPhone7()
|| isBlackBerry()
|| isPalmWebOS()
|| isPalmOS()
|| isGarminNuvifone());
}
/**
* Detects whether the device is a Brew-powered device.
*/
public boolean isBrewDevice() {
if (userAgent.indexOf(deviceBrew) != -1) {
return true;
}
return false;
}
/**
* Detects the Danger Hiptop device.
*/
public boolean isDangerHiptop() {
if (userAgent.indexOf(deviceDanger) != -1
|| userAgent.indexOf(deviceHiptop) != -1) {
return true;
}
return false;
}
/**
* Detects Opera Mobile or Opera Mini.
*/
public boolean isOperaMobile() {
if (userAgent.indexOf(engineOpera) != -1
&& (userAgent.indexOf(mini) != -1
|| userAgent.indexOf(mobi) != -1)) {
return true;
}
return false;
}
/**
* Detects whether the device supports WAP or WML.
*/
public boolean isWapWml() {
if (httpAccept.indexOf(vndwap) != -1
|| httpAccept.indexOf(wml) != -1) {
return true;
}
return false;
}
/**
* Detects if the current device is an Amazon Kindle.
*/
public boolean isKindle() {
if (userAgent.indexOf(deviceKindle)!= -1) {
return true;
}
return false;
}
/**
* The quick way to is for a mobile device.
* Will probably is most recent/current mid-tier Feature Phones
* as well as smartphone-class devices. Excludes Apple iPads.
*/
public boolean isMobileQuick() {
//Let's say no if it's an iPad, which contains 'mobile' in its user agent
if (isIpad()) {
return false;
}
//Most mobile browsing is done on smartphones
if (isSmartphone()) {
return true;
}
if (isWapWml()) {
return true;
}
if (isBrewDevice()) {
return true;
}
if (isOperaMobile()) {
return true;
}
if (userAgent.indexOf(engineNetfront) != -1) {
return true;
}
if (userAgent.indexOf(engineUpBrowser) != -1) {
return true;
}
if (userAgent.indexOf(engineOpenWeb) != -1) {
return true;
}
if (isDangerHiptop()) {
return true;
}
if (isMidpCapable()) {
return true;
}
if (isMaemoTablet()) {
return true;
}
if (isArchos()) {
return true;
}
if ((userAgent.indexOf(devicePda) != -1) &&
(userAgent.indexOf(disUpdate) < 0)) //no index found
{
return true;
}
if (userAgent.indexOf(mobile) != -1) {
return true;
}
return false;
}
/**
* Detects if the current device is a Sony Playstation.
*/
public boolean isSonyPlaystation() {
if (userAgent.indexOf(devicePlaystation) != -1) {
return true;
}
return false;
}
/**
* Detects if the current device is a Nintendo game device.
*/
public boolean isNintendo() {
if (userAgent.indexOf(deviceNintendo) != -1
|| userAgent.indexOf(deviceWii) != -1
|| userAgent.indexOf(deviceNintendoDs) != -1) {
return true;
}
return false;
}
/**
* Detects if the current device is a Microsoft Xbox.
*/
public boolean isXbox() {
if (userAgent.indexOf(deviceXbox) != -1) {
return true;
}
return false;
}
/**
* Detects if the current device is an Internet-capable game console.
*/
public boolean isGameConsole() {
if (isSonyPlaystation()
|| isNintendo()
|| isXbox()) {
return true;
}
return false;
}
/**
* Detects if the current device supports MIDP, a mobile Java technology.
*/
public boolean isMidpCapable() {
if (userAgent.indexOf(deviceMidp) != -1
|| httpAccept.indexOf(deviceMidp) != -1) {
return true;
}
return false;
}
/**
* Detects if the current device is on one of the Maemo-based Nokia Internet Tablets.
*/
public boolean isMaemoTablet() {
if (userAgent.indexOf(maemo) != -1) {
return true;
} else if (userAgent.indexOf(maemoTablet) != -1
&& userAgent.indexOf(linux) != -1) {
return true;
}
return false;
}
/**
* Detects if the current device is an Archos media player/Internet tablet.
*/
public boolean isArchos() {
if (userAgent.indexOf(deviceArchos) != -1) {
return true;
}
return false;
}
/**
* Detects if the current browser is a Sony Mylo device.
*/
public boolean isSonyMylo() {
if (userAgent.indexOf(manuSony) != -1
&& (userAgent.indexOf(qtembedded) != -1
|| userAgent.indexOf(mylocom2) != -1)) {
return true;
}
return false;
}
/**
* The longer and more thorough way to is for a mobile device.
* Will probably is most feature phones,
* smartphone-class devices, Internet Tablets,
* Internet-enabled game consoles, etc.
* This ought to catch a lot of the more obscure and older devices, also --
* but no promises on thoroughness!
*/
public boolean isMobileLong() {
if (isMobileQuick()
|| isGameConsole()
|| isSonyMylo()) {
return true;
}
//is older phones from certain manufacturers and operators.
if (userAgent.indexOf(uplink) != -1) {
return true;
}
if (userAgent.indexOf(manuSonyEricsson) != -1) {
return true;
}
if (userAgent.indexOf(manuericsson) != -1) {
return true;
}
if (userAgent.indexOf(manuSamsung1) != -1) {
return true;
}
if (userAgent.indexOf(svcDocomo) != -1) {
return true;
}
if (userAgent.indexOf(svcKddi) != -1) {
return true;
}
if (userAgent.indexOf(svcVodafone) != -1) {
return true;
}
return false;
}
//*****************************
// For Mobile Web Site Design
//*****************************
/**
* The quick way to is for a tier of devices.
* This method iss for devices which can
* display iPhone-optimized web content.
* Includes iPhone, iPod Touch, Android, Palm WebOS, etc.
*/
public boolean isTierIphone() {
if (isIphoneOrIpod()
|| isAndroid()
|| isAndroidWebKit()
|| DetectWindowsPhone7()
|| DetectBlackBerryWebKit()
|| isPalmWebOS()
|| isGarminNuvifone()
|| isMaemoTablet()) {
return true;
}
return false;
}
/**
* The quick way to is for a tier of devices.
* This method iss for devices which are likely to be capable
* of viewing CSS content optimized for the iPhone,
* but may not necessarily support JavaScript.
* Excludes all iPhone Tier devices.
*/
public boolean isTierRichCss() {
//The following devices are explicitly ok.
//Note: 'High' BlackBerry devices ONLY
if (isMobileQuick()
&& (isWebkit()
|| isS60OssBrowser()
|| isBlackBerryHigh()
|| isWindowsMobile()
|| userAgent.indexOf(engineTelecaQ) != -1)) {
return true;
} else {
return false;
}
}
/**
* The quick way to is for a tier of devices.
* This method iss for all other types of phones,
* but excludes the iPhone and RichCSS Tier devices.
*/
public boolean isTierOtherPhones() {
if (isMobileQuick() && (!isTierIphone()) && (!isTierRichCss())) {
return true;
}
return false;
}
}