/*
* Copyright (C) 2008 The Android Open Source Project
*
* 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.
*/
package com.android.locationtracker;
import com.android.locationtracker.data.DateUtils;
import com.android.locationtracker.data.TrackerDataHelper;
import com.android.locationtracker.data.TrackerListHelper;
import android.app.AlertDialog;
import android.app.ListActivity;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.content.Intent;
import android.database.Cursor;
import android.location.LocationManager;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.widget.Toast;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
/**
* Activity for location tracker service
*
* Contains facilities for starting and
* stopping location tracker service, as well as displaying the current location
* data
*
* Future enhancements:
* - export data as dB
* - enable/disable "start service" and "stop service" menu items as
* appropriate
*/
public class TrackerActivity extends ListActivity {
static final String LOG_TAG = "LocationTracker";
private TrackerListHelper mDataHelper;
/**
* Retrieves and displays the currently logged location data from file
*
* @param icicle
*/
@Override
protected void onCreate(Bundle icicle) {
super.onCreate(icicle);
mDataHelper = new TrackerListHelper(this);
mDataHelper.bindListUI(R.layout.entrylist_item);
}
/**
* Builds the menu
*
* @param menu - menu to add items to
*/
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater menuInflater = getMenuInflater();
menuInflater.inflate(R.menu.menu, menu);
return true;
}
/**
* Handles menu item selection
*
* @param item - the selected menu item
*/
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.start_service_menu: {
startService(new Intent(TrackerActivity.this,
TrackerService.class));
break;
}
case R.id.stop_service_menu: {
stopService(new Intent(TrackerActivity.this,
TrackerService.class));
break;
}
case R.id.settings_menu: {
launchSettings();
break;
}
case R.id.export_kml: {
exportKML();
break;
}
case R.id.export_csv: {
exportCSV();
break;
}
case R.id.clear_data_menu: {
clearData();
break;
}
}
return super.onOptionsItemSelected(item);
}
private void clearData() {
Runnable clearAction = new Runnable() {
public void run() {
TrackerDataHelper helper =
new TrackerDataHelper(TrackerActivity.this);
helper.deleteAll();
}
};
showConfirm(R.string.delete_confirm, clearAction);
}
private void showConfirm(int textId, final Runnable onConfirmAction) {
AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(this);
dialogBuilder.setTitle(R.string.confirm_title);
dialogBuilder.setMessage(textId);
dialogBuilder.setPositiveButton(android.R.string.ok,
new OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
onConfirmAction.run();
}
});
dialogBuilder.setNegativeButton(android.R.string.cancel,
new OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
// do nothing
}
});
dialogBuilder.show();
}
private void exportCSV() {
String exportFileName = getUniqueFileName("csv");
exportFile(null, exportFileName, new TrackerDataHelper(this,
TrackerDataHelper.CSV_FORMATTER));
}
private void exportKML() {
String exportFileName = getUniqueFileName(
LocationManager.NETWORK_PROVIDER + ".kml");
exportFile(LocationManager.NETWORK_PROVIDER, exportFileName,
new TrackerDataHelper(this, TrackerDataHelper.KML_FORMATTER));
exportFileName = getUniqueFileName(
LocationManager.GPS_PROVIDER + ".kml");
exportFile(LocationManager.GPS_PROVIDER, exportFileName,
new TrackerDataHelper(this, TrackerDataHelper.KML_FORMATTER));
}
private void exportFile(String tagFilter,
String exportFileName,
TrackerDataHelper trackerData) {
BufferedWriter exportWriter = null;
Cursor cursor = trackerData.query(tagFilter);
try {
exportWriter = new BufferedWriter(new FileWriter(exportFileName));
exportWriter.write(trackerData.getOutputHeader());
String line = null;
while ((line = trackerData.getNextOutput(cursor)) != null) {
exportWriter.write(line);
}
exportWriter.write(trackerData.getOutputFooter());
Toast.makeText(this, "Successfully exported data to " +
exportFileName, Toast.LENGTH_SHORT).show();
} catch (IOException e) {
Toast.makeText(this, "Error exporting file: " +
e.getLocalizedMessage(), Toast.LENGTH_SHORT).show();
Log.e(LOG_TAG, "Error exporting file", e);
} finally {
closeWriter(exportWriter);
if (cursor != null) {
cursor.close();
}
}
}
private void closeWriter(Writer exportWriter) {
if (exportWriter != null) {
try {
exportWriter.close();
} catch (IOException e) {
Log.e(LOG_TAG, "error closing file", e);
}
}
}
private String getUniqueFileName(String ext) {
File dir = new File(Environment.getExternalStorageDirectory() + "/locationtracker");
if (!dir.exists()) {
dir.mkdir();
}
return dir + "/tracking-" + DateUtils.getCurrentTimestamp() + "." + ext;
}
private void launchSettings() {
Intent settingsIntent = new Intent();
settingsIntent.setClass(this, SettingsActivity.class);
startActivity(settingsIntent);
}
}