Home | History | Annotate | Download | only in locationtracker
      1 /*
      2  * Copyright (C) 2008 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package com.android.locationtracker;
     18 
     19 import com.android.locationtracker.data.DateUtils;
     20 import com.android.locationtracker.data.TrackerDataHelper;
     21 import com.android.locationtracker.data.TrackerListHelper;
     22 
     23 import android.app.AlertDialog;
     24 import android.app.ListActivity;
     25 import android.content.DialogInterface;
     26 import android.content.DialogInterface.OnClickListener;
     27 import android.content.Intent;
     28 import android.database.Cursor;
     29 import android.location.LocationManager;
     30 import android.os.Bundle;
     31 import android.os.Environment;
     32 import android.util.Log;
     33 import android.view.Menu;
     34 import android.view.MenuInflater;
     35 import android.view.MenuItem;
     36 import android.widget.Toast;
     37 
     38 import java.io.BufferedWriter;
     39 import java.io.File;
     40 import java.io.FileWriter;
     41 import java.io.IOException;
     42 import java.io.Writer;
     43 
     44 /**
     45  * Activity for location tracker service
     46  *
     47  * Contains facilities for starting and
     48  * stopping location tracker service, as well as displaying the current location
     49  * data
     50  *
     51  * Future enhancements:
     52  *   - export data as dB
     53  *   - enable/disable "start service" and "stop service" menu items as
     54  *     appropriate
     55  */
     56 public class TrackerActivity extends ListActivity {
     57 
     58     static final String LOG_TAG = "LocationTracker";
     59 
     60     private TrackerListHelper mDataHelper;
     61 
     62     /**
     63      * Retrieves and displays the currently logged location data from file
     64      *
     65      * @param icicle
     66      */
     67     @Override
     68     protected void onCreate(Bundle icicle) {
     69         super.onCreate(icicle);
     70 
     71         mDataHelper = new TrackerListHelper(this);
     72         mDataHelper.bindListUI(R.layout.entrylist_item);
     73     }
     74 
     75     /**
     76      * Builds the menu
     77      *
     78      * @param menu - menu to add items to
     79      */
     80     @Override
     81     public boolean onCreateOptionsMenu(Menu menu) {
     82         MenuInflater menuInflater = getMenuInflater();
     83         menuInflater.inflate(R.menu.menu, menu);
     84         return true;
     85     }
     86 
     87     /**
     88      * Handles menu item selection
     89      *
     90      * @param item - the selected menu item
     91      */
     92     @Override
     93     public boolean onOptionsItemSelected(MenuItem item) {
     94         switch (item.getItemId()) {
     95             case R.id.start_service_menu: {
     96                 startService(new Intent(TrackerActivity.this,
     97                         TrackerService.class));
     98                 break;
     99             }
    100             case R.id.stop_service_menu: {
    101                 stopService(new Intent(TrackerActivity.this,
    102                         TrackerService.class));
    103                 break;
    104             }
    105             case R.id.settings_menu: {
    106                 launchSettings();
    107                 break;
    108             }
    109             case R.id.export_kml: {
    110                 exportKML();
    111                 break;
    112             }
    113             case R.id.export_csv: {
    114                 exportCSV();
    115                 break;
    116             }
    117             case R.id.clear_data_menu: {
    118                 clearData();
    119                 break;
    120             }
    121         }
    122         return super.onOptionsItemSelected(item);
    123     }
    124 
    125     private void clearData() {
    126         Runnable clearAction = new Runnable() {
    127             public void run() {
    128                 TrackerDataHelper helper =
    129                     new TrackerDataHelper(TrackerActivity.this);
    130                 helper.deleteAll();
    131             }
    132         };
    133         showConfirm(R.string.delete_confirm, clearAction);
    134     }
    135 
    136     private void showConfirm(int textId, final Runnable onConfirmAction) {
    137         AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(this);
    138         dialogBuilder.setTitle(R.string.confirm_title);
    139         dialogBuilder.setMessage(textId);
    140         dialogBuilder.setPositiveButton(android.R.string.ok,
    141                 new OnClickListener() {
    142             public void onClick(DialogInterface dialog, int which) {
    143                 onConfirmAction.run();
    144             }
    145         });
    146         dialogBuilder.setNegativeButton(android.R.string.cancel,
    147                 new OnClickListener() {
    148             public void onClick(DialogInterface dialog, int which) {
    149                 // do nothing
    150             }
    151         });
    152         dialogBuilder.show();
    153     }
    154 
    155     private void exportCSV() {
    156         String exportFileName = getUniqueFileName("csv");
    157         exportFile(null, exportFileName, new TrackerDataHelper(this,
    158                 TrackerDataHelper.CSV_FORMATTER));
    159     }
    160 
    161     private void exportKML() {
    162         String exportFileName = getUniqueFileName(
    163                 LocationManager.NETWORK_PROVIDER + ".kml");
    164         exportFile(LocationManager.NETWORK_PROVIDER, exportFileName,
    165                 new TrackerDataHelper(this, TrackerDataHelper.KML_FORMATTER));
    166         exportFileName = getUniqueFileName(
    167                 LocationManager.GPS_PROVIDER + ".kml");
    168         exportFile(LocationManager.GPS_PROVIDER, exportFileName,
    169                 new TrackerDataHelper(this, TrackerDataHelper.KML_FORMATTER));
    170     }
    171 
    172     private void exportFile(String tagFilter,
    173                             String exportFileName,
    174                             TrackerDataHelper trackerData) {
    175         BufferedWriter exportWriter = null;
    176         Cursor cursor = trackerData.query(tagFilter);
    177         try {
    178             exportWriter = new BufferedWriter(new FileWriter(exportFileName));
    179             exportWriter.write(trackerData.getOutputHeader());
    180 
    181             String line = null;
    182 
    183             while ((line = trackerData.getNextOutput(cursor)) != null) {
    184                 exportWriter.write(line);
    185             }
    186             exportWriter.write(trackerData.getOutputFooter());
    187             Toast.makeText(this, "Successfully exported data to " +
    188                     exportFileName, Toast.LENGTH_SHORT).show();
    189 
    190         } catch (IOException e) {
    191             Toast.makeText(this, "Error exporting file: " +
    192                     e.getLocalizedMessage(), Toast.LENGTH_SHORT).show();
    193 
    194             Log.e(LOG_TAG, "Error exporting file", e);
    195         } finally {
    196             closeWriter(exportWriter);
    197             if (cursor != null) {
    198                 cursor.close();
    199             }
    200         }
    201     }
    202 
    203     private void closeWriter(Writer exportWriter) {
    204         if (exportWriter != null) {
    205             try {
    206                 exportWriter.close();
    207             } catch (IOException e) {
    208                 Log.e(LOG_TAG, "error closing file", e);
    209             }
    210         }
    211     }
    212 
    213     private String getUniqueFileName(String ext) {
    214         File dir = new File(Environment.getExternalStorageDirectory() + "/locationtracker");
    215         if (!dir.exists()) {
    216             dir.mkdir();
    217         }
    218         return dir + "/tracking-" + DateUtils.getCurrentTimestamp() + "." + ext;
    219     }
    220 
    221     private void launchSettings() {
    222         Intent settingsIntent = new Intent();
    223         settingsIntent.setClass(this, SettingsActivity.class);
    224         startActivity(settingsIntent);
    225     }
    226 }
    227