how to show geolocation map view?

You must Login before you can answer or comment on any questions.

So, I was curious on how to get the geo location map view to show up. I realize i'm supposed to use user location to true, but where would that go? I am looking at the kitchen sink geo location and have been plaing with that. I attached the code from the geolocation.js file from the kitchen sink example. Thanks for your thoughts and help in advance! - paul

~~~ function geolocation() { var win = Titanium.UI.createWindow(); win.backgroundColor = '#fff'; win.openedflag = 0 ; win.focusedflag = 0;

Ti.include("/etc/version.js");

Ti.Geolocation.preferredProvider = "gps";

if (isIPhone3_2_Plus())
{
    //NOTE: starting in 3.2+, you'll need to set the applications
    //purpose property for using Location services on iPhone
    Ti.Geolocation.purpose = "GPS demo";
}

function translateErrorCode(code) {
    if (code == null) {
        return null;
    }
    switch (code) {
        case Ti.Geolocation.ERROR_LOCATION_UNKNOWN:
            return "Location unknown";
        case Ti.Geolocation.ERROR_DENIED:
            return "Access denied";
        case Ti.Geolocation.ERROR_NETWORK:
            return "Network error";
        case Ti.Geolocation.ERROR_HEADING_FAILURE:
            return "Failure to detect heading";
        case Ti.Geolocation.ERROR_REGION_MONITORING_DENIED:
            return "Region monitoring access denied";
        case Ti.Geolocation.ERROR_REGION_MONITORING_FAILURE:
            return "Region monitoring access failure";
        case Ti.Geolocation.ERROR_REGION_MONITORING_DELAYED:
            return "Region monitoring setup delayed";
    }
}

var currentHeadingLabel = Titanium.UI.createLabel({
    text:'Current Heading (One Shot)',
    font:{fontSize:12, fontWeight:'bold'},
    color:'#111',
    top:10,
    left:10,
    height:15,
    width:300
});
win.add(currentHeadingLabel);

var currentHeading = Titanium.UI.createLabel({
    text:'Updated Heading not fired',
    font:{fontSize:12},
    color:'#444',
    top:30,
    left:10,
    height:15,
    width:300
});
win.add(currentHeading);

var updatedHeadingLabel = Titanium.UI.createLabel({
    text:'Updated Heading',
    font:{fontSize:12, fontWeight:'bold'},
    color:'#111',
    top:50,
    left:10,
    height:15,
    width:300
});
win.add(updatedHeadingLabel);

var updatedHeading = Titanium.UI.createLabel({
    text:'Updated Heading not fired',
    font:{fontSize:12},
    color:'#444',
    top:70,
    left:10,
    height:15,
    width:300
});
win.add(updatedHeading);

var updatedHeadingTime = Titanium.UI.createLabel({
    text:'',
    font:{fontSize:11},
    color:'#444',
    top:90,
    left:10,
    height:15,
    width:300
});
win.add(updatedHeadingTime);

var currentLocationLabel = Titanium.UI.createLabel({
    text:'Current Location (One Shot)',
    font:{fontSize:12, fontWeight:'bold'},
    color:'#111',
    top:110,
    left:10,
    height:15,
    width:300
});
win.add(currentLocationLabel);

var currentLocation = Titanium.UI.createLabel({
    text:'Current Location not fired',
    font:{fontSize:11},
    color:'#444',
    top:130,
    left:10,
    height:15,
    width:300
});
win.add(currentLocation);

var updatedLocationLabel = Titanium.UI.createLabel({
    text:'Updated Location',
    font:{fontSize:12, fontWeight:'bold'},
    color:'#111',
    top:150,
    left:10,
    height:15,
    width:300
});
win.add(updatedLocationLabel);

var updatedLocation = Titanium.UI.createLabel({
    text:'Updated Location not fired',
    font:{fontSize:11},
    color:'#444',
    top:170,
    left:10,
    height:15,
    width:300
});
win.add(updatedLocation);

var updatedLatitude = Titanium.UI.createLabel({
    text:'',
    font:{fontSize:11},
    color:'#444',
    top:190,
    left:10,
    height:15,
    width:300
});
win.add(updatedLatitude);

var updatedLocationAccuracy = Titanium.UI.createLabel({
    text:'',
    font:{fontSize:11},
    color:'#444',
    top:210,
    left:10,
    height:15,
    width:300
});
win.add(updatedLocationAccuracy);

var updatedLocationTime = Titanium.UI.createLabel({
    text:'',
    font:{fontSize:11},
    color:'#444',
    top:230,
    left:10,
    height:15,
    width:300
});
win.add(updatedLocationTime);



var forwardGeoLabel = Titanium.UI.createLabel({
    text:'Forward Geo (Addr->Coords)',
    font:{fontSize:12, fontWeight:'bold'},
    color:'#111',
    top:250,
    left:10,
    height:15,
    width:300
});
win.add(forwardGeoLabel);

var forwardGeo = Titanium.UI.createLabel({
    text:'',
    font:{fontSize:11},
    color:'#444',
    top:270,
    left:10,
    height:15,
    width:300
});
win.add(forwardGeo);

var reverseGeoLabel = Titanium.UI.createLabel({
    text:'Reverse Geo (Coords->Addr)',
    font:{fontSize:12, fontWeight:'bold'},
    color:'#111',
    top:290,
    left:10,
    height:15,
    width:300
});
win.add(reverseGeoLabel);

var reverseGeo = Titanium.UI.createLabel({
    text:'',
    font:{fontSize:11},
    color:'#444',
    top:310,
    left:10,
    height:15,
    width:300
});
win.add(reverseGeo);

// state vars used by resume/pause
var headingAdded = false;
var locationAdded = false;

//
//  SHOW CUSTOM ALERT IF DEVICE HAS GEO TURNED OFF
//
if (Titanium.Geolocation.locationServicesEnabled === false)
{
    Titanium.UI.createAlertDialog({title:'Kitchen Sink', message:'Your device has geo turned off - turn it on.'}).show();
}
else
{
    if (Titanium.Platform.name != 'android') {
        if(win.openedflag == 0 ){
            Ti.API.info('firing open event');
            win.fireEvent('open');
        }
        if(win.focusedflag == 0){
            Ti.API.info('firing focus event');
            win.fireEvent('focus');
        }
        var authorization = Titanium.Geolocation.locationServicesAuthorization;
        Ti.API.info('Authorization: '+authorization);
        if (authorization == Titanium.Geolocation.AUTHORIZATION_DENIED) {
            Ti.UI.createAlertDialog({
                title:'Kitchen Sink',
                message:'You have disallowed Titanium from running geolocation services.'
            }).show();
        }
        else if (authorization == Titanium.Geolocation.AUTHORIZATION_RESTRICTED) {
            Ti.UI.createAlertDialog({
                title:'Kitchen Sink',
                message:'Your system has disallowed Titanium from running geolocation services.'
            }).show();
        }
    }

    //
    // IF WE HAVE COMPASS GET THE HEADING
    //
    if (Titanium.Geolocation.hasCompass)
    {
        //
        //  TURN OFF ANNOYING COMPASS INTERFERENCE MESSAGE
        //
        Titanium.Geolocation.showCalibration = false;

        //
        // SET THE HEADING FILTER (THIS IS IN DEGREES OF ANGLE CHANGE)
        // EVENT WON'T FIRE UNLESS ANGLE CHANGE EXCEEDS THIS VALUE
        Titanium.Geolocation.headingFilter = 90;

        //
        //  GET CURRENT HEADING - THIS FIRES ONCE
        //
        Ti.Geolocation.getCurrentHeading(function(e)
        {
            if (e.error)
            {
                currentHeading.text = 'error: ' + e.error;
                Ti.API.info("Code translation: "+translateErrorCode(e.code));
                return;
            }
            var x = e.heading.x;
            var y = e.heading.y;
            var z = e.heading.z;
            var magneticHeading = e.heading.magneticHeading;
            var accuracy = e.heading.accuracy;
            var trueHeading = e.heading.trueHeading;
            var timestamp = e.heading.timestamp;

            currentHeading.text = 'x:' + x + ' y: ' + y + ' z:' + z;
            Titanium.API.info('geo - current heading: ' + new Date(timestamp) + ' x ' + x + ' y ' + y + ' z ' + z);
        });

        //
        // EVENT LISTENER FOR COMPASS EVENTS - THIS WILL FIRE REPEATEDLY (BASED ON HEADING FILTER)
        //
        var headingCallback = function(e)
        {
            if (e.error)
            {
                updatedHeading.text = 'error: ' + e.error;
                Ti.API.info("Code translation: "+translateErrorCode(e.code));
                return;
            }

            var x = e.heading.x;
            var y = e.heading.y;
            var z = e.heading.z;
            var magneticHeading = e.heading.magneticHeading;
            var accuracy = e.heading.accuracy;
            var trueHeading = e.heading.trueHeading;
            var timestamp = e.heading.timestamp;

            updatedHeading.text = 'x:' + x + ' y: ' + y + ' z:' + z;
            updatedHeadingTime.text = 'timestamp:' + new Date(timestamp);
            updatedHeading.color = 'red';
            updatedHeadingTime.color = 'red';
            setTimeout(function()
            {
                updatedHeading.color = '#444';
                updatedHeadingTime.color = '#444';

            },100);

            Titanium.API.info('geo - heading updated: ' + new Date(timestamp) + ' x ' + x + ' y ' + y + ' z ' + z);
        };
        Titanium.Geolocation.addEventListener('heading', headingCallback);
        headingAdded = true;
    }
    else
    {
        Titanium.API.info("No Compass on device");
        currentHeading.text = 'No compass available';
        updatedHeading.text = 'No compass available';
    }

    //
    //  SET ACCURACY - THE FOLLOWING VALUES ARE SUPPORTED
    //
    // Titanium.Geolocation.ACCURACY_BEST
    // Titanium.Geolocation.ACCURACY_NEAREST_TEN_METERS
    // Titanium.Geolocation.ACCURACY_HUNDRED_METERS
    // Titanium.Geolocation.ACCURACY_KILOMETER
    // Titanium.Geolocation.ACCURACY_THREE_KILOMETERS
    //
    Titanium.Geolocation.accuracy = Titanium.Geolocation.ACCURACY_BEST;

    //
    //  SET DISTANCE FILTER.  THIS DICTATES HOW OFTEN AN EVENT FIRES BASED ON THE DISTANCE THE DEVICE MOVES
    //  THIS VALUE IS IN METERS
    //
    Titanium.Geolocation.distanceFilter = 10;

    //
    // GET CURRENT POSITION - THIS FIRES ONCE
    //
    win.addEventListener('open', function() {
        win.openedflag = 1;
        Titanium.Geolocation.getCurrentPosition(function(e)
        {
            if (!e.success || e.error)
            {
                currentLocation.text = 'error: ' + JSON.stringify(e.error);
                Ti.API.info("Code translation: "+translateErrorCode(e.code));
                alert('error ' + JSON.stringify(e.error));
                return;
            }

            var longitude = e.coords.longitude;
            var latitude = e.coords.latitude;
            var altitude = e.coords.altitude;
            var heading = e.coords.heading;
            var accuracy = e.coords.accuracy;
            var speed = e.coords.speed;
            var timestamp = e.coords.timestamp;
            var altitudeAccuracy = e.coords.altitudeAccuracy;
            Ti.API.info('speed ' + speed);
            currentLocation.text = 'long:' + longitude + ' lat: ' + latitude;

            Titanium.API.info('geo - current location: ' + new Date(timestamp) + ' long ' + longitude + ' lat ' + latitude + ' accuracy ' + accuracy);
        });
    }); 

    //
    // EVENT LISTENER FOR GEO EVENTS - THIS WILL FIRE REPEATEDLY (BASED ON DISTANCE FILTER)
    //
    var locationCallback = function(e)
    {
        //Mobileweb seems to be not firing window event for some odd reason.
        //Forcing a window open and focus event.
        if(win.openedflag == 0 ){
            Ti.API.info('firing open event');
            win.fireEvent('open');
        }
        if(win.focusedflag == 0){
            Ti.API.info('firing focus event');
            win.fireEvent('focus');
        }
        if (!e.success || e.error)
        {
            updatedLocation.text = 'error:' + JSON.stringify(e.error);
            updatedLatitude.text = '';
            updatedLocationAccuracy.text = '';
            updatedLocationTime.text = '';
            Ti.API.info("Code translation: "+translateErrorCode(e.code));
            return;
        }

        var longitude = e.coords.longitude;
        var latitude = e.coords.latitude;
        var altitude = e.coords.altitude;
        var heading = e.coords.heading;
        var accuracy = e.coords.accuracy;
        var speed = e.coords.speed;
        var timestamp = e.coords.timestamp;
        var altitudeAccuracy = e.coords.altitudeAccuracy;

        //Titanium.Geolocation.distanceFilter = 100; //changed after first location event

        updatedLocation.text = 'long:' + longitude;
        updatedLatitude.text = 'lat: '+ latitude;
        updatedLocationAccuracy.text = 'accuracy:' + accuracy;
        updatedLocationTime.text = 'timestamp:' +new Date(timestamp);

        updatedLatitude.color = 'red';
        updatedLocation.color = 'red';
        updatedLocationAccuracy.color = 'red';
        updatedLocationTime.color = 'red';
        setTimeout(function()
        {
            updatedLatitude.color = '#444';
            updatedLocation.color = '#444';
            updatedLocationAccuracy.color = '#444';
            updatedLocationTime.color = '#444';

        },100);

        // reverse geo
        Titanium.Geolocation.reverseGeocoder(latitude,longitude,function(evt)
        {
            if (evt.success) {
                var places = evt.places;
                if (places && places.length) {
                    reverseGeo.text = places[0].address;
                } else {
                    reverseGeo.text = "No address found";
                }
                Ti.API.debug("reverse geolocation result = "+JSON.stringify(evt));
            }
            else {
                Ti.UI.createAlertDialog({
                    title:'Reverse geo error',
                    message:evt.error
                }).show();
                Ti.API.info("Code translation: "+translateErrorCode(e.code));
            }
        }); 

        Titanium.API.info('geo - location updated: ' + new Date(timestamp) + ' long ' + longitude + ' lat ' + latitude + ' accuracy ' + accuracy);
    };
    Titanium.Geolocation.addEventListener('location', locationCallback);
    locationAdded = true;

}

win.addEventListener('focus', function()
{
    win.focusedflag = 1;
    Ti.API.info("focus event received");
    if (!headingAdded && headingCallback) {
        Ti.API.info("adding heading callback on resume");
        Titanium.Geolocation.addEventListener('heading', headingCallback);
        headingAdded = true;
    }
    if (!locationAdded && locationCallback) {
        Ti.API.info("adding location callback on resume");
        Titanium.Geolocation.addEventListener('location', locationCallback);
        locationAdded = true;
    }


    var addr = "2065 Hamilton Avenue San Jose California 95125";

    Titanium.Geolocation.forwardGeocoder(addr,function(evt)
    {
        Ti.API.info('in forward ');
        forwardGeo.text = "lat:"+evt.latitude+", long:"+evt.longitude;
        Titanium.Geolocation.reverseGeocoder(evt.latitude,evt.longitude,function(evt)
        {
            if (evt.success) {
                var text = "";
                for (var i = 0; i < evt.places.length; i++) {
                    text += "" + i + ") " + evt.places[i].address + "\n";
                }
                Ti.API.info('Reversed forward: '+text);
            }
            else {
                Ti.UI.createAlertDialog({
                    title:'Forward geo error',
                    message:evt.error
                }).show();
                Ti.API.info("Code translation: "+translateErrorCode(e.code));
            }
        });
    });
}); 

win.addEventListener('blur', function() {
    Ti.API.info("pause event received");
    if (headingAdded) {
        Ti.API.info("removing heading callback on pause");
        Titanium.Geolocation.removeEventListener('heading', headingCallback);
        headingAdded = false;
    }
    if (locationAdded) {
        Ti.API.info("removing location callback on pause");
        Titanium.Geolocation.removeEventListener('location', locationCallback);
        locationAdded = false;
    }
});


return win;

'~~~ thanks again for your help!

2 Answers

All you're doing here is geolocation (lat and long), you don't even have a map view. Create a map view, and pass in userLocation:true when creating the map view. Thats all you have to do in order to show the current location on a map.

— answered 9 months ago by Anthony Decena
answer permalink
2 Comments
  • Aaron and anthony, thank you so much for the example and responses. Greatly appreciate it. I did have a question for you guys... It shows the location as me being in san francisco. would that work if it wrre on a true app instead of it running in the emulatot showing in san francisco? curios about that. thanks!

    ~~~ function mapview() { var win = Titanium.UI.createWindow(); var isAndroid = false; if (Titanium.Platform.name == 'android') { isAndroid = true; } var isMW = (Ti.Platform.osname === 'mobileweb'); // // CREATE ANNOTATIONS // var mountainView = Titanium.Map.createAnnotation({ latitude:37.390749, longitude:-122.081651, title:"Appcelerator Headquarters", subtitle:'Mountain View, CA', pincolor: isAndroid ? "orange" : Titanium.Map.ANNOTATION_RED, animate:true, leftButton: '/images/appcelerator_small.png', myid:1 // CUSTOM ATTRIBUTE THAT IS PASSED INTO EVENT OBJECTS }); var apple = Titanium.Map.createAnnotation({ latitude:37.33168900, longitude:-122.03073100, title:"Steve Jobs", subtitle:'Cupertino, CA', pincolor:Titanium.Map.ANNOTATION_GREEN, animate:true, rightButton: '/images/apple_logo.jpg', myid:2 // CUSTOM ATTRIBUTE THAT IS PASSED INTO EVENT OBJECTS }); var atlantaParams = { latitude:33.74511, longitude:-84.38993, title:"Atlanta, GA", subtitle:'Atlanta Braves Stadium\nfoo', animate:true, leftButton:'/images/atlanta.jpg', myid:3 // CUSTOM ATTRIBUTE THAT IS PASSED INTO EVENT OBJECTS }; if (Ti.Platform.osname !== 'mobileweb') { atlantaParams.rightButton = Titanium.UI.iPhone.SystemButton.DISCLOSURE; } if (!isAndroid) { atlantaParams.pincolor = Titanium.Map.ANNOTATION_PURPLE; } else { atlantaParams.pinImage = "/images/map-pin.png"; } var atlanta = Titanium.Map.createAnnotation(atlantaParams); // // PRE-DEFINED REGIONS // var regionAtlanta = {latitude:33.74511,longitude:-84.38993,animate:true,latitudeDelta:0.04, longitudeDelta:0.04}; var regionSV = {latitude:37.337681,longitude:-122.038193,animate:true,latitudeDelta:0.04, longitudeDelta:0.04}; // // CREATE MAP VIEW // var mapview = Titanium.Map.createView({ mapType: Titanium.Map.STANDARD_TYPE, region:{latitude:33.74511, longitude:-84.38993, latitudeDelta:0.5, longitudeDelta:0.5}, animate:true, regionFit:true, userLocation:true, annotations:[atlanta,apple] }); if (!isAndroid) { mapview.addAnnotation(atlanta); } mapview.selectAnnotation(atlanta); win.add(mapview); // // NAVBAR BUTTONS // var removeAll = null; var atl = null; var sv = null; var sat = null; var std = null; var hyb = null; var zoomin = null; var zoomout = null; var wireClickHandlers = function() { removeAll.addEventListener('click', function() { mapview.removeAllAnnotations(); }); atl.addEventListener('click', function() { // set location to atlanta mapview.setLocation(regionAtlanta); // activate annotation mapview.selectAnnotation(mapview.annotations[0].title,true); Ti.API.error("CLICKED ATL"); }); sv.addEventListener('click', function() { Ti.API.info('IN SV CHANGE'); // set location to sv mapview.setLocation(regionSV); // activate annotation mapview.selectAnnotation(mapview.annotations[1].title,true); }); sat.addEventListener('click',function() { // set map type to satellite mapview.setMapType(Titanium.Map.SATELLITE_TYPE); }); std.addEventListener('click',function() { // set map type to standard mapview.setMapType(Titanium.Map.STANDARD_TYPE); }); hyb.addEventListener('click',function() { // set map type to hybrid mapview.setMapType(Titanium.Map.HYBRID_TYPE); }); zoomin.addEventListener('click',function() { mapview.zoom(1); }); zoomout.addEventListener('click',function() { mapview.zoom(-1); }); }; if (!isAndroid) { removeAll = Titanium.UI.createButton({ style:Titanium.UI.iPhone.SystemButtonStyle.BORDERED, title:'Remove All' }); win.rightNavButton = removeAll; // // TOOLBAR BUTTONS // // button to change to ATL atl = Titanium.UI.createButton({ style:Titanium.UI.iPhone.SystemButtonStyle.BORDERED, title:'ATL' }); // activate annotation mapview.selectAnnotation(mapview.annotations[0].title,true); // button to change to SV sv = Titanium.UI.createButton({ style:Titanium.UI.iPhone.SystemButtonStyle.BORDERED, title:'SV' }); mapview.addEventListener('complete', function() { Ti.API.info("map has completed loaded region"); }); var flexSpace = Titanium.UI.createButton({ systemButton:Titanium.UI.iPhone.SystemButton.FLEXIBLE_SPACE }); // button to change map type to SAT sat = Titanium.UI.createButton({ title:'Sat', style:Titanium.UI.iPhone.SystemButtonStyle.BORDERED }); // button to change map type to STD std = Titanium.UI.createButton({ title:'Std', style:Titanium.UI.iPhone.SystemButtonStyle.BORDERED }); // button to change map type to HYBRID hyb = Titanium.UI.createButton({ title:'Hyb', style:Titanium.UI.iPhone.SystemButtonStyle.BORDERED }); // button to zoom-in zoomin = Titanium.UI.createButton({ title:'+', style:Titanium.UI.iPhone.SystemButtonStyle.BORDERED }); // button to zoom-out zoomout = Titanium.UI.createButton({ title:'-', style:Titanium.UI.iPhone.SystemButtonStyle.BORDERED }); wireClickHandlers(); win.setToolbar([flexSpace,std,flexSpace,hyb,flexSpace,sat,flexSpace,atl,flexSpace,sv,flexSpace,zoomin,flexSpace,zoomout,flexSpace]); } else { var activity = Ti.Android.currentActivity; activity.onCreateOptionsMenu = function(e) { var menu = e.menu; atl = menu.add({title : 'ATL'}); sv = menu.add({title : 'SV'}); sat = menu.add({title : 'Sat'}); std = menu.add({title : 'Std'}); hyb = menu.add({title : 'Hyb'}); zoomin = menu.add({title : "Zoom In"}); zoomout = menu.add({title : 'Zoom Out'}); removeAll = menu.add({title:'Remove All'}); wireClickHandlers(); }; } // // EVENT LISTENERS // // region change event listener mapview.addEventListener('regionChanged',function(evt) { Titanium.API.info('maps region has updated to '+evt.longitude+','+evt.latitude+','+evt.latitudeDelta+','+evt.longitudeDelta); Titanium.API.info(mapview.latitudeDelta+','+mapview.longitudeDelta); if(evt.latitudeDelta === mapview.latitudeDelta) { Titanium.API.info('latitudeDelta property matches event values'); } if(evt.longitudeDelta === mapview.longitudeDelta) { Titanium.API.info('longitudeDelta property matches event values'); } }); var annotationAdded = false; // map view click event listener mapview.addEventListener('click',function(evt) { // map event properties var annotation = evt.annotation; var title = evt.title; var clickSource = evt.clicksource; // custom annotation attribute var myid = (evt.annotation)?evt.annotation.myid:-1; Ti.API.info('mapview click clicksource = ' + clickSource); // use custom event attribute to determine if atlanta annotation was clicked if (myid == 3 && evt.clicksource == 'rightButton') { // change the annotation on the fly evt.annotation.rightView = Titanium.UI.createView({width:20,height:20,backgroundColor:'red'}); evt.annotation.leftView = Titanium.UI.createView({width:20,height:20,backgroundColor:'#336699'}); evt.annotation.title = "Atlanta?"; evt.annotation.pincolor = Titanium.Map.ANNOTATION_GREEN; evt.annotation.subtitle = 'Appcelerator used to be near here'; evt.annotation.leftButton = 'images/appcelerator_small.png'; } if (myid == 2) { if(annotationAdded === false) { mapview.addAnnotation(mountainView); annotationAdded=true; } else { mapview.removeAnnotation(mountainView); annotationAdded=false; } } }); // annotation click event listener (same as above except only fires for a given annotation) atlanta.addEventListener('click', function(evt) { // get event properties var annotation = evt.source; var clicksource = evt.clicksource; Ti.API.info('atlanta annotation click clicksource = ' + clicksource); }); apple.addEventListener('click', function(evt) { // get event properties var annotation = evt.source; var clicksource = evt.clicksource; Ti.API.info('apple annotation click clicksource = ' + clicksource); }); return win;};module.exports = mapview;

    ///////////

    — commented 9 months ago by paul wamser

  • DUDE!!!! what is this??!!

    if you were on a real device, the location would be correct

    — commented 9 months ago by Aaron Saunders

Your Answer

Think you can help? Login to answer this question!