| /* |
| * 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); |
| } |
| } |