diff --git a/plugins/player-tracker.user.js b/plugins/player-tracker.user.js index eca4bf66..a3f146ea 100644 --- a/plugins/player-tracker.user.js +++ b/plugins/player-tracker.user.js @@ -65,12 +65,14 @@ window.plugin.playerTracker.setup = function() { plugin.playerTracker.oms = new OverlappingMarkerSpiderfier(map, {keepSpiderfied: true, legWeight: 3.5}); plugin.playerTracker.oms.legColors = {'usual': '#FFFF00', 'highlighted': '#FF0000'}; - var playerPopup = new L.Popup({offset: L.point([0,-20])}); + var playerPopup = new L.Popup({offset: L.point([1,-34])}); plugin.playerTracker.oms.addListener('click', function(player) { window.renderPortalDetails(player.options.referenceToPortal); - playerPopup.setContent(player.options.desc); - playerPopup.setLatLng(player.getLatLng()); - map.openPopup(playerPopup) + if (player.options.desc) { + playerPopup.setContent(player.options.desc); + playerPopup.setLatLng(player.getLatLng()); + map.openPopup(playerPopup); + } }); plugin.playerTracker.oms.addListener('spiderfy', function(markers) { map.closePopup(); @@ -257,6 +259,8 @@ window.plugin.playerTracker.ago = function(time, now) { } window.plugin.playerTracker.drawData = function() { + var isTouchDev = window.isTouchDevice(); + var gllfe = plugin.playerTracker.getLatLngFromEvent; var polyLineByAgeEnl = [[], [], [], []]; @@ -284,42 +288,45 @@ window.plugin.playerTracker.drawData = function() { polyLineByAgeEnl[ageBucket].push(line); } + // tooltip for marker - no HYML - and not shown on touchscreen devices + var tooltip = isTouchDev ? '' : playerData.nick; + // popup for marker var evtsLength = playerData.events.length; var last = playerData.events[evtsLength-1]; var ago = plugin.playerTracker.ago; var cssClass = playerData.team === 'RESISTANCE' ? 'res' : 'enl'; - var title = '' + playerData.nick + ''; + var popup = '' + playerData.nick + ''; if(window.plugin.guessPlayerLevels !== undefined && window.plugin.guessPlayerLevels.fetchLevelByPlayer !== undefined) { var playerLevel = window.plugin.guessPlayerLevels.fetchLevelByPlayer(pguid); if(playerLevel !== undefined) { - title += 'Level ' + popup += 'Level ' + playerLevel + ' (guessed)' + ''; } else { - title += 'Level unknown' + popup += 'Level unknown' } } - title += '' + popup += '' + ago(last.time, now) + ' ago' + window.chat.getChatPortalName(last); // show previous data in tooltip if(evtsLength >= 2) { - title += ' previous locations:' + popup += ' previous locations:' + ''; } for(var i = evtsLength - 2; i >= 0 && i >= evtsLength - 10; i--) { var ev = playerData.events[i]; - title += '' + ago(ev.time, now) + '' + popup += '' + ago(ev.time, now) + '' + 'ago' + '' + window.chat.getChatPortalName(ev) + ''; } if(evtsLength >= 2) - title += ''; + popup += ''; // calculate the closest portal to the player var eventPortal = [] @@ -345,11 +352,16 @@ window.plugin.playerTracker.drawData = function() { var icon = playerData.team === 'RESISTANCE' ? new plugin.playerTracker.iconRes() : new plugin.playerTracker.iconEnl(); // as per OverlappingMarkerSpiderfier docs, click events (popups, etc) must be handled via it rather than the standard // marker click events. so store the popup text in the options, then display it in the oms click handler - var m = L.marker(gllfe(last), {icon: icon, referenceToPortal: closestPortal, opacity: absOpacity, desc: title}); + var m = L.marker(gllfe(last), {icon: icon, referenceToPortal: closestPortal, opacity: absOpacity, desc: popup, title: tooltip}); // m.bindPopup(title); m.addTo(playerData.team === 'RESISTANCE' ? plugin.playerTracker.drawnTracesRes : plugin.playerTracker.drawnTracesEnl); plugin.playerTracker.oms.addMarker(m); + + // jQueryUI doesn’t automatically notice the new markers + if (!isTouchDev) { + window.setupTooltips($(m._icon)); + } }); // draw the poly lines to the map diff --git a/website/code/mobile-download.php b/website/code/mobile-download.php index 9322a9ee..f0eb1fc3 100644 --- a/website/code/mobile-download.php +++ b/website/code/mobile-download.php @@ -19,8 +19,6 @@ function getMobileVersion ( $apkfile ) $archive = $apkinfo->getApkArchive(); $stream = $archive->getStream ( "assets/total-conversion-build.user.js" ); - if ( ! $stream ) - $stream = $archive->getStream ( "assets/iitc.js" ); if ( $stream ) { diff --git a/website/versioncheck.php b/website/versioncheck.php index 35e24574..6c9200ce 100644 --- a/website/versioncheck.php +++ b/website/versioncheck.php @@ -2,12 +2,13 @@ include_once "code/userscript.php"; include_once "code/url/url_to_absolute.php"; - +include_once "code/apk/ApkParser.php"; $response = Array(); $build = $_REQUEST['build']; +$mobile = isset($_REQUEST['mobile']) && $_REQUEST['mobile']; $details = Array ( @@ -15,23 +16,27 @@ $details = Array ( 'path' => 'release', 'name' => 'Stable release build', 'web' => 'http://iitc.jonatkins.com/?page=download', + 'mobileweb' => 'http://iitc.jonatkins.com/?page=mobile', ), 'jonatkins-test' => Array ( # public test builds 'path' => 'test', 'name' => 'Test build', 'web' => 'http://iitc.jonatkins.com/?page=test', + 'mobileweb' => 'http://iitc.jonatkins.com/?page=test#test-mobile', ), 'jonatkins-experimental' => Array ( # rarely used, for features not quite ready for 'test' 'path' => 'experimental', 'name' => 'Experimental build', 'web' => 'http://iitc.jonatkins.com/?page=test&build=experimental', + 'mobileweb' => 'http://iitc.jonatkins.com/?page=test&build=experimental#test-mobild', ), 'jonatkins-dev' => Array ( # personal 'path' => 'dev', 'name' => 'Development builds - not for public use', 'web' => 'http://iitc.jonatkins.com/?page=test&build=dev', + 'mobileweb' => 'http://iitc.jonatkins.com/?page=test&build=dev#test-mobile', ), 'local' => Array ( # not a real build, but often the default for local development @@ -50,28 +55,61 @@ if ( array_key_exists ( $build, $details ) ) $dir = $info['path']; - // load main script version - $iitc_details = loadUserScriptHeader ( "$dir/total-conversion-build.user.js" ); - $response['iitc'] = Array ( - 'version' => $iitc_details['@version'], - 'downloadUrl' => url_to_absolute ( $pageurl, "$dir/total-conversion-build.user.js" ), - 'pageUrl' => url_to_absolute ( $pageurl, $info['web'] ), - ); - - // and now the plugins - - $response['plugins'] = Array(); - - foreach ( glob ( "$dir/plugins/*.user.js" ) as $path ) + if ( $mobile ) { - $basename = basename ( $path, ".user.js" ); - $details = loadUserScriptHeader ( $path ); + $apkfile = $dir.'/IITC_Mobile-'.$dir.'.apk'; + if ( file_Exists ( $apkfile ) ) + { + $apkinfo = new ApkParser ( $apkfile ); + $manifest = $apkinfo->getManifest(); - $response['plugins'][$basename] = Array ( - 'version' => $details['@version'], - 'downloadUrl' => url_to_absolute ( $pageurl, "$dir/plugins/$basename.user.js" ), - 'pageUrl' => url_to_absolute ( $pageurl, $info['web']."#plugin-$basename" ), + $response['mobile'] = Array ( + 'versionstr' => $manifest->getVersionName(), + 'versioncode' => $manifest->getVersionCode(), + 'downloadurl' => url_to_absolute ( $pageurl, $apkfile ), + 'pageurl' => $info['mobileweb'], + ); + + $archive = $apkinfo->getApkArchive(); + $stream = $archive->getStream ( "assets/total-conversion-build.user.js" ); + if ( $stream ) + { + $header = loadUserScriptHeader ( $stream ); + $response['mobile']['iitc_version'] = $header['@version']; + } + } + else + { + $response['error'] = 'Failed to find .apk file '.$apkfile; + } + } + else + { + // desktop - .user.js scripts + + // load main script version + $iitc_details = loadUserScriptHeader ( "$dir/total-conversion-build.user.js" ); + $response['iitc'] = Array ( + 'version' => $iitc_details['@version'], + 'downloadUrl' => url_to_absolute ( $pageurl, "$dir/total-conversion-build.user.js" ), + 'pageUrl' => url_to_absolute ( $pageurl, $info['web'] ), ); + + // and now the plugins + + $response['plugins'] = Array(); + + foreach ( glob ( "$dir/plugins/*.user.js" ) as $path ) + { + $basename = basename ( $path, ".user.js" ); + $details = loadUserScriptHeader ( $path ); + + $response['plugins'][$basename] = Array ( + 'version' => $details['@version'], + 'downloadUrl' => url_to_absolute ( $pageurl, "$dir/plugins/$basename.user.js" ), + 'pageUrl' => url_to_absolute ( $pageurl, $info['web']."#plugin-$basename" ), + ); + } } }