/*
* LocationPickerDemo.java
*
* Copyright � 1998-2011 Research In Motion Limited
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* Note: For the sake of simplicity, this sample application may not leverage
* resource bundles and resource strings. However, it is STRONGLY recommended
* that application developers make use of the localization features available
* within the BlackBerry development platform to ensure a seamless application
* experience across a variety of languages and geographies. For more information
* on localizing your application, please refer to the BlackBerry Java Development
* Environment Development Guide associated with this release.
*/
package com.rim.samples.device.ui.locationpickerdemo;
import java.util.Enumeration;
import javax.microedition.location.Landmark;
import javax.microedition.location.QualifiedCoordinates;
import net.rim.blackberry.api.invoke.Invoke;
import net.rim.blackberry.api.invoke.MapsArguments;
import net.rim.device.api.gps.GPSInfo;
import net.rim.device.api.lbs.picker.ContactsLocationPicker;
import net.rim.device.api.lbs.picker.EnterLocationPicker;
import net.rim.device.api.lbs.picker.GPSLocationPicker;
import net.rim.device.api.lbs.picker.GeotaggedPhotoPicker;
import net.rim.device.api.lbs.picker.LocationPicker;
import net.rim.device.api.lbs.picker.MapsLocationPicker;
import net.rim.device.api.lbs.picker.RecentLocationPicker;
import net.rim.device.api.lbs.picker.SuggestedLocationPicker;
import net.rim.device.api.ui.Field;
import net.rim.device.api.ui.FieldChangeListener;
import net.rim.device.api.ui.UiApplication;
import net.rim.device.api.ui.component.ButtonField;
import net.rim.device.api.ui.component.LabelField;
import net.rim.device.api.ui.container.MainScreen;
/**
* A sample application to demonstrate the Location Picker API
*/
public class LocationPickerDemo extends UiApplication {
/**
* Entry point for application
*
* @param args
* Command line arguments (not used)
*/
public static void main(final String[] args) {
// Create a new instance of the application and make the currently
// running thread the application's event dispatch thread.
final LocationPickerDemo app = new LocationPickerDemo();
app.enterEventDispatcher();
}
/**
* Creates a new LocationPickerDemo object
*/
public LocationPickerDemo() {
pushScreen(new LocationPickerDemoScreen());
}
/**
* MainScreen class for the LocationPickerDemo application
*/
static class LocationPickerDemoScreen extends MainScreen implements
LocationPicker.Listener, FieldChangeListener {
private final LocationPicker _locationPicker;
private final ButtonField _buttonField;
private final LabelField _nameLabel;
private final LabelField _descLabel;
private final LabelField _coordLabel;
private boolean _mapsPresent = false;
/**
* Creates a new LocationPickerDemoScreen object
*/
LocationPickerDemoScreen() {
// Initialize screen
setTitle("Location Picker Demo");
_buttonField =
new ButtonField("Choose location", ButtonField.NEVER_DIRTY
| ButtonField.CONSUME_CLICK);
_buttonField.setChangeListener(this);
add(_buttonField);
_nameLabel = new LabelField();
_descLabel = new LabelField();
_coordLabel = new LabelField();
add(_nameLabel);
add(_descLabel);
add(_coordLabel);
// Define suggested locations
final Landmark[] landmarks =
new Landmark[] {
new Landmark("New York", "Times Square",
new QualifiedCoordinates(40.757682,
-73.98571, Float.NaN, Float.NaN,
Float.NaN), null),
new Landmark("New York", "Central Park",
new QualifiedCoordinates(40.783333,
-73.966667, Float.NaN, Float.NaN,
Float.NaN), null) };
int arraySize = 7; // We will create an array of pickers with a max
// size of seven
// Check for BlackBerry Maps support
LocationPicker.Picker mapsLocationPicker = null;
try {
mapsLocationPicker = MapsLocationPicker.getInstance();
_mapsPresent = true;
} catch (final IllegalStateException ise) {
arraySize--; // No maps, reduce array size
}
// Check for GPS support
final boolean gpsSupported = GPSInfo.getGPSDataSource() != null;
if (!gpsSupported) {
arraySize--; // No GPS, reduce array size
}
// Define an array containing individual picker types.
final LocationPicker.Picker[] locationPickersArray =
new LocationPicker.Picker[arraySize];
locationPickersArray[--arraySize] =
EnterLocationPicker.getInstance(false);
locationPickersArray[--arraySize] =
SuggestedLocationPicker.getInstance("App specific...",
landmarks);
locationPickersArray[--arraySize] =
RecentLocationPicker.getInstance();
locationPickersArray[--arraySize] =
ContactsLocationPicker.getInstance(false);
locationPickersArray[--arraySize] =
GeotaggedPhotoPicker.getInstance();
if (_mapsPresent) {
// Blackberry Maps is present on the device, add a
// MapsLocationPicker
locationPickersArray[--arraySize] = mapsLocationPicker;
}
if (gpsSupported) {
// GPS is supported, add a GPSLocationPicker
locationPickersArray[--arraySize] =
GPSLocationPicker.getInstance();
}
// Get a LocationPicker instance containing individual picker types
// and make this class a location picker listener.
_locationPicker = LocationPicker.getInstance(locationPickersArray);
final Enumeration globalPickers =
_locationPicker.getGlobalLocationPickers();
while (globalPickers.hasMoreElements()) {
_locationPicker
.addLocationPicker((LocationPicker.Picker) globalPickers
.nextElement());
}
_locationPicker.setListener(this);
}
/**
* @see LocationPicker.Listener#locationPicked(LocationPicker.Picker,
* Landmark)
*/
public void locationPicked(final LocationPicker.Picker picker,
final Landmark location) {
if (picker instanceof LocationPicker) {
final LocationPicker locationPicker = (LocationPicker) picker;
locationPicker.close();
}
if (location != null) {
_nameLabel.setText("Location name: " + location.getName());
_descLabel.setText("Description: " + location.getDescription());
final QualifiedCoordinates coordinates =
location.getQualifiedCoordinates();
if (coordinates != null) {
final StringBuffer buff = new StringBuffer("Coordinates: ");
final double latitude = coordinates.getLatitude();
final double longitude = coordinates.getLongitude();
buff.append("Latitude:");
buff.append(latitude);
buff.append(", Longitude: ");
buff.append(longitude);
_coordLabel.setText(buff.toString());
}
// Invoke the BlackBerry Maps application with the
// chosen location.
if (_mapsPresent) {
final Landmark[] landmark = { location };
final MapsArguments mapsArgs = new MapsArguments(landmark);
Invoke.invokeApplication(Invoke.APP_TYPE_MAPS, mapsArgs);
}
}
}
/**
* @see FieldChangeListener#fieldChanged(Field, int)
*/
public void fieldChanged(final Field field, final int context) {
if (field == _buttonField) {
// Display the location picker
_locationPicker.show();
}
}
}
}