You are here

function _mobile_tools_is_mobile_device in Mobile Tools 6

Same name and namespace in other branches
  1. 6.3 mobile_tools.module \_mobile_tools_is_mobile_device()

Default implementation of hook_is_mobile_device()

Return value

$device The $device object

2 calls to _mobile_tools_is_mobile_device()
cache_rewrite_cid in ./mobile_tools_cache.inc
Rewriting the cid support the usage of caching with mobile tools when using theme switching for several device groups
mobile_tools_is_mobile_device in ./mobile_tools.module
Detect the device

File

./mobile_tools.module, line 325
Mobile Tools provides a range of functionality assisting in creating a mobile Drupal site . this functionality contains:

Code

function _mobile_tools_is_mobile_device() {
  $mobile_browser = array(
    'type' => 'desktop',
    'group' => '',
  );

  // set mobile browser as FALSE till we can prove otherwise
  if (array_key_exists('HTTP_USER_AGENT', $_SERVER)) {
    $user_agent = $_SERVER['HTTP_USER_AGENT'];
  }
  else {
    return FALSE;
  }

  // get the content accept value
  // FIXME: this should be cleaned to ensure no nefarious input gets executed
  if (array_key_exists('HTTP_ACCEPT', $_SERVER)) {
    $accept = $_SERVER['HTTP_ACCEPT'];
  }
  else {
    $accept = '';
  }
  switch (TRUE) {
    case FALSE !== stripos($user_agent, 'ipad'):
      $mobile_browser = array(
        'type' => 'desktop',
        'group' => 'ipad',
      );
      break;
    case FALSE !== stripos($user_agent, 'ipod'):

      // we find the words iphone or ipod in the user agent
      $mobile_browser = array(
        'type' => 'mobile',
        'group' => 'ipod',
      );

      // mobile browser is either TRUE or FALSE depending on the setting of iphone when calling the function
      break;

    // break out and skip the rest if we've had a match on the iphone or ipod
    case FALSE !== stripos($user_agent, 'iphone'):

      // we find the words iphone or ipod in the user agent
      $mobile_browser = array(
        'type' => 'mobile',
        'group' => 'iphone',
      );
      break;
    case FALSE !== stripos($user_agent, 'android'):

      // we find android in the user agent
      $mobile_browser = array(
        'type' => 'mobile',
        'group' => 'android',
      );

      // mobile browser is either TRUE or FALSE depending on the setting of android when calling the function
      break;

    // break out and skip the rest if we've had a match on android
    case FALSE !== stripos($user_agent, 'opera mini'):

      // we find opera mini in the user agent
      $mobile_browser = array(
        'type' => 'mobile',
        'group' => 'opera_mini',
      );

      // mobile browser is either TRUE or FALSE depending on the setting of opera when calling the function
      break;

    // break out and skip the rest if we've had a match on opera
    case FALSE !== stripos($user_agent, 'blackberry'):

      // we find blackberry in the user agent
      $mobile_browser = array(
        'type' => 'mobile',
        'group' => 'blackberry',
      );

      // mobile browser is either TRUE or FALSE depending on the setting of blackberry when calling the function
      break;

    // break out and skip the rest if we've had a match on blackberry
    case preg_match('/(up.browser|up.link|mmp|symbian|smartphone|midp|wap|vodafone|o2|pocket|kindle|mobile|pda|psp|treo)/i', $user_agent):

      // check if any of the values listed create a match on the user agent - these are some of the most common terms used in agents to identify them as being mobile devices - the i at the end makes it case insensitive
      $mobile_browser = array(
        'type' => 'mobile',
        'group' => '',
      );

      // set mobile browser to TRUE
      break;

    // break out and skip the rest if we've preg_match on the user agent returned TRUE
    case strpos($accept, 'text/vnd.wap.wml') > 0 || strpos($accept, 'application/vnd.wap.xhtml+xml') > 0:

      // is the device showing signs of support for text/vnd.wap.wml or application/vnd.wap.xhtml+xml
      $mobile_browser = array(
        'type' => 'mobile',
        'group' => '',
      );

      // set mobile browser to TRUE
      break;

    // break out and skip the rest if we've had a match on the content accept headers
    case isset($_SERVER['HTTP_X_WAP_PROFILE']) || isset($_SERVER['HTTP_PROFILE']):

      // is the device giving us a HTTP_X_WAP_PROFILE or HTTP_PROFILE header - only mobile devices would do this
      $mobile_browser = array(
        'type' => 'mobile',
        'group' => '',
      );

      // set mobile browser to TRUE
      break;

    // break out and skip the final step if we've had a return TRUE on the mobile specfic headers
    case in_array(strtolower(substr($user_agent, 0, 4)), array(
      '1207' => '1207',
      '3gso' => '3gso',
      '4thp' => '4thp',
      '501i' => '501i',
      '502i' => '502i',
      '503i' => '503i',
      '504i' => '504i',
      '505i' => '505i',
      '506i' => '506i',
      '6310' => '6310',
      '6590' => '6590',
      '770s' => '770s',
      '802s' => '802s',
      'a wa' => 'a wa',
      'acer' => 'acer',
      'acs-' => 'acs-',
      'airn' => 'airn',
      'alav' => 'alav',
      'asus' => 'asus',
      'attw' => 'attw',
      'au-m' => 'au-m',
      'aur ' => 'aur ',
      'aus ' => 'aus ',
      'abac' => 'abac',
      'acoo' => 'acoo',
      'aiko' => 'aiko',
      'alco' => 'alco',
      'alca' => 'alca',
      'amoi' => 'amoi',
      'anex' => 'anex',
      'anny' => 'anny',
      'anyw' => 'anyw',
      'aptu' => 'aptu',
      'arch' => 'arch',
      'argo' => 'argo',
      'bell' => 'bell',
      'bird' => 'bird',
      'bw-n' => 'bw-n',
      'bw-u' => 'bw-u',
      'beck' => 'beck',
      'benq' => 'benq',
      'bilb' => 'bilb',
      'blac' => 'blac',
      'c55/' => 'c55/',
      'cdm-' => 'cdm-',
      'chtm' => 'chtm',
      'capi' => 'capi',
      'comp' => 'comp',
      'cond' => 'cond',
      'craw' => 'craw',
      'dall' => 'dall',
      'dbte' => 'dbte',
      'dc-s' => 'dc-s',
      'dica' => 'dica',
      'ds-d' => 'ds-d',
      'ds12' => 'ds12',
      'dait' => 'dait',
      'devi' => 'devi',
      'dmob' => 'dmob',
      'doco' => 'doco',
      'dopo' => 'dopo',
      'el49' => 'el49',
      'erk0' => 'erk0',
      'esl8' => 'esl8',
      'ez40' => 'ez40',
      'ez60' => 'ez60',
      'ez70' => 'ez70',
      'ezos' => 'ezos',
      'ezze' => 'ezze',
      'elai' => 'elai',
      'emul' => 'emul',
      'eric' => 'eric',
      'ezwa' => 'ezwa',
      'fake' => 'fake',
      'fly-' => 'fly-',
      'fly_' => 'fly_',
      'g-mo' => 'g-mo',
      'g1 u' => 'g1 u',
      'g560' => 'g560',
      'gf-5' => 'gf-5',
      'grun' => 'grun',
      'gene' => 'gene',
      'go.w' => 'go.w',
      'good' => 'good',
      'grad' => 'grad',
      'hcit' => 'hcit',
      'hd-m' => 'hd-m',
      'hd-p' => 'hd-p',
      'hd-t' => 'hd-t',
      'hei-' => 'hei-',
      'hp i' => 'hp i',
      'hpip' => 'hpip',
      'hs-c' => 'hs-c',
      'htc ' => 'htc ',
      'htc-' => 'htc-',
      'htca' => 'htca',
      'htcg' => 'htcg',
      'htcp' => 'htcp',
      'htcs' => 'htcs',
      'htct' => 'htct',
      'htc_' => 'htc_',
      'haie' => 'haie',
      'hita' => 'hita',
      'huaw' => 'huaw',
      'hutc' => 'hutc',
      'i-20' => 'i-20',
      'i-go' => 'i-go',
      'i-ma' => 'i-ma',
      'i230' => 'i230',
      'iac' => 'iac',
      'iac-' => 'iac-',
      'iac/' => 'iac/',
      'ig01' => 'ig01',
      'im1k' => 'im1k',
      'inno' => 'inno',
      'iris' => 'iris',
      'jata' => 'jata',
      'java' => 'java',
      'kddi' => 'kddi',
      'kgt' => 'kgt',
      'kgt/' => 'kgt/',
      'kpt ' => 'kpt ',
      'kwc-' => 'kwc-',
      'klon' => 'klon',
      'lexi' => 'lexi',
      'lg g' => 'lg g',
      'lg-a' => 'lg-a',
      'lg-b' => 'lg-b',
      'lg-c' => 'lg-c',
      'lg-d' => 'lg-d',
      'lg-f' => 'lg-f',
      'lg-g' => 'lg-g',
      'lg-k' => 'lg-k',
      'lg-l' => 'lg-l',
      'lg-m' => 'lg-m',
      'lg-o' => 'lg-o',
      'lg-p' => 'lg-p',
      'lg-s' => 'lg-s',
      'lg-t' => 'lg-t',
      'lg-u' => 'lg-u',
      'lg-w' => 'lg-w',
      'lg/k' => 'lg/k',
      'lg/l' => 'lg/l',
      'lg/u' => 'lg/u',
      'lg50' => 'lg50',
      'lg54' => 'lg54',
      'lge-' => 'lge-',
      'lge/' => 'lge/',
      'lynx' => 'lynx',
      'leno' => 'leno',
      'm1-w' => 'm1-w',
      'm3ga' => 'm3ga',
      'm50/' => 'm50/',
      'maui' => 'maui',
      'mc01' => 'mc01',
      'mc21' => 'mc21',
      'mcca' => 'mcca',
      'medi' => 'medi',
      'meri' => 'meri',
      'mio8' => 'mio8',
      'mioa' => 'mioa',
      'mo01' => 'mo01',
      'mo02' => 'mo02',
      'mode' => 'mode',
      'modo' => 'modo',
      'mot ' => 'mot ',
      'mot-' => 'mot-',
      'mt50' => 'mt50',
      'mtp1' => 'mtp1',
      'mtv ' => 'mtv ',
      'mate' => 'mate',
      'maxo' => 'maxo',
      'merc' => 'merc',
      'mits' => 'mits',
      'mobi' => 'mobi',
      'motv' => 'motv',
      'mozz' => 'mozz',
      'n100' => 'n100',
      'n101' => 'n101',
      'n102' => 'n102',
      'n202' => 'n202',
      'n203' => 'n203',
      'n300' => 'n300',
      'n302' => 'n302',
      'n500' => 'n500',
      'n502' => 'n502',
      'n505' => 'n505',
      'n700' => 'n700',
      'n701' => 'n701',
      'n710' => 'n710',
      'nec-' => 'nec-',
      'nem-' => 'nem-',
      'newg' => 'newg',
      'neon' => 'neon',
      'netf' => 'netf',
      'noki' => 'noki',
      'nzph' => 'nzph',
      'o2 x' => 'o2 x',
      'o2-x' => 'o2-x',
      'opwv' => 'opwv',
      'owg1' => 'owg1',
      'opti' => 'opti',
      'oran' => 'oran',
      'p800' => 'p800',
      'pand' => 'pand',
      'pg-1' => 'pg-1',
      'pg-2' => 'pg-2',
      'pg-3' => 'pg-3',
      'pg-6' => 'pg-6',
      'pg-8' => 'pg-8',
      'pg-c' => 'pg-c',
      'pg13' => 'pg13',
      'phil' => 'phil',
      'pn-2' => 'pn-2',
      'ppc;' => 'ppc;',
      'pt-g' => 'pt-g',
      'palm' => 'palm',
      'pana' => 'pana',
      'pire' => 'pire',
      'pock' => 'pock',
      'pose' => 'pose',
      'psio' => 'psio',
      'qa-a' => 'qa-a',
      'qc-2' => 'qc-2',
      'qc-3' => 'qc-3',
      'qc-5' => 'qc-5',
      'qc-7' => 'qc-7',
      'qc07' => 'qc07',
      'qc12' => 'qc12',
      'qc21' => 'qc21',
      'qc32' => 'qc32',
      'qc60' => 'qc60',
      'qci-' => 'qci-',
      'qwap' => 'qwap',
      'qtek' => 'qtek',
      'r380' => 'r380',
      'r600' => 'r600',
      'raks' => 'raks',
      'rim9' => 'rim9',
      'rove' => 'rove',
      's55/' => 's55/',
      'sage' => 'sage',
      'sams' => 'sams',
      'sc01' => 'sc01',
      'sch-' => 'sch-',
      'scp-' => 'scp-',
      'sdk/' => 'sdk/',
      'se47' => 'se47',
      'sec-' => 'sec-',
      'sec0' => 'sec0',
      'sec1' => 'sec1',
      'semc' => 'semc',
      'sgh-' => 'sgh-',
      'shar' => 'shar',
      'sie-' => 'sie-',
      'sk-0' => 'sk-0',
      'sl45' => 'sl45',
      'slid' => 'slid',
      'smb3' => 'smb3',
      'smt5' => 'smt5',
      'sp01' => 'sp01',
      'sph-' => 'sph-',
      'spv ' => 'spv ',
      'spv-' => 'spv-',
      'sy01' => 'sy01',
      'samm' => 'samm',
      'sany' => 'sany',
      'sava' => 'sava',
      'scoo' => 'scoo',
      'send' => 'send',
      'siem' => 'siem',
      'smar' => 'smar',
      'smit' => 'smit',
      'soft' => 'soft',
      'sony' => 'sony',
      't-mo' => 't-mo',
      't218' => 't218',
      't250' => 't250',
      't600' => 't600',
      't610' => 't610',
      't618' => 't618',
      'tcl-' => 'tcl-',
      'tdg-' => 'tdg-',
      'telm' => 'telm',
      'tim-' => 'tim-',
      'ts70' => 'ts70',
      'tsm-' => 'tsm-',
      'tsm3' => 'tsm3',
      'tsm5' => 'tsm5',
      'tx-9' => 'tx-9',
      'tagt' => 'tagt',
      'talk' => 'talk',
      'teli' => 'teli',
      'topl' => 'topl',
      'tosh' => 'tosh',
      'up.b' => 'up.b',
      'upg1' => 'upg1',
      'utst' => 'utst',
      'v400' => 'v400',
      'v750' => 'v750',
      'veri' => 'veri',
      'vk-v' => 'vk-v',
      'vk40' => 'vk40',
      'vk50' => 'vk50',
      'vk52' => 'vk52',
      'vk53' => 'vk53',
      'vm40' => 'vm40',
      'vx98' => 'vx98',
      'virg' => 'virg',
      'vite' => 'vite',
      'voda' => 'voda',
      'vulc' => 'vulc',
      'wapj' => 'wapj',
      'wapp' => 'wapp',
      'wapu' => 'wapu',
      'wapm' => 'wapm',
      'wig ' => 'wig ',
      'wapi' => 'wapi',
      'wapr' => 'wapr',
      'wapv' => 'wapv',
      'wapy' => 'wapy',
      'wapa' => 'wapa',
      'waps' => 'waps',
      'wapt' => 'wapt',
      'winc' => 'winc',
      'winw' => 'winw',
      'wonu' => 'wonu',
      'x700' => 'x700',
      'xda2' => 'xda2',
      'xdag' => 'xdag',
      'yas-' => 'yas-',
      'your' => 'your',
      'zte-' => 'zte-',
      'zeto' => 'zeto',
      'acs-' => 'acs-',
      'alav' => 'alav',
      'alca' => 'alca',
      'amoi' => 'amoi',
      'aste' => 'aste',
      'audi' => 'audi',
      'avan' => 'avan',
      'benq' => 'benq',
      'bird' => 'bird',
      'blac' => 'blac',
      'blaz' => 'blaz',
      'brew' => 'brew',
      'brvw' => 'brvw',
      'bumb' => 'bumb',
      'ccwa' => 'ccwa',
      'cell' => 'cell',
      'cldc' => 'cldc',
      'cmd-' => 'cmd-',
      'dang' => 'dang',
      'doco' => 'doco',
      'eml2' => 'eml2',
      'eric' => 'eric',
      'fetc' => 'fetc',
      'hipt' => 'hipt',
      'http' => 'http',
      'ibro' => 'ibro',
      'idea' => 'idea',
      'ikom' => 'ikom',
      'inno' => 'inno',
      'ipaq' => 'ipaq',
      'jbro' => 'jbro',
      'jemu' => 'jemu',
      'java' => 'java',
      'jigs' => 'jigs',
      'kddi' => 'kddi',
      'keji' => 'keji',
      'kyoc' => 'kyoc',
      'kyok' => 'kyok',
      'leno' => 'leno',
      'lg-c' => 'lg-c',
      'lg-d' => 'lg-d',
      'lg-g' => 'lg-g',
      'lge-' => 'lge-',
      'libw' => 'libw',
      'm-cr' => 'm-cr',
      'maui' => 'maui',
      'maxo' => 'maxo',
      'midp' => 'midp',
      'mits' => 'mits',
      'mmef' => 'mmef',
      'mobi' => 'mobi',
      'mot-' => 'mot-',
      'moto' => 'moto',
      'mwbp' => 'mwbp',
      'mywa' => 'mywa',
      'nec-' => 'nec-',
      'newt' => 'newt',
      'nok6' => 'nok6',
      'noki' => 'noki',
      'o2im' => 'o2im',
      'opwv' => 'opwv',
      'palm' => 'palm',
      'pana' => 'pana',
      'pant' => 'pant',
      'pdxg' => 'pdxg',
      'phil' => 'phil',
      'play' => 'play',
      'pluc' => 'pluc',
      'port' => 'port',
      'prox' => 'prox',
      'qtek' => 'qtek',
      'qwap' => 'qwap',
      'rozo' => 'rozo',
      'sage' => 'sage',
      'sama' => 'sama',
      'sams' => 'sams',
      'sany' => 'sany',
      'sch-' => 'sch-',
      'sec-' => 'sec-',
      'send' => 'send',
      'seri' => 'seri',
      'sgh-' => 'sgh-',
      'shar' => 'shar',
      'sie-' => 'sie-',
      'siem' => 'siem',
      'smal' => 'smal',
      'smar' => 'smar',
      'sony' => 'sony',
      'sph-' => 'sph-',
      'symb' => 'symb',
      't-mo' => 't-mo',
      'teli' => 'teli',
      'tim-' => 'tim-',
      'tosh' => 'tosh',
      'treo' => 'treo',
      'tsm-' => 'tsm-',
      'upg1' => 'upg1',
      'upsi' => 'upsi',
      'vk-v' => 'vk-v',
      'voda' => 'voda',
      'vx52' => 'vx52',
      'vx53' => 'vx53',
      'vx60' => 'vx60',
      'vx61' => 'vx61',
      'vx70' => 'vx70',
      'vx80' => 'vx80',
      'vx81' => 'vx81',
      'vx83' => 'vx83',
      'vx85' => 'vx85',
      'wap-' => 'wap-',
      'wapa' => 'wapa',
      'wapi' => 'wapi',
      'wapp' => 'wapp',
      'wapr' => 'wapr',
      'webc' => 'webc',
      'whit' => 'whit',
      'winw' => 'winw',
      'wmlb' => 'wmlb',
      'xda-' => 'xda-',
    )):

      // check against a list of trimmed user agents to see if we find a match
      if (!ereg("w3c_css_validator", strtolower($user_agent))) {
        $mobile_browser = array(
          'type' => 'mobile',
          'group' => '',
        );

        // set mobile browser to TRUE
      }
      break;
  }

  // ends the switch
  $result = $mobile_browser;
  return $result;
}