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