X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=plugins%2FMobileProfile%2FMobileProfilePlugin.php;h=cd2531fa727a8f3b7d4d2fd41ed645a8f3d4dc7d;hb=e89107549475ee1e824bcf6f0bd66830fb724b2f;hp=90ec8129dac1a7112983550826ae85fcea6fb488;hpb=5087a24c487891f4c5bc9fe2ff65be12fa74b930;p=quix0rs-gnu-social.git diff --git a/plugins/MobileProfile/MobileProfilePlugin.php b/plugins/MobileProfile/MobileProfilePlugin.php index 90ec8129da..cd2531fa72 100644 --- a/plugins/MobileProfile/MobileProfilePlugin.php +++ b/plugins/MobileProfile/MobileProfilePlugin.php @@ -31,7 +31,7 @@ if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); } -define('PAGE_TYPE_PREFS', +define('PAGE_TYPE_PREFS_MOBILEPROFILE', 'application/vnd.wap.xhtml+xml, application/xhtml+xml, text/html;q=0.9'); require_once INSTALLDIR.'/plugins/Mobile/WAP20Plugin.php'; @@ -49,12 +49,13 @@ require_once INSTALLDIR.'/plugins/Mobile/WAP20Plugin.php'; class MobileProfilePlugin extends WAP20Plugin { - public $DTD = null; - public $serveMobile = false; + public $DTD = null; + public $serveMobile = false; + public $mobileFeatures = array(); function __construct($DTD='http://www.wapforum.org/DTD/xhtml-mobile10.dtd') { - $this->DTD = $DTD; + $this->DTD = $DTD; parent::__construct(); } @@ -62,21 +63,6 @@ class MobileProfilePlugin extends WAP20Plugin function onStartShowHTML($action) { - if (!$type) { - $httpaccept = isset($_SERVER['HTTP_ACCEPT']) ? - $_SERVER['HTTP_ACCEPT'] : null; - - $cp = common_accept_to_prefs($httpaccept); - $sp = common_accept_to_prefs(PAGE_TYPE_PREFS); - - $type = common_negotiate_type($cp, $sp); - - if (!$type) { - throw new ClientException(_('This page is not available in a '. - 'media type you accept'), 406); - } - } - // XXX: This should probably graduate to WAP20Plugin // If they are on the mobile site, serve them MP @@ -85,43 +71,80 @@ class MobileProfilePlugin extends WAP20Plugin $_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'])) { $this->serveMobile = true; - } - else { + } else { // If they like the WAP 2.0 mimetype, serve them MP if (strstr('application/vnd.wap.xhtml+xml', $type) !== false) { $this->serveMobile = true; - } - else { + } else { // If they are a mobile device that supports WAP 2.0, // serve them MP // XXX: Browser sniffing sucks // I really don't like going through this every page, - // find a better way + // perhaps use $_SESSION or cookies - // May be better to categorize the devices in terms of + // May be better to group the devices in terms of // low,mid,high-end // Or, detect the mobile devices based on their support for // MP 1.0, 1.1, or 1.2 may be ideal. Possible? - $this->mobiledevices = - array('alcatel', 'android', 'audiovox', 'au-mic,', - 'avantgo', 'blackberry', 'blazer', 'cldc-', 'danger', - 'epoc', 'ericsson', 'ericy', 'ipone', 'ipaq', 'j2me', - 'lg', 'midp-', 'mobile', 'mot', 'netfront', 'nitro', - 'nokia', 'opera mini', 'palm', 'palmsource', - 'panasonic', 'philips', 'pocketpc', 'portalmmm', - 'rover', 'samsung', 'sanyo', 'series60', 'sharp', - 'sie-', 'smartphone', 'sony', 'symbian', - 'up.browser', 'up.link', 'up.link', 'vodafone', - 'wap1', 'wap2', 'windows ce'); + $this->mobiledevices = array( + 'alcatel', + 'android', + 'audiovox', + 'au-mic,', + 'avantgo', + 'blackberry', + 'blazer', + 'cldc-', + 'danger', + 'epoc', + 'ericsson', + 'ericy', + 'iphone', + 'ipaq', + 'ipod', + 'j2me', + 'lg', + 'midp-', + 'mobile', + 'mot', + 'netfront', + 'nitro', + 'nokia', + 'opera mini', + 'palm', + 'palmsource', + 'panasonic', + 'philips', + 'pocketpc', + 'portalmmm', + 'rover', + 'samsung', + 'sanyo', + 'series60', + 'sharp', + 'sie-', + 'smartphone', + 'sony', + 'symbian', + 'up.browser', + 'up.link', + 'up.link', + 'vodafone', + 'wap1', + 'wap2', + 'windows ce' + ); $httpuseragent = strtolower($_SERVER['HTTP_USER_AGENT']); - foreach($this->mobiledevices as $md) { + foreach ($this->mobiledevices as $md) { if (strstr($httpuseragent, $md) !== false) { + $this->setMobileFeatures($httpuseragent); + $this->serveMobile = true; break; } @@ -136,8 +159,7 @@ class MobileProfilePlugin extends WAP20Plugin common_config('site', 'server'))) { // FIXME: Redirect to equivalent page on mobile site instead - header("Location: ".$this->_common_path('')); - exit(); + common_redirect($this->_common_path(''), 302); } } @@ -145,11 +167,29 @@ class MobileProfilePlugin extends WAP20Plugin return true; } + if (!$type) { + $httpaccept = isset($_SERVER['HTTP_ACCEPT']) ? + $_SERVER['HTTP_ACCEPT'] : null; + + $cp = common_accept_to_prefs($httpaccept); + $sp = common_accept_to_prefs(PAGE_TYPE_PREFS_MOBILEPROFILE); + + $type = common_negotiate_type($cp, $sp); + + if (!$type) { + throw new ClientException(_('This page is not available in a '. + 'media type you accept'), 406); + } + } + header('Content-Type: '.$type); $action->extraHeaders(); - - $action->startXML('html', + if (preg_match("/.*\/.*xml/", $type)) { + // Required for XML documents + $action->xw->startDocument('1.0', 'UTF-8'); + } + $action->xw->writeDTD('html', '-//WAPFORUM//DTD XHTML Mobile 1.0//EN', $this->DTD); @@ -162,6 +202,23 @@ class MobileProfilePlugin extends WAP20Plugin } + function setMobileFeatures($useragent) + { + $mobiledeviceInputFileType = array( + 'nokia' + ); + + $this->mobileFeatures['inputfiletype'] = false; + + foreach ($mobiledeviceInputFileType as $md) { + if (strstr($useragent, $md) !== false) { + $this->mobileFeatures['inputfiletype'] = true; + break; + } + } + } + + function onStartShowHeadElements($action) { if (!$action->serveMobile) { @@ -179,34 +236,36 @@ class MobileProfilePlugin extends WAP20Plugin function onStartShowStatusNetStyles($action) { - if (!$action->serveMobile) { + if (!$this->serveMobile) { return true; } - if (file_exists(theme_file('css/mp-screen.css'))) { + $action->cssLink('css/display.css'); + + if (file_exists(Theme::file('css/mp-screen.css'))) { $action->cssLink('css/mp-screen.css', null, 'screen'); - } - else { - $action->element('link', array('rel' => 'stylesheet', - 'type' => 'text/css', - 'href' => common_path('plugins/MobileProfile/mp-screen.css') . '?version=' . STATUSNET_VERSION, - 'media' => 'screen')); + } else { + $action->cssLink('plugins/MobileProfile/mp-screen.css',null,'screen'); } - if (file_exists(theme_file('css/mp-handheld.css'))) { + if (file_exists(Theme::file('css/mp-handheld.css'))) { $action->cssLink('css/mp-handheld.css', null, 'handheld'); - } - else { - $action->element('link', array('rel' => 'stylesheet', - 'type' => 'text/css', - 'href' => common_path('plugins/MobileProfile/mp-handheld.css') . '?version=' . STATUSNET_VERSION, - 'media' => 'handheld')); + } else { + $action->cssLink('plugins/MobileProfile/mp-handheld.css',null,'handheld'); } return false; } + function onStartShowUAStyles($action) { + if (!$this->serveMobile) { + return true; + } + + return false; + } + function onStartShowHeader($action) { if (!$this->serveMobile) { @@ -214,15 +273,120 @@ class MobileProfilePlugin extends WAP20Plugin } $action->elementStart('div', array('id' => 'header')); - $action->showLogo(); - $action->showPrimaryNav(); - $action->showSiteNotice(); + $this->_showLogo($action); + $this->_showPrimaryNav($action); if (common_logged_in()) { $action->showNoticeForm(); - } else { - $action->showAnonymousMessage(); } $action->elementEnd('div'); + + return false; + } + + + function _showLogo($action) + { + $action->elementStart('address', 'vcard'); + $action->elementStart('a', array('class' => 'url home bookmark', + 'href' => common_local_url('public'))); + if (common_config('site', 'mobilelogo') || + file_exists(Theme::file('logo.png')) || + file_exists(Theme::file('mobilelogo.png'))) { + + $action->element('img', array('class' => 'photo', + 'src' => (common_config('site', 'mobilelogo')) ? common_config('site', 'mobilelogo') : + ((file_exists(Theme::file('mobilelogo.png'))) ? (Theme::path('mobilelogo.png')) : Theme::path('logo.png')), + 'alt' => common_config('site', 'name'))); + } + $action->element('span', array('class' => 'fn org'), common_config('site', 'name')); + $action->elementEnd('a'); + $action->elementEnd('address'); + } + + + function _showPrimaryNav($action) + { + $user = common_current_user(); + $connect = ''; + if (common_config('xmpp', 'enabled')) { + $connect = 'imsettings'; + } else if (common_config('sms', 'enabled')) { + $connect = 'smssettings'; + } else if (common_config('twitter', 'enabled')) { + $connect = 'twittersettings'; + } + + $action->elementStart('ul', array('id' => 'site_nav_global_primary')); + if ($user) { + $action->menuItem(common_local_url('all', array('nickname' => $user->nickname)), + _('Home')); + $action->menuItem(common_local_url('profilesettings'), + _('Account')); + if ($connect) { + $action->menuItem(common_local_url($connect), + _('Connect')); + } + if ($user->hasRight(Right::CONFIGURESITE)) { + $action->menuItem(common_local_url('siteadminpanel'), + _('Admin'), _('Change site configuration'), false, 'nav_admin'); + } + if (common_config('invite', 'enabled')) { + $action->menuItem(common_local_url('invite'), + _('Invite')); + } + $action->menuItem(common_local_url('logout'), + _('Logout')); + } else { + if (!common_config('site', 'closed')) { + $action->menuItem(common_local_url('register'), + _('Register')); + } + $action->menuItem(common_local_url('login'), + _('Login')); + } + if ($user || !common_config('site', 'private')) { + $action->menuItem(common_local_url('peoplesearch'), + _('Search')); + } + $action->elementEnd('ul'); + } + + + function onStartShowNoticeFormData($form) + { + if (!$this->serveMobile) { + return true; + } + + $form->out->element('textarea', array('id' => 'notice_data-text', + 'cols' => 15, + 'rows' => 4, + 'name' => 'status_textarea'), + ($form->content) ? $form->content : ''); + + $contentLimit = Notice::maxContent(); + + if ($contentLimit > 0) { + $form->out->element('div', array('id' => 'notice_text-count'), + $contentLimit); + } + + if (common_config('attachments', 'uploads')) { + if ($this->mobileFeatures['inputfiletype']) { + $form->out->element('label', array('for' => 'notice_data-attach'), _('Attach')); + $form->out->element('input', array('id' => 'notice_data-attach', + 'type' => 'file', + 'name' => 'attach', + 'title' => _('Attach a file'))); + $form->out->hidden('MAX_FILE_SIZE', common_config('attachments', 'file_quota')); + } + } + if ($form->action) { + $form->out->hidden('notice_return-to', $form->action, 'returnto'); + } + $form->out->hidden('notice_in-reply-to', $form->inreplyto, 'inreplyto'); + + return false; } @@ -254,13 +418,21 @@ class MobileProfilePlugin extends WAP20Plugin $serverpart = common_config('site', 'mobileserver'); } } else { - $proto = 'http'; + $proto = 'http'; $serverpart = common_config('site', 'mobileserver'); } return $proto.'://'.$serverpart.'/'.$pathpart.$relative; } -} - -?> + function onPluginVersion(&$versions) + { + $versions[] = array('name' => 'MobileProfile', + 'version' => STATUSNET_VERSION, + 'author' => 'Sarven Capadisli', + 'homepage' => 'http://status.net/wiki/Plugin:MobileProfile', + 'rawdescription' => + _m('XHTML MobileProfile output for supporting user agents.')); + return true; + } +}