package net.armooo.locationlog;
import java.util.List;
import java.util.Formatter;
import java.util.Locale;
import net.armooo.locationlog.util.LocationDatabase;
import android.app.ListActivity;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.MenuItem.OnMenuItemClickListener;
import android.widget.AdapterView;
import android.widget.ListAdapter;
import android.widget.SimpleCursorAdapter;
import android.widget.AdapterView.OnItemClickListener;
public class LocationListActivity extends ListActivity {
private Cursor locations;
private LocationDatabase db;
private final static String RADAR_ACTION = "com.google.android.radar.SHOW_RADAR";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
db = new LocationDatabase(this);
setContentView(R.layout.list);
registerForContextMenu(this.getListView());
getListView().setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
Cursor c = (Cursor) parent.getAdapter().getItem(position);
int name_id = c.getColumnIndex(LocationDatabase.FIELD_LOCATIONS_NAME);
int latitude_id = c
.getColumnIndex(LocationDatabase.FIELD_LOCATIONS_LATITUDE);
int longitude_id = c
.getColumnIndex(LocationDatabase.FIELD_LOCATIONS_LONGITUDE);
String name = c.getString(name_id);
float latitude = c.getFloat(latitude_id);
float longitude = c.getFloat(longitude_id);
startBest(latitude, longitude, name);
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
MenuItem add = menu.add(R.string.location_add);
add.setIcon(android.R.drawable.ic_menu_add);
add.setOnMenuItemClickListener(new OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
Intent i = new Intent();
i.setClass(LocationListActivity.this, LocationActivity.class);
startActivity(i);
return true;
}
});
return true;
}
@Override
protected void onResume() {
super.onResume();
updateList();
}
@Override
protected void onStop() {
super.onStop();
if (locations != null){
locations.close();
}
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) menuInfo;
Cursor c = (Cursor) getListView().getItemAtPosition(info.position);
int id_id = c.getColumnIndex(LocationDatabase.FIELD_LOCATIONS_ID);
int name_id = c.getColumnIndex(LocationDatabase.FIELD_LOCATIONS_NAME);
int latitude_id = c.getColumnIndex(LocationDatabase.FIELD_LOCATIONS_LATITUDE);
int longitude_id = c.getColumnIndex(LocationDatabase.FIELD_LOCATIONS_LONGITUDE);
final long id = c.getLong(id_id);
final String name = c.getString(name_id);
final float latitude = c.getFloat(latitude_id);
final float longitude = c.getFloat(longitude_id);
menu.setHeaderTitle(name);
MenuItem radar = menu.add(R.string.location_radar);
radar.setEnabled(isRadarAvailable());
radar.setOnMenuItemClickListener(new OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
startRadar(latitude, longitude);
return true;
}
});
MenuItem map = menu.add(R.string.location_map);
map.setOnMenuItemClickListener(new OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
startMap(latitude, longitude, name);
return true;
}
});
MenuItem edit = menu.add(R.string.location_edit);
edit.setOnMenuItemClickListener(new OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
Intent i = new Intent();
i.setClass(LocationListActivity.this, LocationActivity.class);
i.putExtra(LocationActivity.LOCATION_ID, id);
startActivity(i);
return true;
}
});
MenuItem delete = menu.add(R.string.location_delete);
delete.setOnMenuItemClickListener(new OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
db.deleteLocation(id);
updateList();
return true;
}
});
}
private void updateList() {
if (locations != null) {
locations.close();
}
locations = db.getAllLocations();
ListAdapter adapter = new SimpleCursorAdapter(this,
android.R.layout.simple_list_item_1, locations,
new String[] { LocationDatabase.FIELD_LOCATIONS_NAME },
new int[] { android.R.id.text1 });
setListAdapter(adapter);
}
private void startRadar(float latitude, float longitude){
Intent i = new Intent(RADAR_ACTION);
i.putExtra("latitude", latitude);
i.putExtra("longitude", longitude);
startActivity(i);
}
private void startMap(float latitude, float longitude, String name){
Formatter f = new Formatter(Locale.US);
f.format("geo:0,0?q=%1$.5f,%2$.5f(%3$s)", latitude, longitude, name);
Uri uri = Uri.parse(f.toString());
Intent i = new Intent(Intent.ACTION_VIEW, uri);
startActivity(i);
}
private void startBest(float latitude, float longitude, String name){
if (isRadarAvailable()){
startRadar(latitude, longitude);
} else {
startMap(latitude, longitude, name);
}
}
private boolean isRadarAvailable(){
return isIntentAvailable(RADAR_ACTION);
}
private boolean isIntentAvailable(String action) {
PackageManager packageManager = getPackageManager();
final Intent intent = new Intent(action);
List list =
packageManager.queryIntentActivities(intent,
PackageManager.MATCH_DEFAULT_ONLY);
return list.size() > 0;
}
}