--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/javaextensions/location/tsrc/vipertest/src/ViperTest.java Tue Apr 27 16:30:29 2010 +0300
@@ -0,0 +1,567 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+import javax.microedition.midlet.*;
+import javax.microedition.lcdui.*;
+import javax.microedition.location.*;
+import java.util.*;
+
+public class ViperTest extends MIDlet implements CommandListener,
+ LocationListener
+{
+ private Command iExitCmd = new Command("Quit", Command.EXIT, 1);
+
+ private Command iSelectCmd = new Command("Choose Provider", Command.SCREEN,
+ 1);
+
+ private Command iGetLocationCmd = new Command("Get location",
+ Command.SCREEN, 1);
+
+ private Command iGetLastKnownLocationCmd = new Command(
+ "Last known location", Command.SCREEN, 1);
+
+ private Command iStartTrackingCmd = new Command("Start tracking",
+ Command.SCREEN, 1);
+
+ private Command iStopTrackingCmd = new Command("Stop tracking",
+ Command.SCREEN, 1);
+
+ private Command iGetStatusCmd = new Command("Get status", Command.SCREEN, 1);
+
+ private Command iRunTestCmd1 = new Command("Run tests", Command.SCREEN, 1);
+
+ private Command iRunTestCmd2 = new Command("Run LP tests", Command.SCREEN,
+ 1);
+
+ private Command iPreferencesCmd = new Command("Set preferences",
+ Command.SCREEN, 1);
+
+ private Display iDisplay;
+
+ private Form iForm;
+
+ private ViperPreferences iPrefs;
+
+ private ProviderSelecter iSelecter = new ProviderSelecter();
+
+ private LocationProvider iLocationProvider = null;
+
+ private static int iN = 0;
+
+ private long iLastUpdate;
+
+ private long iLastTimestamp;
+
+ public ViperTest()
+ {
+ }
+
+ protected void destroyApp(boolean unconditional)
+ {
+ System.out.println("ViperTest.destroyApp");
+ iLocationProvider = null;
+ iForm = null;
+ // iPrefs = null;
+ iDisplay = null;
+ }
+
+ protected void pauseApp()
+ {
+ System.out.println("pauseApp");
+ iDisplay.setCurrent(null);
+ }
+
+ protected void startApp()
+ {
+ iForm = new Form("ViperTest");
+ iForm.addCommand(iExitCmd);
+ iForm.addCommand(iRunTestCmd1);
+ iForm.addCommand(iRunTestCmd2);
+ iForm.addCommand(iSelectCmd);
+ iForm.addCommand(iGetLocationCmd);
+ iForm.addCommand(iGetLastKnownLocationCmd);
+ iForm.addCommand(iGetStatusCmd);
+ iForm.addCommand(iStartTrackingCmd);
+ iForm.addCommand(iPreferencesCmd);
+ iForm.append("LAPI version: "
+ + System.getProperty("microedition.location.version"));
+ iDisplay = Display.getDisplay(this);
+ iDisplay.setCurrent(iForm);
+ iForm.setCommandListener(this);
+ iPrefs = new ViperPreferences(iDisplay, iForm);
+ }
+
+ public void commandAction(Command c, Displayable d)
+ {
+ try
+ {
+ handleCommand(c);
+ }
+ catch (Exception e)
+ {
+ iForm.append("Exception: " + e);
+ }
+ }
+
+ public void locationUpdated(LocationProvider provider, Location location)
+ {
+ if (provider != iLocationProvider)
+ {
+ System.out.println("provider = " + provider);
+ System.out.println("iLocationProvider = " + iLocationProvider);
+ }
+
+ long now = System.currentTimeMillis();
+ long timeDiff = now - iLastUpdate;
+ iLastUpdate = now;
+
+ iForm.deleteAll();
+
+ iForm.append("Tracking #" + (++iN) + "\n");
+ showLocation(location);
+
+ iForm.append("Last update = " + timeDiff + " (ms) ago\n");
+
+ System.out.println("------ locationUpdated #" + iN + " ------");
+ System.out.println("Time of fix: " + time(now));
+ System.out.println("Last update = " + timeDiff + " (ms) ago");
+
+ long ts = location.getTimestamp();
+ System.out.println("Timestamp: " + time(ts));
+ if (location.isValid())
+ {
+ QualifiedCoordinates qc = location.getQualifiedCoordinates();
+ System.out.println("Lat: " + format(qc.getLatitude()) + ", Lon: "
+ + format(qc.getLongitude()));
+ System.out.println("Timestamp diff = " + (ts - iLastTimestamp)
+ + " (ms)");
+ }
+ else
+ {
+ System.out.println("Invalid location!");
+ }
+ iLastTimestamp = ts;
+ }
+
+ public void providerStateChanged(LocationProvider provider, int newState)
+ {
+ iForm.deleteAll();
+ iForm.append("State changed\n");
+ showState(newState);
+ }
+
+ private void handleCommand(Command c) throws Exception
+ {
+ iForm.deleteAll();
+
+ if (c == iExitCmd)
+ {
+ notifyDestroyed();
+ }
+ else if (c == iSelectCmd)
+ {
+ System.out.println("Choose a LocationProvider");
+ iDisplay.setCurrent(iSelecter);
+ }
+ else if (c == iPreferencesCmd)
+ {
+ iDisplay.setCurrent(iPrefs);
+ }
+ else if (c == iRunTestCmd1)
+ {
+ iForm.append("Running unit tests\n");
+ Thread t = new Thread()
+ {
+ public void run()
+ {
+ iForm.append(ViperUnitTest.run1() + "\n");
+ }
+ };
+ t.start();
+ }
+ else if (c == iRunTestCmd2)
+ {
+ iForm.append("Running LocationProvider tests\n");
+ Thread t = new Thread()
+ {
+ public void run()
+ {
+ iForm.append(ViperUnitTest.run2(iDisplay) + "\n");
+ }
+ };
+ t.start();
+ }
+ else if (c == iGetLastKnownLocationCmd)
+ {
+ iForm.append("Last known location\n");
+ Location loc = LocationProvider.getLastKnownLocation();
+ showLocation(loc);
+ }
+ else
+ {
+
+ if (iLocationProvider == null)
+ {
+ iLocationProvider = LocationProvider.getInstance(null);
+ if (iLocationProvider == null)
+ {
+ iForm.append("No location provider meets criteria\n");
+ return;
+ }
+ }
+
+ if (c == iGetStatusCmd)
+ {
+ iForm.append("Get status\n");
+ showState(iLocationProvider.getState());
+ }
+ else if (c == iGetLocationCmd)
+ {
+ iForm.append("Get location\n");
+ Location loc = iLocationProvider.getLocation(iPrefs.iTimeout);
+ showLocation(loc);
+ }
+ else if (c == iStartTrackingCmd)
+ {
+ iForm.append("Start tracking\n");
+ int interval = iPrefs.iInterval;
+ int timeout = iPrefs.iTimeout;
+ int maxage = iPrefs.iMaxAge;
+
+ iLastUpdate = System.currentTimeMillis();
+ iLocationProvider.setLocationListener(this, interval, timeout,
+ maxage);
+ iForm.addCommand(iStopTrackingCmd);
+ iForm.removeCommand(iStartTrackingCmd);
+ }
+ else if (c == iStopTrackingCmd)
+ {
+ iForm.append("Stop tracking\n");
+ iLocationProvider.setLocationListener(null, 0, 0, 0);
+ iForm.addCommand(iStartTrackingCmd);
+ iForm.removeCommand(iStopTrackingCmd);
+ }
+ }
+ }
+
+ private void showLocation(Location loc)
+ {
+ if (loc == null)
+ {
+ iForm.append("Location is null\n");
+ return;
+ }
+ else if (!loc.isValid())
+ {
+ iForm.append("Location is not valid\n");
+ return;
+ }
+
+ QualifiedCoordinates qc = loc.getQualifiedCoordinates();
+
+ iForm.append("Lat = " + format(qc.getLatitude()) + "\n");
+ iForm.append("Lon = " + format(qc.getLongitude()) + "\n");
+ iForm.append("Altitude = " + qc.getAltitude() + "\n");
+ iForm.append("Hacc = " + qc.getHorizontalAccuracy() + ", ");
+ iForm.append("Vacc = " + qc.getVerticalAccuracy() + "\n");
+
+ iForm.append("Speed = " + loc.getSpeed() + ", ");
+ iForm.append("Course = " + loc.getCourse() + "\n");
+ iForm.append("Method = " + lm(loc.getLocationMethod()) + "\n");
+
+ // DateField dateFld = new DateField("Time of fix",
+ // DateField.DATE_TIME);
+ // dateFld.setDate(new Date(loc.getTimestamp()));
+ // iForm.append(dateFld);
+ iForm.append("Timestamp = " + time(loc.getTimestamp()) + "\n");
+
+ AddressInfo addrInfo = loc.getAddressInfo();
+ if (addrInfo != null)
+ {
+ printAddress(addrInfo);
+ }
+
+ String extra = loc.getExtraInfo("application/X-jsr179-location-nmea");
+ if (extra != null)
+ {
+ System.out.println("Extra info:\n" + extra);
+ }
+ }
+
+ private String format(double aCoord)
+ {
+ // if (iPrefs.iCoordFormat > 0) {
+ // return Coordinates.convert(aCoord, iPrefs.iCoordFormat);
+ // } else {
+ return Double.toString(aCoord);
+ // }
+ }
+
+ private String lm(int aMethod)
+ {
+ String s = "";
+ if ((aMethod & Location.MTE_SATELLITE) > 0)
+ {
+ s = "Sat,";
+ }
+ if ((aMethod & Location.MTY_NETWORKBASED) > 0)
+ {
+ s += "Netw";
+ }
+ if ((aMethod & Location.MTY_TERMINALBASED) > 0)
+ {
+ s += "Term";
+ }
+ if ((aMethod & Location.MTA_ASSISTED) > 0)
+ {
+ s += ",assist";
+ }
+ if ((aMethod & Location.MTA_UNASSISTED) > 0)
+ {
+ s += ",unassist";
+ }
+ if ((aMethod & ~(Location.MTE_SATELLITE | Location.MTY_NETWORKBASED
+ | Location.MTY_TERMINALBASED | Location.MTA_ASSISTED | Location.MTA_UNASSISTED)) > 0)
+ {
+ s = "Illegal";
+ }
+ return s;
+ }
+
+ private String time(long aTimestamp)
+ {
+ Calendar cal = Calendar.getInstance();
+ cal.setTime(new Date(aTimestamp));
+ int h = cal.get(Calendar.HOUR_OF_DAY);
+ int m = cal.get(Calendar.MINUTE);
+ int s = cal.get(Calendar.SECOND);
+ int ms = cal.get(Calendar.MILLISECOND);
+ return (h < 10 ? "0" : "") + h + ":" + (m < 10 ? "0" : "") + m + ":"
+ + (s < 10 ? "0" : "") + s + "." + ms;
+ }
+
+ private void showState(int aState)
+ {
+ switch (aState)
+ {
+ case LocationProvider.AVAILABLE:
+ iForm.append("Available");
+ break;
+ case LocationProvider.TEMPORARILY_UNAVAILABLE:
+ iForm.append("Temp. unavailable");
+ break;
+ case LocationProvider.OUT_OF_SERVICE:
+ iForm.append("Out of service");
+ break;
+ default:
+ iForm.append("Unknown state");
+ break;
+ }
+ }
+
+ private void printAddress(AddressInfo a)
+ {
+ System.out.println("--- AddressInfo ---");
+ System.out.println("Floor: " + a.getField(AddressInfo.BUILDING_FLOOR));
+ System.out.println("Room: " + a.getField(AddressInfo.BUILDING_ROOM));
+ System.out.println("B name: " + a.getField(AddressInfo.BUILDING_NAME));
+ System.out.println("B zone: " + a.getField(AddressInfo.BUILDING_ZONE));
+ System.out.println("City: " + a.getField(AddressInfo.CITY));
+ System.out.println("Country: " + a.getField(AddressInfo.COUNTRY));
+ System.out.println("C code: " + a.getField(AddressInfo.COUNTRY_CODE));
+ System.out.println("County: " + a.getField(AddressInfo.COUNTY));
+ System.out.println("Xing1: " + a.getField(AddressInfo.CROSSING1));
+ System.out.println("Xing2: " + a.getField(AddressInfo.CROSSING2));
+ System.out.println("District: " + a.getField(AddressInfo.DISTRICT));
+ System.out.println("Extension: " + a.getField(AddressInfo.EXTENSION));
+ System.out.println("Phone: " + a.getField(AddressInfo.PHONE_NUMBER));
+ System.out.println("P Code: " + a.getField(AddressInfo.POSTAL_CODE));
+ System.out.println("Street: " + a.getField(AddressInfo.STREET));
+ System.out.println("State: " + a.getField(AddressInfo.STATE));
+ System.out.println("URL: " + a.getField(AddressInfo.URL));
+ }
+
+ private class ProviderSelecter extends Form implements CommandListener
+ {
+ private Command iOkCmd = new Command("OK", Command.OK, 1);
+
+ private Command iDefaultCmd = new Command("Null Criteria",
+ Command.SCREEN, 1);
+
+ private Command iNullCmd = new Command("Dereference", Command.SCREEN, 1);
+
+ private Command iGcCmd = new Command("Garbage collect", Command.SCREEN,
+ 1);
+
+ private TextField iHaccField = new TextField("Horizontal Accuracy",
+ "0", 5, TextField.NUMERIC);
+
+ private TextField iVaccField = new TextField("Vertical Accuracy", "0",
+ 5, TextField.NUMERIC);
+
+ private TextField iRespTimeField = new TextField("Response time", "0",
+ 5, TextField.NUMERIC);
+
+ private ChoiceGroup iPowerChoice = new ChoiceGroup("Power consumption",
+ Choice.POPUP, new String[] { "No requirement", "Low", "Medium",
+ "High"
+ }, null);
+
+ private ChoiceGroup iChoices = new ChoiceGroup("Choices",
+ Choice.MULTIPLE, new String[] { "AddressInfo", "Cost allowed",
+ "Altitude", "Speed + Course"
+ }, null);
+
+ ProviderSelecter()
+ {
+ super("Criteria");
+ addCommand(iOkCmd);
+ addCommand(iDefaultCmd);
+ addCommand(iNullCmd);
+ addCommand(iGcCmd);
+ setCommandListener(this);
+ append(iHaccField);
+ append(iVaccField);
+ append(iRespTimeField);
+ append(iPowerChoice);
+ append(iChoices);
+ }
+
+ public void commandAction(Command c, Displayable d)
+ {
+ if (c == iOkCmd || c == iDefaultCmd)
+ {
+ iForm.deleteAll();
+
+ try
+ {
+ LocationProvider l;
+ if (c == iOkCmd)
+ {
+ l = LocationProvider.getInstance(getCriteria());
+ }
+ else
+ {
+ l = LocationProvider.getInstance(null);
+ }
+ if (l == null)
+ {
+ iForm.append("Criteria too restrictive!\n");
+ }
+ else if (l != iLocationProvider)
+ {
+ iForm.append("New provider selected\n");
+ iLocationProvider = l;
+ }
+ }
+ catch (Exception e)
+ {
+ iForm.append("Exception: " + e);
+ }
+ }
+ else if (c == iNullCmd)
+ {
+ System.out.println("Setting LocationProvider to null");
+ iLocationProvider = null;
+ }
+ else if (c == iGcCmd)
+ {
+ System.out.println("Calling System.gc()");
+ System.gc();
+ }
+ iDisplay.setCurrent(iForm);
+ }
+
+ private Criteria getCriteria()
+ {
+ Criteria cr = new Criteria();
+ int hacc = Integer.parseInt(iHaccField.getString());
+ cr.setHorizontalAccuracy(hacc);
+
+ int vacc = Integer.parseInt(iVaccField.getString());
+ cr.setVerticalAccuracy(vacc);
+
+ int resp = Integer.parseInt(iRespTimeField.getString());
+ cr.setPreferredResponseTime(resp);
+
+ int power = iPowerChoice.getSelectedIndex();
+ cr.setPreferredPowerConsumption(power);
+
+ boolean[] flags = new boolean[4];
+ int numselected = iChoices.getSelectedFlags(flags);
+ cr.setAddressInfoRequired(flags[0]);
+ cr.setCostAllowed(flags[1]);
+ cr.setAltitudeRequired(flags[2]);
+ cr.setSpeedAndCourseRequired(flags[3]);
+
+ print(cr);
+ return cr;
+ }
+
+ void print(Criteria cr)
+ {
+ System.out.println("\n-- Criterias --");
+ int hacc = cr.getHorizontalAccuracy();
+ if (hacc != Criteria.NO_REQUIREMENT)
+ {
+ System.out.println("Required horizontal accuracy = " + hacc);
+ }
+ int vacc = cr.getVerticalAccuracy();
+ if (vacc != Criteria.NO_REQUIREMENT)
+ {
+ System.out.println("Required vertical accuracy = " + vacc);
+ }
+ int resp = cr.getPreferredResponseTime();
+ if (resp != Criteria.NO_REQUIREMENT)
+ {
+ System.out.println("Preferred response time = " + resp);
+ }
+
+ switch (cr.getPreferredPowerConsumption())
+ {
+ case Criteria.POWER_USAGE_LOW:
+ System.out.println("Low power usage wanted");
+ break;
+ case Criteria.POWER_USAGE_MEDIUM:
+ System.out.println("Medium power usage acceptable");
+ break;
+ case Criteria.POWER_USAGE_HIGH:
+ System.out.println("High power usage acceptable");
+ break;
+ }
+
+ if (cr.isAddressInfoRequired())
+ {
+ System.out.println("AddressInfo required");
+ }
+ if (!cr.isAllowedToCost())
+ {
+ System.out.println("Cost is not allowed");
+ }
+ if (cr.isAltitudeRequired())
+ {
+ System.out.println("Altitude required");
+ }
+ if (cr.isSpeedAndCourseRequired())
+ {
+ System.out.println("Speed and course info required");
+ }
+ System.out.println("---------------");
+ }
+
+ }
+
+}